Scan the client request headers and determine which debug headers they want in the response.
| 658 | // Scan the client request headers and determine which debug headers they |
| 659 | // want in the response. |
| 660 | static int |
| 661 | XScanRequestHeaders(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 |
nothing calls this directly
no test coverage detected