+ if (strstr(&ChrPtr(Line)[16], "gzip")) {
+ hdr->HR.gzip_ok = 1;
+ }
+}
+const char *ReqStrs[eNONE] = {
+ "GET",
+ "POST",
+ "OPTIONS",
+ "PROPFIND",
+ "PUT",
+ "DELETE",
+ "HEAD",
+ "MOVE",
+ "COPY"
+};
+
+void
+ServerStartModule_CONTEXT
+(void)
+{
+ long *v;
+ HttpReqTypes = NewHash(1, NULL);
+ HttpHeaderHandler = NewHash(1, NULL);
+
+ v = malloc(sizeof(long));
+ *v = eGET;
+ Put(HttpReqTypes, HKEY("GET"), v, NULL);
+
+ v = malloc(sizeof(long));
+ *v = ePOST;
+ Put(HttpReqTypes, HKEY("POST"), v, NULL);
+
+ v = malloc(sizeof(long));
+ *v = eOPTIONS;
+ Put(HttpReqTypes, HKEY("OPTIONS"), v, NULL);
+
+ v = malloc(sizeof(long));
+ *v = ePROPFIND;
+ Put(HttpReqTypes, HKEY("PROPFIND"), v, NULL);
+
+ v = malloc(sizeof(long));
+ *v = ePUT;
+ Put(HttpReqTypes, HKEY("PUT"), v, NULL);
+
+ v = malloc(sizeof(long));
+ *v = eDELETE;
+ Put(HttpReqTypes, HKEY("DELETE"), v, NULL);
+
+ v = malloc(sizeof(long));
+ *v = eHEAD;
+ Put(HttpReqTypes, HKEY("HEAD"), v, NULL);
+
+ v = malloc(sizeof(long));
+ *v = eMOVE;
+ Put(HttpReqTypes, HKEY("MOVE"), v, NULL);
+
+ v = malloc(sizeof(long));
+ *v = eCOPY;
+ Put(HttpReqTypes, HKEY("COPY"), v, NULL);
+}
+
+void
+ServerShutdownModule_CONTEXT
+(void)
+{
+ DeleteHash(&HttpReqTypes);
+ DeleteHash(&HttpHeaderHandler);
+}
+
+void RegisterHeaderHandler(const char *Name, long Len, Header_Evaluator F)
+{
+ OneHttpHeader *pHdr;
+ pHdr = (OneHttpHeader*) malloc(sizeof(OneHttpHeader));
+ memset(pHdr, 0, sizeof(OneHttpHeader));
+ pHdr->H = F;
+ Put(HttpHeaderHandler, Name, Len, pHdr, DestroyHttpHeaderHandler);
+}
+
+
+void
+InitModule_CONTEXT
+(void)
+{
+ RegisterHeaderHandler(HKEY("CONTENT-LENGTH"), Header_HandleContentLength);
+ RegisterHeaderHandler(HKEY("CONTENT-TYPE"), Header_HandleContentType);
+ RegisterHeaderHandler(HKEY("USER-AGENT"), Header_HandleUserAgent);
+ RegisterHeaderHandler(HKEY("X-FORWARDED-HOST"), Header_HandleXFFHost); /* Apache way... */
+ RegisterHeaderHandler(HKEY("X-REAL-IP"), Header_HandleXFFHost); /* NGinX way... */
+ RegisterHeaderHandler(HKEY("HOST"), Header_HandleHost);
+ RegisterHeaderHandler(HKEY("X-FORWARDED-FOR"), Header_HandleXFF);
+ RegisterHeaderHandler(HKEY("ACCEPT-ENCODING"), Header_HandleAcceptEncoding);
+ RegisterHeaderHandler(HKEY("IF-MODIFIED-SINCE"), Header_HandleIfModSince);
+
+ RegisterNamespace("CURRENT_USER", 0, 1, tmplput_current_user, NULL, CTX_NONE);
+ RegisterNamespace("NONCE", 0, 0, tmplput_nonce, NULL, 0);
+
+ WebcitAddUrlHandler(HKEY("404"), "", 0, do_404, ANONYMOUS|COOKIEUNNEEDED);
+/*
+ * Look for commonly-found probes of malware such as worms, viruses, trojans, and Microsoft Office.
+ * Short-circuit these requests so we don't have to send them through the full processing loop.
+ */
+ WebcitAddUrlHandler(HKEY("scripts"), "", 0, do_404, ANONYMOUS|BOGUS); /* /root.exe - Worms and trojans and viruses, oh my! */
+ WebcitAddUrlHandler(HKEY("c"), "", 0, do_404, ANONYMOUS|BOGUS); /* /winnt */
+ WebcitAddUrlHandler(HKEY("MSADC"), "", 0, do_404, ANONYMOUS|BOGUS);
+ WebcitAddUrlHandler(HKEY("_vti"), "", 0, do_404, ANONYMOUS|BOGUS); /* Broken Microsoft DAV implementation */
+ WebcitAddUrlHandler(HKEY("MSOffice"), "", 0, do_404, ANONYMOUS|BOGUS); /* Stoopid MSOffice thinks everyone is IIS */
+ WebcitAddUrlHandler(HKEY("nonexistenshit"), "", 0, do_404, ANONYMOUS|BOGUS); /* Exploit found in the wild January 2009 */
+}
+
+
+void
+HttpNewModule_CONTEXT
+(ParsedHttpHdrs *httpreq)
+{
+ httpreq->PlainArgs = NewStrBufPlain(NULL, SIZ);
+ httpreq->this_page = NewStrBufPlain(NULL, SIZ);
+}
+
+void
+HttpDetachModule_CONTEXT
+(ParsedHttpHdrs *httpreq)
+{
+ FlushStrBuf(httpreq->PlainArgs);
+ FlushStrBuf(httpreq->this_page);
+ FlushStrBuf(httpreq->PlainArgs);
+ DeleteHash(&httpreq->HTTPHeaders);
+ memset(&httpreq->HR, 0, sizeof(HdrRefs));
+}
+
+void
+HttpDestroyModule_CONTEXT
+(ParsedHttpHdrs *httpreq)
+{
+ FreeStrBuf(&httpreq->this_page);
+ FreeStrBuf(&httpreq->PlainArgs);
+ FreeStrBuf(&httpreq->this_page);
+ FreeStrBuf(&httpreq->PlainArgs);
+ DeleteHash(&httpreq->HTTPHeaders);
+