/* * Refreshes the header mask. Useful after httpHeaderDelAt constructs */ void httpHeaderRefreshMask(HttpHeader * hdr) { HttpHeaderPos pos = HttpHeaderInitPos; HttpHeaderEntry *e; httpHeaderMaskInit(&hdr->mask, 0); debug(55, 7) ("refreshing the mask in hdr %p\n", hdr); while ((e = httpHeaderGetEntry(hdr, &pos))) { CBIT_SET(hdr->mask, e->id); } }
void httpHeaderInitModule(void) { int i; /* check that we have enough space for masks */ assert(8 * sizeof(HttpHeaderMask) >= HDR_ENUM_END); /* all headers must be described */ assert(countof(HeadersAttrs) == HDR_ENUM_END); if (!Headers) Headers = httpHeaderBuildFieldsInfo(HeadersAttrs, HDR_ENUM_END); /* create masks */ httpHeaderMaskInit(&ListHeadersMask, 0); httpHeaderCalcMask(&ListHeadersMask, (const int *) ListHeadersArr, countof(ListHeadersArr)); httpHeaderMaskInit(&ReplyHeadersMask, 0); httpHeaderCalcMask(&ReplyHeadersMask, (const int *) ReplyHeadersArr, countof(ReplyHeadersArr)); httpHeaderCalcMask(&ReplyHeadersMask, (const int *) GeneralHeadersArr, countof(GeneralHeadersArr)); httpHeaderCalcMask(&ReplyHeadersMask, (const int *) EntityHeadersArr, countof(EntityHeadersArr)); httpHeaderMaskInit(&RequestHeadersMask, 0); httpHeaderCalcMask(&RequestHeadersMask, (const int *) RequestHeadersArr, countof(RequestHeadersArr)); httpHeaderCalcMask(&RequestHeadersMask, (const int *) GeneralHeadersArr, countof(GeneralHeadersArr)); httpHeaderCalcMask(&RequestHeadersMask, (const int *) EntityHeadersArr, countof(EntityHeadersArr)); /* init header stats */ assert(HttpHeaderStatCount == hoReply + 1); for (i = 0; i < HttpHeaderStatCount; i++) httpHeaderStatInit(HttpHeaderStats + i, HttpHeaderStats[i].label); HttpHeaderStats[hoRequest].owner_mask = &RequestHeadersMask; HttpHeaderStats[hoReply].owner_mask = &ReplyHeadersMask; #if USE_HTCP HttpHeaderStats[hoHtcpReply].owner_mask = &ReplyHeadersMask; #endif /* init dependent modules */ httpHdrCcInitModule(); /* register with cache manager */ cachemgrRegister("http_headers", "HTTP Header Statistics", httpHeaderStoreReport, 0, 1); }
/* * deletes all fields with a given name if any, returns #fields deleted; */ int httpHeaderDelByName(HttpHeader * hdr, const char *name) { int count = 0; HttpHeaderPos pos = HttpHeaderInitPos; HttpHeaderEntry *e; httpHeaderMaskInit(&hdr->mask, 0); /* temporal inconsistency */ debug(55, 7) ("deleting '%s' fields in hdr %p\n", name, hdr); while ((e = httpHeaderGetEntry(hdr, &pos))) { if (!strCaseCmp(e->name, name)) { httpHeaderDelAt(hdr, pos); count++; } else CBIT_SET(hdr->mask, e->id); } return count; }
/* module initialization */ void httpReplyInitModule(void) { httpHeaderMaskInit(&Denied304HeadersMask, 0); httpHeaderCalcMask(&Denied304HeadersMask, Denied304HeadersArr, countof(Denied304HeadersArr)); }