You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2019/11/18 04:01:44 UTC

[trafficserver] branch 9.0.x updated: tslua: Exposes set/get version for server request objects

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

zwoop 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 f6c79dd  tslua: Exposes set/get version for server request objects
f6c79dd is described below

commit f6c79dd6d88eb0df074ce600a8f6ebd33429f3ae
Author: Randall Meyer <rr...@apple.com>
AuthorDate: Sun Nov 17 10:38:32 2019 +0800

    tslua: Exposes set/get version for server request objects
    
    (cherry picked from commit ddb6e33ae5067262b8df5a1ac0663649308a6ca7)
---
 doc/admin-guide/plugins/lua.en.rst  | 37 +++++++++++++++++++++++-
 plugins/lua/ts_lua_server_request.c | 56 +++++++++++++++++++++++++++++++++++++
 2 files changed, 92 insertions(+), 1 deletion(-)

diff --git a/doc/admin-guide/plugins/lua.en.rst b/doc/admin-guide/plugins/lua.en.rst
index 5362435..9f52692 100644
--- a/doc/admin-guide/plugins/lua.en.rst
+++ b/doc/admin-guide/plugins/lua.en.rst
@@ -1940,11 +1940,46 @@ ts.server_request.set_method
 **description:** This function can be used to override the current server request's method with METHOD_NAME.
 
 ::
-
     ts.server_request.set_method('HEAD')
 
 :ref:`TOP <admin-plugins-ts-lua>`
 
+ts.server_request_get_version
+------------------------------
+**syntax:** *ver = ts.server_request.get_version()*
+
+**context:** function @ TS_LUA_HOOK_SEND_REQUEST_HDR hook point or later.
+
+**description:** Return the http version string of the server request.
+
+Current possible values are 1.0, 1.1, and 0.9.
+::
+    function send_request()
+        local version = ts.server_request.get_version()
+        ts.debug(version)
+    end
+
+    function do_remap()
+        ts.hook(TS_LUA_HOOK_SEND_REQUEST_HDR, send_request)
+        return 0
+    end
+
+:ref:`TOP <admin-plugins-ts-lua>`
+
+ts.server_request.set_version
+------------------------------
+**syntax:** *ts.server_request.set_version(VERSION_STR)*
+
+**context:** function @ TS_LUA_HOOK_READ_RESPONSE_HDR hook point
+
+**description:** Set the http version of the server request with the VERSION_STR
+
+::
+
+    ts.server_request.set_version('1.0')
+
+:ref:`TOP <admin-plugins-ts-lua>`
+
 ts.server_response.get_status
 -----------------------------
 **syntax:** *status = ts.server_response.get_status()*
diff --git a/plugins/lua/ts_lua_server_request.c b/plugins/lua/ts_lua_server_request.c
index 2aa7e45..8e65fe3 100644
--- a/plugins/lua/ts_lua_server_request.c
+++ b/plugins/lua/ts_lua_server_request.c
@@ -70,6 +70,8 @@ static int ts_lua_server_request_get_url_host(lua_State *L);
 static int ts_lua_server_request_set_url_host(lua_State *L);
 static int ts_lua_server_request_get_url_scheme(lua_State *L);
 static int ts_lua_server_request_set_url_scheme(lua_State *L);
+static int ts_lua_server_request_get_version(lua_State *L);
+static int ts_lua_server_request_set_version(lua_State *L);
 
 static int ts_lua_server_request_server_addr_get_ip(lua_State *L);
 static int ts_lua_server_request_server_addr_get_port(lua_State *L);
@@ -566,6 +568,11 @@ ts_lua_inject_server_request_url_api(lua_State *L)
   lua_setfield(L, -2, "get_url_scheme");
   lua_pushcfunction(L, ts_lua_server_request_set_url_scheme);
   lua_setfield(L, -2, "set_url_scheme");
+
+  lua_pushcfunction(L, ts_lua_server_request_get_version);
+  lua_setfield(L, -2, "get_version");
+  lua_pushcfunction(L, ts_lua_server_request_set_version);
+  lua_setfield(L, -2, "set_version");
 }
 
 static int
@@ -663,6 +670,55 @@ ts_lua_server_request_set_url_scheme(lua_State *L)
 }
 
 static int
+ts_lua_server_request_get_version(lua_State *L)
+{
+  int version;
+  char buf[32];
+  int n;
+
+  ts_lua_http_ctx *http_ctx;
+
+  GET_HTTP_CONTEXT(http_ctx, L);
+  TS_LUA_CHECK_SERVER_REQUEST_HDR(http_ctx);
+
+  version = TSHttpHdrVersionGet(http_ctx->server_request_bufp, http_ctx->server_request_hdrp);
+
+  n = snprintf(buf, sizeof(buf), "%d.%d", TS_HTTP_MAJOR(version), TS_HTTP_MINOR(version));
+
+  if (n >= (int)sizeof(buf)) {
+    lua_pushlstring(L, buf, sizeof(buf) - 1);
+  } else if (n > 0) {
+    lua_pushlstring(L, buf, n);
+  }
+
+  return 1;
+}
+
+static int
+ts_lua_server_request_set_version(lua_State *L)
+{
+  const char *version;
+  size_t len;
+  int major, minor;
+
+  ts_lua_http_ctx *http_ctx;
+
+  GET_HTTP_CONTEXT(http_ctx, L);
+
+  TS_LUA_CHECK_SERVER_REQUEST_HDR(http_ctx);
+
+  version = luaL_checklstring(L, 1, &len);
+
+  if (sscanf(version, "%2u.%2u", &major, &minor) != 2) {
+    return luaL_error(L, "failed to set version. Format must be X.Y");
+  }
+
+  TSHttpHdrVersionSet(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, TS_HTTP_VERSION(major, minor));
+
+  return 0;
+}
+
+static int
 ts_lua_server_request_server_addr_get_ip(lua_State *L)
 {
   struct sockaddr const *server_ip;