You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by pa...@apache.org on 2018/02/07 22:35:24 UTC

[trafficserver] branch master updated: X-Debug: log-headers

This is an automated email from the ASF dual-hosted git repository.

paziz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 8defb3c  X-Debug: log-headers
8defb3c is described below

commit 8defb3cafe957f0ae39d297db4362f8fd57a63e0
Author: Aaron Canary <ac...@oath.com>
AuthorDate: Wed Feb 7 12:09:49 2018 -0600

    X-Debug: log-headers
    
    This tag will make the plugin output all headers to be logged for all ClientRequest, ServerRequest, ServerResponse and ClientResponse.
---
 plugins/xdebug/xdebug.cc | 86 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 86 insertions(+)

diff --git a/plugins/xdebug/xdebug.cc b/plugins/xdebug/xdebug.cc
index 223043d..82ddef9 100644
--- a/plugins/xdebug/xdebug.cc
+++ b/plugins/xdebug/xdebug.cc
@@ -17,14 +17,18 @@
  */
 
 #include <cstdlib>
+#include <stdio.h>
 #include <cstdio>
 #include <strings.h>
+#include <sstream>
 #include <cstring>
 #include <getopt.h>
 
 #include "ts/ts.h"
 #include "ts/ink_defs.h"
 
+#define DEBUG_TAG_LOG_HEADERS "xdebug.headers"
+
 static struct {
   const char *str;
   int len;
@@ -36,6 +40,7 @@ enum {
   XHEADER_X_CACHE          = 0x0010u,
   XHEADER_X_GENERATION     = 0x0020u,
   XHEADER_X_TRANSACTION_ID = 0x0040u,
+  XHEADER_X_DUMP_HEADERS   = 0x0080u,
 };
 
 static int XArgIndex             = 0;
@@ -252,6 +257,44 @@ InjectTxnUuidHeader(TSHttpTxn txn, TSMBuffer buffer, TSMLoc hdr)
   }
 }
 
+///////////////////////////////////////////////////////////////////////////
+// Dump a header on stderr, useful together with TSDebug().
+void
+log_headers(TSHttpTxn txn, TSMBuffer bufp, TSMLoc hdr_loc, const char *msg_type)
+{
+  TSIOBuffer output_buffer;
+  TSIOBufferReader reader;
+  TSIOBufferBlock block;
+  const char *block_start;
+  int64_t block_avail;
+
+  std::stringstream ss;
+  ss << "TxnID:" << TSHttpTxnIdGet(txn) << " " << msg_type << " Headers are...";
+
+  output_buffer = TSIOBufferCreate();
+  reader        = TSIOBufferReaderAlloc(output_buffer);
+
+  /* This will print  just MIMEFields and not the http request line */
+  TSMimeHdrPrint(bufp, hdr_loc, output_buffer);
+
+  /* We need to loop over all the buffer blocks, there can be more than 1 */
+  block = TSIOBufferReaderStart(reader);
+  do {
+    block_start = TSIOBufferBlockReadStart(block, reader, &block_avail);
+    if (block_avail > 0) {
+      ss << "\n" << std::string(block_start, static_cast<int>(block_avail));
+    }
+    TSIOBufferReaderConsume(reader, block_avail);
+    block = TSIOBufferReaderStart(reader);
+  } while (block && block_avail != 0);
+
+  /* Free up the TSIOBuffer that we used to print out the header */
+  TSIOBufferReaderFree(reader);
+  TSIOBufferDestroy(output_buffer);
+
+  TSDebug(DEBUG_TAG_LOG_HEADERS, "%s", ss.str().c_str());
+}
+
 static int
 XInjectResponseHeaders(TSCont /* contp */, TSEvent event, void *edata)
 {
@@ -291,6 +334,10 @@ XInjectResponseHeaders(TSCont /* contp */, TSEvent event, void *edata)
     InjectTxnUuidHeader(txn, buffer, hdr);
   }
 
+  if (xheaders & XHEADER_X_DUMP_HEADERS) {
+    log_headers(txn, buffer, hdr, "ClientResponse");
+  }
+
 done:
   TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE);
   return TS_EVENT_NONE;
@@ -347,6 +394,45 @@ XScanRequestHeaders(TSCont /* contp */, TSEvent event, void *edata)
       } else if (header_field_eq("diags", value, vsize)) {
         // Enable diagnostics for DebugTxn()'s only
         TSHttpTxnDebugSet(txn, 1);
+      } else if (header_field_eq("log-headers", value, vsize) && TSIsDebugTagSet(DEBUG_TAG_LOG_HEADERS)) {
+        xheaders |= XHEADER_X_DUMP_HEADERS;
+        log_headers(txn, buffer, hdr, "ClientRequest");
+
+        // dump on server request
+        auto send_req_dump = [](TSCont /* contp */, TSEvent event, void *edata) -> int {
+          TSHttpTxn txn = (TSHttpTxn)edata;
+          TSMBuffer buffer;
+          TSMLoc hdr;
+          if (TSHttpTxnServerReqGet(txn, &buffer, &hdr) == TS_SUCCESS) {
+            // re-add header "X-Debug: log-headers", but only once
+            TSMLoc dst = TSMimeHdrFieldFind(buffer, hdr, xDebugHeader.str, xDebugHeader.len);
+            if (dst == TS_NULL_MLOC) {
+              if (TSMimeHdrFieldCreateNamed(buffer, hdr, xDebugHeader.str, xDebugHeader.len, &dst) == TS_SUCCESS) {
+                TSReleaseAssert(TSMimeHdrFieldAppend(buffer, hdr, dst) == TS_SUCCESS);
+                TSReleaseAssert(TSMimeHdrFieldValueStringInsert(buffer, hdr, dst, 0 /* idx */, "log-headers",
+                                                                lengthof("log-headers")) == TS_SUCCESS);
+                log_headers(txn, buffer, hdr, "ServerRequest");
+              }
+            }
+          }
+          TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE);
+          return TS_EVENT_NONE;
+        };
+        TSHttpTxnHookAdd(txn, TS_HTTP_SEND_REQUEST_HDR_HOOK, TSContCreate(send_req_dump, nullptr));
+
+        // dump on server response
+        auto read_resp_dump = [](TSCont /* contp */, TSEvent event, void *edata) -> int {
+          TSHttpTxn txn = (TSHttpTxn)edata;
+          TSMBuffer buffer;
+          TSMLoc hdr;
+          if (TSHttpTxnServerRespGet(txn, &buffer, &hdr) == TS_SUCCESS) {
+            log_headers(txn, buffer, hdr, "ServerResponse");
+          }
+          TSHttpTxnReenable(txn, TS_EVENT_HTTP_CONTINUE);
+          return TS_EVENT_NONE;
+        };
+        TSHttpTxnHookAdd(txn, TS_HTTP_READ_RESPONSE_HDR_HOOK, TSContCreate(read_resp_dump, nullptr));
+
       } else {
         TSDebug("xdebug", "ignoring unrecognized debug tag '%.*s'", vsize, value);
       }

-- 
To stop receiving notification emails like this one, please contact
paziz@apache.org.