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

kichan 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 04b5fe33a5 Add support to retrieve request header block to lua plugin 
(#11893)
04b5fe33a5 is described below

commit 04b5fe33a5c9a40adfcb001f2fa626c3cfa7e681
Author: Kit Chan <[email protected]>
AuthorDate: Wed Dec 11 18:09:29 2024 +0100

    Add support to retrieve request header block to lua plugin (#11893)
    
    * Update ts_lua_client_request.cc
    
    * Update lua.en.rst
    
    * Update lua.en.rst
---
 doc/admin-guide/plugins/lua.en.rst   | 19 +++++++++++
 plugins/lua/ts_lua_client_request.cc | 63 ++++++++++++++++++++++++++++++++++++
 2 files changed, 82 insertions(+)

diff --git a/doc/admin-guide/plugins/lua.en.rst 
b/doc/admin-guide/plugins/lua.en.rst
index a1ecfa4caf..d065d3d1e3 100644
--- a/doc/admin-guide/plugins/lua.en.rst
+++ b/doc/admin-guide/plugins/lua.en.rst
@@ -989,6 +989,25 @@ Then ``GET /st HTTP/1.1\r\nHost: b.tb.cn\r\nUser-Aget: 
Mozilla/5.0\r\nAccept: */
 
 :ref:`TOP <admin-plugins-ts-lua>`
 
+ts.client_request.get_header_block
+----------------------------------
+**syntax:** *ts.client_request.get_header_block()*
+
+**context:** do_remap/do_os_response or do_global_* or later
+
+**description:** Returns a string holding all the headers for the current 
client request.
+
+Here is an example:
+
+::
+
+    function do_global_read_request()
+        block = ts.client_request.get_header_block()
+        ts.debug(block)
+    end
+
+:ref:`TOP <admin-plugins-ts-lua>`
+
 ts.client_request.client_addr.get_addr
 --------------------------------------
 **syntax:** *ts.client_request.client_addr.get_addr()*
diff --git a/plugins/lua/ts_lua_client_request.cc 
b/plugins/lua/ts_lua_client_request.cc
index ef98ad8af7..804a8c8e67 100644
--- a/plugins/lua/ts_lua_client_request.cc
+++ b/plugins/lua/ts_lua_client_request.cc
@@ -28,6 +28,7 @@ static int ts_lua_client_request_header_set(lua_State *L);
 static int ts_lua_client_request_header_table_get(lua_State *L);
 static int ts_lua_client_request_header_table_set(lua_State *L);
 static int ts_lua_client_request_get_headers(lua_State *L);
+static int ts_lua_client_request_get_header_block(lua_State *L);
 static int ts_lua_client_request_get_url(lua_State *L);
 static int ts_lua_client_request_get_pristine_url(lua_State *L);
 static int ts_lua_client_request_get_url_host(lua_State *L);
@@ -336,6 +337,9 @@ ts_lua_inject_client_request_headers_api(lua_State *L)
 {
   lua_pushcfunction(L, ts_lua_client_request_get_headers);
   lua_setfield(L, -2, "get_headers");
+
+  lua_pushcfunction(L, ts_lua_client_request_get_header_block);
+  lua_setfield(L, -2, "get_header_block");
 }
 
 static int
@@ -395,6 +399,65 @@ ts_lua_client_request_get_headers(lua_State *L)
   return 1;
 }
 
+static int
+ts_lua_client_request_get_header_block(lua_State *L)
+{
+  TSIOBuffer       output_buffer;
+  TSIOBufferReader reader;
+  int              total_avail;
+
+  TSIOBufferBlock block;
+  const char     *block_start;
+  int64_t         block_avail;
+
+  char   *output_string;
+  int64_t output_len;
+
+  ts_lua_http_ctx *http_ctx;
+
+  GET_HTTP_CONTEXT(http_ctx, L);
+
+  output_buffer = TSIOBufferCreate();
+  reader        = TSIOBufferReaderAlloc(output_buffer);
+
+  TSMimeHdrPrint(http_ctx->client_request_hdrp, output_buffer);
+
+  total_avail = TSIOBufferReaderAvail(reader);
+
+  output_string = static_cast<char *>(TSmalloc(total_avail + 1));
+  output_len    = 0;
+
+  block = TSIOBufferReaderStart(reader);
+  while (block) {
+    block_start = TSIOBufferBlockReadStart(block, reader, &block_avail);
+
+    if (block_avail == 0) {
+      break;
+    }
+
+    memcpy(output_string + output_len, block_start, block_avail);
+    output_len += block_avail;
+
+    TSIOBufferReaderConsume(reader, block_avail);
+    block = TSIOBufferReaderStart(reader);
+  }
+
+  output_string[output_len] = '\0';
+  output_len++;
+
+  TSIOBufferReaderFree(reader);
+  TSIOBufferDestroy(output_buffer);
+
+  if (output_string && output_len) {
+    lua_pushlstring(L, output_string, output_len);
+  } else {
+    lua_pushnil(L);
+  }
+
+  TSfree(output_string);
+  return 1;
+}
+
 static void
 ts_lua_inject_client_request_url_api(lua_State *L)
 {

Reply via email to