sinterface IWebRequest { public S uri(); public SS params(); public SS headers(); public SS files(); default public S clientIP() { ret unnull(getClientIPFromHeaders(headers())); } default public S getHeader(S name) { ret mapGet(headers(), name); } default public S domain() { ret getHeader("host"); } public S cookie(); public bool isHttps(); public bool isPost(); default S protocol() { ret isHttps() ? "https://" : "http://"; } // mark this request as no-spam (don't count towards spam limit) default void noSpam() {} default S get aka getOpt(S param) { ret mapGet(params(), param); } default S userAgent() { ret getHeader("user-agent"); } // proxy another page default virtual NanoHTTPD.Response proxy(S url, bool rewriteHost, bool rewritePort) { throw unimplemented(); } default bool uriIs(S uri) { ret eq(uri(), uri); } default bool uriIsIC(S uri) { ret eqic(uri(), uri); } default S postData() { ret mapGet(files(), "postData"); } }