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/14 03:46:41 UTC
[trafficserver] 01/04: tslua: Exposes set/get method 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
commit 23d6b2f2e4ae13f6562f1c28c0290de54b1ab5a3
Author: Randall Meyer <rr...@apache.org>
AuthorDate: Thu Nov 7 16:06:39 2019 -0800
tslua: Exposes set/get method for server request objects
(cherry picked from commit 97692a552c8ad72a1cc8a890cdf11e53d3a6a1bc)
---
doc/admin-guide/plugins/lua.en.rst | 42 ++++++++++++++++++++++++++++
plugins/lua/ts_lua_server_request.c | 55 ++++++++++++++++++++++++++++++++++++-
2 files changed, 96 insertions(+), 1 deletion(-)
diff --git a/doc/admin-guide/plugins/lua.en.rst b/doc/admin-guide/plugins/lua.en.rst
index dd0d197..5362435 100644
--- a/doc/admin-guide/plugins/lua.en.rst
+++ b/doc/admin-guide/plugins/lua.en.rst
@@ -1903,6 +1903,48 @@ ts.server_request.set_url_scheme
:ref:`TOP <admin-plugins-ts-lua>`
+ts.server_request.get_method
+----------------------------
+**syntax:** *ts.server_request.get_method()*
+
+**context:** function @ TS_LUA_HOOK_SEND_REQUEST_HDR hook point or later
+
+**description:** This function can be used to retrieve the current server request's method name. String like "GET" or "POST" is returned.
+
+Here is an example:
+
+::
+
+ function send_request()
+ local method = ts.server_request.get_method()
+ ts.debug(method)
+ end
+
+ function do_remap()
+ ts.hook(TS_LUA_HOOK_SEND_REQUEST_HDR, send_request)
+ return 0
+ end
+
+Then ``HEAD /`` will yield the output:
+
+``HEAD``
+
+:ref:`TOP <admin-plugins-ts-lua>`
+
+ts.server_request.set_method
+----------------------------
+**syntax:** *ts.server_request.set_method()*
+
+**context:** function @ TS_LUA_HOOK_SEND_REQUEST_HDR hook point or later
+
+**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_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 c927217..2aa7e45 100644
--- a/plugins/lua/ts_lua_server_request.c
+++ b/plugins/lua/ts_lua_server_request.c
@@ -51,6 +51,7 @@ static void ts_lua_inject_server_request_uri_api(lua_State *L);
static void ts_lua_inject_server_request_uri_args_api(lua_State *L);
static void ts_lua_inject_server_request_uri_params_api(lua_State *L);
static void ts_lua_inject_server_request_url_api(lua_State *L);
+static void ts_lua_inject_server_request_method_api(lua_State *L);
static int ts_lua_server_request_header_get(lua_State *L);
static int ts_lua_server_request_header_set(lua_State *L);
@@ -63,6 +64,8 @@ static int ts_lua_server_request_set_uri_args(lua_State *L);
static int ts_lua_server_request_get_uri_args(lua_State *L);
static int ts_lua_server_request_set_uri_params(lua_State *L);
static int ts_lua_server_request_get_uri_params(lua_State *L);
+static int ts_lua_server_request_get_method(lua_State *L);
+static int ts_lua_server_request_set_method(lua_State *L);
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);
@@ -87,7 +90,7 @@ ts_lua_inject_server_request_api(lua_State *L)
ts_lua_inject_server_request_headers_api(L);
ts_lua_inject_server_request_get_header_size_api(L);
ts_lua_inject_server_request_get_body_size_api(L);
-
+ ts_lua_inject_server_request_method_api(L);
ts_lua_inject_server_request_uri_api(L);
ts_lua_inject_server_request_uri_args_api(L);
ts_lua_inject_server_request_uri_params_api(L);
@@ -924,3 +927,53 @@ ts_lua_server_request_server_addr_set_outgoing_addr(lua_State *L)
return 0;
}
+
+static void
+ts_lua_inject_server_request_method_api(lua_State *L)
+{
+ lua_pushcfunction(L, ts_lua_server_request_get_method);
+ lua_setfield(L, -2, "get_method");
+
+ lua_pushcfunction(L, ts_lua_server_request_set_method);
+ lua_setfield(L, -2, "set_method");
+}
+
+static int
+ts_lua_server_request_get_method(lua_State *L)
+{
+ const char *method;
+ int method_len;
+
+ ts_lua_http_ctx *http_ctx;
+
+ GET_HTTP_CONTEXT(http_ctx, L);
+
+ method = TSHttpHdrMethodGet(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, &method_len);
+
+ if (method && method_len) {
+ lua_pushlstring(L, method, method_len);
+ } else {
+ lua_pushnil(L);
+ }
+
+ return 1;
+}
+
+static int
+ts_lua_server_request_set_method(lua_State *L)
+{
+ const char *method;
+ size_t method_len;
+
+ ts_lua_http_ctx *http_ctx;
+
+ GET_HTTP_CONTEXT(http_ctx, L);
+
+ method = luaL_checklstring(L, 1, &method_len);
+
+ if (method) {
+ TSHttpHdrMethodSet(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, method, method_len);
+ }
+
+ return 0;
+}