MCPcopy Create free account
hub / github.com/apache/trafficserver / XScanRequestHeaders

Function XScanRequestHeaders

plugins/xdebug/xdebug.cc:660–784  ·  view source on GitHub ↗

Scan the client request headers and determine which debug headers they want in the response.

Source from the content-addressed store, hash-verified

658// Scan the client request headers and determine which debug headers they
659// want in the response.
660static int
661XScanRequestHeaders(TSCont /* contp */, TSEvent event, void *edata)
662{
663 TSHttpTxn txn = static_cast<TSHttpTxn>(edata);
664 unsigned xheaders = 0;
665 intmax_t fwdCnt = 0;
666 TSMLoc field, next;
667 TSMBuffer buffer;
668 TSMLoc hdr;
669
670 // Make sure TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE) is called before exiting function.
671 //
672 ts::PostScript ps([=]() -> void { TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE); });
673
674 TSReleaseAssert(event == TS_EVENT_HTTP_READ_REQUEST_HDR);
675
676 if (TSHttpTxnClientReqGet(txn, &buffer, &hdr) == TS_ERROR) {
677 return TS_EVENT_NONE;
678 }
679
680 Dbg(dbg_ctl, "scanning for %s header values", xDebugHeader.str);
681
682 // Walk the X-Debug header values and determine what to inject into the response.
683 field = TSMimeHdrFieldFind(buffer, hdr, xDebugHeader.str, xDebugHeader.len);
684 while (field != TS_NULL_MLOC) {
685 int count = TSMimeHdrFieldValuesCount(buffer, hdr, field);
686
687 for (int i = 0; i < count; ++i) {
688 const char *value;
689 int vsize;
690
691 value = TSMimeHdrFieldValueStringGet(buffer, hdr, field, i, &vsize);
692 if (value == nullptr || vsize == 0) {
693 continue;
694 }
695 Dbg(dbg_ctl, "Validating value: '%.*s'", vsize, value);
696
697#define header_field_eq(name, vptr, vlen) (((int)name.size() == vlen) && (strncasecmp(name.data(), vptr, vlen) == 0))
698
699 if (header_field_eq(HEADER_NAME_X_CACHE_KEY, value, vsize)) {
700 xheaders |= XHEADER_X_CACHE_KEY & allowedHeaders;
701 } else if (header_field_eq(HEADER_NAME_X_CACHE_INFO, value, vsize)) {
702 xheaders |= XHEADER_X_CACHE_INFO & allowedHeaders;
703 } else if (header_field_eq(HEADER_NAME_X_MILESTONES, value, vsize)) {
704 xheaders |= XHEADER_X_MILESTONES & allowedHeaders;
705 } else if (header_field_eq(HEADER_NAME_X_CACHE, value, vsize)) {
706 xheaders |= XHEADER_X_CACHE & allowedHeaders;
707 } else if (header_field_eq(HEADER_NAME_X_GENERATION, value, vsize)) {
708 xheaders |= XHEADER_X_GENERATION & allowedHeaders;
709 } else if (header_field_eq(HEADER_NAME_X_TRANSACTION_ID, value, vsize)) {
710 xheaders |= XHEADER_X_TRANSACTION_ID & allowedHeaders;
711 } else if (header_field_eq(HEADER_NAME_X_REMAP, value, vsize)) {
712 xheaders |= XHEADER_X_REMAP & allowedHeaders;
713 } else if (header_field_eq(HEADER_NAME_VIA, value, vsize) && (XHEADER_VIA & allowedHeaders)) {
714 // If the client requests the Via header, enable verbose Via debugging for this transaction.
715 TSHttpTxnConfigIntSet(txn, TS_CONFIG_HTTP_INSERT_RESPONSE_VIA_STR, 3);
716 } else if (header_field_eq(HEADER_NAME_DIAGS, value, vsize) && (XHEADER_DIAGS & allowedHeaders)) {
717 // Enable diagnostics for DebugTxn()'s only

Callers

nothing calls this directly

Calls 15

TSHttpTxnReenableFunction · 0.85
TSHttpTxnClientReqGetFunction · 0.85
TSMimeHdrFieldFindFunction · 0.85
TSHttpTxnConfigIntSetFunction · 0.85
TSHttpTxnCntlSetFunction · 0.85
dataFunction · 0.85
TSTransformCreateFunction · 0.85
TSContDataSetFunction · 0.85
TSHttpTxnHookAddFunction · 0.85

Tested by

no test coverage detected