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

bcall pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/9.0.x by this push:
     new ded8113  Include start line of HTTP messages in xdebug probe output.
ded8113 is described below

commit ded8113ef350b74648984f3bbdde2469c0c8f1d1
Author: Walter Karas <wka...@verizonmedia.com>
AuthorDate: Thu Mar 12 13:42:48 2020 -0500

    Include start line of HTTP messages in xdebug probe output.
    
    (cherry picked from commit 3cbd6e14d2dd4fa8f13b866b935f3e4f93e607cc)
---
 plugins/xdebug/xdebug_headers.cc                   | 144 +++++++++++++--------
 .../gold_tests/pluginTest/xdebug/x_remap/out.gold  |  72 ++++++++---
 2 files changed, 146 insertions(+), 70 deletions(-)

diff --git a/plugins/xdebug/xdebug_headers.cc b/plugins/xdebug/xdebug_headers.cc
index aef6871..003658f 100644
--- a/plugins/xdebug/xdebug_headers.cc
+++ b/plugins/xdebug/xdebug_headers.cc
@@ -28,44 +28,88 @@
 
 #define DEBUG_TAG_LOG_HEADERS "xdebug.headers"
 
-std::string_view
-escape_char_for_json(char const &c, bool &parsing_key)
+class EscapeCharForJson
 {
-  switch (c) {
-  case '\'':
-    return {"\\\'"};
-  case '"':
-    return {"\\\""};
-  case '\\':
-    return {"\\\\"};
-  case '\b':
-    return {"\\b"};
-  case '\f':
-    return {"\\f"};
-  case '\t':
-    return {"\\t"};
-
-  // Special header reformatting
-  case '\r':
-    return {""};
-  case '\n':
-    parsing_key = true;
-    return {"',\r\n\t'"}; // replace new line with pair delimiter
-  case ':':
-    if (parsing_key) {
-      return {"' : "}; // replace colon after key with quote + colon
+public:
+  std::string_view
+  operator()(char const &c)
+  {
+    if ((_state != IN_VALUE) && ((' ' == c) || ('\t' == c))) {
+      return {""};
     }
-    return {":"};
-  case ' ':
-    if (parsing_key) {
-      parsing_key = false;
-      return {"'"}; // replace first space after the key to be a quote
+    if ((IN_NAME == _state) && (':' == c)) {
+      _state = BEFORE_VALUE;
+      return {"' : '"};
+    }
+    if ('\r' == c) {
+      return {""};
+    }
+    if ('\n' == c) {
+      std::string_view result{_after_value()};
+
+      if (BEFORE_NAME == _state) {
+        return {""};
+      } else if (BEFORE_VALUE == _state) {
+        // Failsafe -- missing value -- this should never happen.
+        result = _missing_value();
+      }
+      _state = BEFORE_NAME;
+      return result;
+    }
+    if (BEFORE_NAME == _state) {
+      _state = IN_NAME;
+    } else if (BEFORE_VALUE == _state) {
+      _state = IN_VALUE;
+    }
+    switch (c) {
+    case '\'':
+      return {"\\\'"};
+    case '"':
+      return {"\\\""};
+    case '\\':
+      return {"\\\\"};
+    case '\b':
+      return {"\\b"};
+    case '\f':
+      return {"\\f"};
+    case '\t':
+      return {"\\t"};
+    default:
+      return {&c, 1};
     }
-    return {" "};
-  default:
-    return {&c, 1};
   }
-}
+
+  // After last header line, back up and throw away everything but the closing 
quote.
+  //
+  static std::size_t
+  backup()
+  {
+    return _after_value().size() - 1;
+  }
+
+private:
+  static std::string_view
+  _missing_value()
+  {
+    return {"' : '',\n\t'"};
+  }
+
+  static std::string_view
+  _after_name()
+  {
+    return {_missing_value().data(), 5};
+  }
+
+  static std::string_view
+  _after_value()
+  {
+    return {_missing_value().data() + 5, 5};
+  }
+
+  enum _State { BEFORE_NAME, IN_NAME, BEFORE_VALUE, IN_VALUE };
+
+  _State _state{BEFORE_VALUE};
+};
 
 ///////////////////////////////////////////////////////////////////////////
 // Dump a header on stderr, useful together with TSDebug().
@@ -77,37 +121,33 @@ print_headers(TSHttpTxn txn, TSMBuffer bufp, TSMLoc 
hdr_loc, std::stringstream &
   TSIOBufferBlock block;
   const char *block_start;
   int64_t block_avail;
-  bool parsing_key    = true;
-  size_t print_rewind = ss.str().length();
-  output_buffer       = TSIOBufferCreate();
-  reader              = TSIOBufferReaderAlloc(output_buffer);
+  EscapeCharForJson escape_char_for_json;
+  output_buffer = TSIOBufferCreate();
+  reader        = TSIOBufferReaderAlloc(output_buffer);
 
-  ss << "\t'";
-  /* This will print just MIMEFields and not the http request line */
-  TSMimeHdrPrint(bufp, hdr_loc, output_buffer);
+  ss << "\t'Start-Line' : '";
+
+  // Print all message header lines.
+  TSHttpHdrPrint(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);
     for (const char *c = block_start; c < block_start + block_avail; ++c) {
-      bool was_parsing_key = parsing_key;
-      ss << escape_char_for_json(*c, parsing_key);
-      if (parsing_key && !was_parsing_key) {
-        print_rewind = ss.str().length() - 1;
-      }
+      ss << escape_char_for_json(*c);
     }
     TSIOBufferReaderConsume(reader, block_avail);
     block = TSIOBufferReaderStart(reader);
   } while (block && block_avail != 0);
 
-  ss.seekp(print_rewind);
+  ss.seekp(-escape_char_for_json.backup(), std::ios_base::end);
 
   /* 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());
+  TSDebug(DEBUG_TAG_LOG_HEADERS, "%.*s", static_cast<int>(ss.tellp()), 
ss.str().data());
 }
 
 void
@@ -128,13 +168,13 @@ print_request_headers(TSHttpTxn txn, std::stringstream 
&output)
   if (TSHttpTxnClientReqGet(txn, &buf_c, &hdr_loc) == TS_SUCCESS) {
     output << "{'type':'request', 'side':'client', 'headers': {\n";
     print_headers(txn, buf_c, hdr_loc, output);
-    output << "}}";
+    output << "\n\t}}";
     TSHandleMLocRelease(buf_c, TS_NULL_MLOC, hdr_loc);
   }
   if (TSHttpTxnServerReqGet(txn, &buf_s, &hdr_loc) == TS_SUCCESS) {
     output << ",{'type':'request', 'side':'server', 'headers': {\n";
     print_headers(txn, buf_s, hdr_loc, output);
-    output << "}}";
+    output << "\n\t}}";
     TSHandleMLocRelease(buf_s, TS_NULL_MLOC, hdr_loc);
   }
 }
@@ -147,13 +187,13 @@ print_response_headers(TSHttpTxn txn, std::stringstream 
&output)
   if (TSHttpTxnServerRespGet(txn, &buf_s, &hdr_loc) == TS_SUCCESS) {
     output << "{'type':'response', 'side':'server', 'headers': {\n";
     print_headers(txn, buf_s, hdr_loc, output);
-    output << "}},";
+    output << "\n\t}},";
     TSHandleMLocRelease(buf_s, TS_NULL_MLOC, hdr_loc);
   }
   if (TSHttpTxnClientRespGet(txn, &buf_c, &hdr_loc) == TS_SUCCESS) {
     output << "{'type':'response', 'side':'client', 'headers': {\n";
     print_headers(txn, buf_c, hdr_loc, output);
-    output << "}}";
+    output << "\n\t}}";
     TSHandleMLocRelease(buf_c, TS_NULL_MLOC, hdr_loc);
   }
 }
diff --git a/tests/gold_tests/pluginTest/xdebug/x_remap/out.gold 
b/tests/gold_tests/pluginTest/xdebug/x_remap/out.gold
index f9b673e..6712754 100644
--- a/tests/gold_tests/pluginTest/xdebug/x_remap/out.gold
+++ b/tests/gold_tests/pluginTest/xdebug/x_remap/out.gold
@@ -37,9 +37,11 @@ X-Remap: from=http://one/, to=http://127.0.0.1:SERVER_PORT/
 ``
 {'xDebugProbeAt' : '``
    'captured':[{'type':'request', 'side':'client', 'headers': {
+       'Start-Line' : 'GET http://127.0.0.1:SERVER_PORT/argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
-       'Connection' : 'close',
+       'Connection' : 'close'
        }},{'type':'request', 'side':'server', 'headers': {
+       'Start-Line' : 'GET /argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
        'Client-ip' : '127.0.0.1',
        'X-Forwarded-For' : '127.0.0.1',
@@ -54,15 +56,17 @@ X-Remap: from=http://one/, to=http://127.0.0.1:SERVER_PORT/
 
 {'xDebugProbeAt' : '``
    'captured':[{'type':'response', 'side':'server', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Connection' : 'close',
        'Date' : '``
        }},{'type':'response', 'side':'client', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Date' : '``
        'Age' : '``
        'Transfer-Encoding' : 'chunked',
        'Connection' : 'close',
        'Server' : 'ATS/``
-       'X-Remap' : 'from=http://one/, to=http://127.0.0.1:SERVER_PORT/',
+       'X-Remap' : 'from=http://one/, to=http://127.0.0.1:SERVER_PORT/'
        }}
    ]
 }
@@ -80,9 +84,11 @@ X-Remap: from=http://two/, to=http://127.0.0.1:SERVER_PORT/
 ``
 {'xDebugProbeAt' : '``
    'captured':[{'type':'request', 'side':'client', 'headers': {
+       'Start-Line' : 'GET http://127.0.0.1:SERVER_PORT/argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
-       'Connection' : 'close',
+       'Connection' : 'close'
        }},{'type':'request', 'side':'server', 'headers': {
+       'Start-Line' : 'GET /argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
        'Client-ip' : '127.0.0.1',
        'X-Forwarded-For' : '127.0.0.1',
@@ -97,15 +103,17 @@ X-Remap: from=http://two/, to=http://127.0.0.1:SERVER_PORT/
 
 {'xDebugProbeAt' : '``
    'captured':[{'type':'response', 'side':'server', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Connection' : 'close',
        'Date' : '``
        }},{'type':'response', 'side':'client', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Date' : '``
        'Age' : '``
        'Transfer-Encoding' : 'chunked',
        'Connection' : 'close',
        'Server' : 'ATS/``
-       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/',
+       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/'
        }}
    ]
 }
@@ -123,9 +131,11 @@ X-Remap: from=http://three[0-9]+/, 
to=http://127.0.0.1:SERVER_PORT/
 ``
 {'xDebugProbeAt' : '``
    'captured':[{'type':'request', 'side':'client', 'headers': {
+       'Start-Line' : 'GET http://127.0.0.1:SERVER_PORT/argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
-       'Connection' : 'close',
+       'Connection' : 'close'
        }},{'type':'request', 'side':'server', 'headers': {
+       'Start-Line' : 'GET /argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
        'Client-ip' : '127.0.0.1',
        'X-Forwarded-For' : '127.0.0.1',
@@ -140,15 +150,17 @@ X-Remap: from=http://three[0-9]+/, 
to=http://127.0.0.1:SERVER_PORT/
 
 {'xDebugProbeAt' : '``
    'captured':[{'type':'response', 'side':'server', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Connection' : 'close',
        'Date' : '``
        }},{'type':'response', 'side':'client', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Date' : '``
        'Age' : '``
        'Transfer-Encoding' : 'chunked',
        'Connection' : 'close',
        'Server' : 'ATS/``
-       'X-Remap' : 'from=http://three[0-9]+/, 
to=http://127.0.0.1:SERVER_PORT/',
+       'X-Remap' : 'from=http://three[0-9]+/, to=http://127.0.0.1:SERVER_PORT/'
        }}
    ]
 }
@@ -166,9 +178,11 @@ X-Remap: from=http://two/, to=http://127.0.0.1:SERVER_PORT/
 ``
 {'xDebugProbeAt' : '``
    'captured':[{'type':'request', 'side':'client', 'headers': {
+       'Start-Line' : 'GET http://127.0.0.1:SERVER_PORT/not_there HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
-       'Connection' : 'close',
+       'Connection' : 'close'
        }},{'type':'request', 'side':'server', 'headers': {
+       'Start-Line' : 'GET /not_there HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
        'Client-ip' : '127.0.0.1',
        'X-Forwarded-For' : '127.0.0.1',
@@ -183,16 +197,18 @@ X-Remap: from=http://two/, 
to=http://127.0.0.1:SERVER_PORT/
 
 {'xDebugProbeAt' : '``
    'captured':[{'type':'response', 'side':'server', 'headers': {
+       'Start-Line' : 'HTTP/1.1 404 Not Found',
        'Server' : 'MicroServer',
        'Connection' : 'close',
        'Date' : '``
        }},{'type':'response', 'side':'client', 'headers': {
+       'Start-Line' : 'HTTP/1.1 404 Not Found',
        'Server' : 'ATS/``
        'Date' : '``
        'Age' : '``
        'Transfer-Encoding' : 'chunked',
        'Connection' : 'close',
-       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/',
+       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/'
        }}
    ]
 }
@@ -210,10 +226,12 @@ X-Remap: from=http://two/, 
to=http://127.0.0.1:SERVER_PORT/
 ``
 {'xDebugProbeAt' : '``
    'captured':[{'type':'request', 'side':'client', 'headers': {
+       'Start-Line' : 'GET http://127.0.0.1:SERVER_PORT/argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
        'X-Debug' : 'X-Remap, fwd, Probe',
-       'Connection' : 'close',
+       'Connection' : 'close'
        }},{'type':'request', 'side':'server', 'headers': {
+       'Start-Line' : 'GET /argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
        'X-Debug' : 'X-Remap, fwd, Probe',
        'Client-ip' : '127.0.0.1',
@@ -229,15 +247,17 @@ X-Remap: from=http://two/, 
to=http://127.0.0.1:SERVER_PORT/
 
 {'xDebugProbeAt' : '``
    'captured':[{'type':'response', 'side':'server', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Connection' : 'close',
        'Date' : '``
        }},{'type':'response', 'side':'client', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Date' : '``
        'Age' : '``
        'Transfer-Encoding' : 'chunked',
        'Connection' : 'close',
        'Server' : 'ATS/``
-       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/',
+       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/'
        }}
    ]
 }
@@ -255,9 +275,11 @@ X-Remap: from=http://two/, to=http://127.0.0.1:SERVER_PORT/
 ``
 {'xDebugProbeAt' : '``
    'captured':[{'type':'request', 'side':'client', 'headers': {
+       'Start-Line' : 'GET http://127.0.0.1:SERVER_PORT/argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
-       'Connection' : 'close',
+       'Connection' : 'close'
        }},{'type':'request', 'side':'server', 'headers': {
+       'Start-Line' : 'GET /argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
        'Client-ip' : '127.0.0.1',
        'X-Forwarded-For' : '127.0.0.1',
@@ -272,15 +294,17 @@ X-Remap: from=http://two/, 
to=http://127.0.0.1:SERVER_PORT/
 
 {'xDebugProbeAt' : '``
    'captured':[{'type':'response', 'side':'server', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Connection' : 'close',
        'Date' : '``
        }},{'type':'response', 'side':'client', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Date' : '``
        'Age' : '``
        'Transfer-Encoding' : 'chunked',
        'Connection' : 'close',
        'Server' : 'ATS/``
-       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/',
+       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/'
        }}
    ]
 }
@@ -298,10 +322,12 @@ X-Remap: from=http://two/, 
to=http://127.0.0.1:SERVER_PORT/
 ``
 {'xDebugProbeAt' : '``
    'captured':[{'type':'request', 'side':'client', 'headers': {
+       'Start-Line' : 'GET http://127.0.0.1:SERVER_PORT/argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
        'X-Debug' : 'X-Remap, fwd=0, Probe',
-       'Connection' : 'close',
+       'Connection' : 'close'
        }},{'type':'request', 'side':'server', 'headers': {
+       'Start-Line' : 'GET /argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
        'X-Debug' : 'X-Remap, fwd=0, Probe',
        'Client-ip' : '127.0.0.1',
@@ -317,15 +343,17 @@ X-Remap: from=http://two/, 
to=http://127.0.0.1:SERVER_PORT/
 
 {'xDebugProbeAt' : '``
    'captured':[{'type':'response', 'side':'server', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Connection' : 'close',
        'Date' : '``
        }},{'type':'response', 'side':'client', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Date' : '``
        'Age' : '``
        'Transfer-Encoding' : 'chunked',
        'Connection' : 'close',
        'Server' : 'ATS/``
-       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/',
+       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/'
        }}
    ]
 }
@@ -343,10 +371,12 @@ X-Remap: from=http://two/, 
to=http://127.0.0.1:SERVER_PORT/
 ``
 {'xDebugProbeAt' : '``
    'captured':[{'type':'request', 'side':'client', 'headers': {
+       'Start-Line' : 'GET http://127.0.0.1:SERVER_PORT/argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
        'X-Debug' : 'PROBE, X-Remap, fwd=999998',
-       'Connection' : 'close',
+       'Connection' : 'close'
        }},{'type':'request', 'side':'server', 'headers': {
+       'Start-Line' : 'GET /argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
        'X-Debug' : 'PROBE, X-Remap, fwd=999998',
        'Client-ip' : '127.0.0.1',
@@ -362,15 +392,17 @@ X-Remap: from=http://two/, 
to=http://127.0.0.1:SERVER_PORT/
 
 {'xDebugProbeAt' : '``
    'captured':[{'type':'response', 'side':'server', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Connection' : 'close',
        'Date' : '``
        }},{'type':'response', 'side':'client', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Date' : '``
        'Age' : '``
        'Transfer-Encoding' : 'chunked',
        'Connection' : 'close',
        'Server' : 'ATS/``
-       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/',
+       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/'
        }}
    ]
 }
@@ -388,9 +420,11 @@ X-Remap: from=http://two/, to=http://127.0.0.1:SERVER_PORT/
 ``
 {'xDebugProbeAt' : '``
    'captured':[{'type':'request', 'side':'client', 'headers': {
+       'Start-Line' : 'GET http://127.0.0.1:SERVER_PORT/argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
-       'Connection' : 'close',
+       'Connection' : 'close'
        }},{'type':'request', 'side':'server', 'headers': {
+       'Start-Line' : 'GET /argh HTTP/1.1',
        'Host' : '127.0.0.1:SERVER_PORT',
        'Client-ip' : '127.0.0.1',
        'X-Forwarded-For' : '127.0.0.1',
@@ -405,15 +439,17 @@ X-Remap: from=http://two/, 
to=http://127.0.0.1:SERVER_PORT/
 
 {'xDebugProbeAt' : '``
    'captured':[{'type':'response', 'side':'server', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Connection' : 'close',
        'Date' : '``
        }},{'type':'response', 'side':'client', 'headers': {
+       'Start-Line' : 'HTTP/1.1 200 OK',
        'Date' : '``
        'Age' : '``
        'Transfer-Encoding' : 'chunked',
        'Connection' : 'close',
        'Server' : 'ATS/``
-       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/',
+       'X-Remap' : 'from=http://two/, to=http://127.0.0.1:SERVER_PORT/'
        }}
    ]
 }

Reply via email to