From 882d024840cd3a08ba64e54598681996e6cb38a9 Mon Sep 17 00:00:00 2001 From: Kit Chan Date: Sun, 15 Apr 2018 21:03:34 -0700 Subject: [PATCH] add support for TSHttpTxnOutgoingAddrSet in ts_lua --- doc/admin-guide/plugins/ts_lua.en.rst | 20 ++++++++ .../ts_lua/ts_lua_server_request.c | 50 +++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/doc/admin-guide/plugins/ts_lua.en.rst b/doc/admin-guide/plugins/ts_lua.en.rst index 342a859de88..eb8a1a49385 100644 --- a/doc/admin-guide/plugins/ts_lua.en.rst +++ b/doc/admin-guide/plugins/ts_lua.en.rst @@ -1586,6 +1586,26 @@ Here is an example: `TOP <#ts-lua-plugin>`_ +ts.server_request.server_addr.set_outgoing_addr +----------------------------------------------- +**syntax:** *ts.server_request.server_addr.set_outgoing_addr()* + +**context:** earlier than or inside function @ TS_LUA_HOOK_SEND_REQUEST_HDR hook point + +**description**: This function can be used to set outgoing socket address for the request to origin. + +The ts.server_request.server_addr.set_outgoing_addr function requires three inputs, ip is a string, port and family is number. + +Here is an example: + +:: + + function do_global_send_request() + ts.server_request.server_addr.set_outgoing_addr("192.168.231.17", 80, TS_LUA_AF_INET) + end + +`TOP <#ts-lua-plugin>`_ + ts.server_request.get_url_host ------------------------------ **syntax:** *host = ts.server_request.get_url_host()* diff --git a/plugins/experimental/ts_lua/ts_lua_server_request.c b/plugins/experimental/ts_lua/ts_lua_server_request.c index 7ba699556ca..b23f582e877 100644 --- a/plugins/experimental/ts_lua/ts_lua_server_request.c +++ b/plugins/experimental/ts_lua/ts_lua_server_request.c @@ -73,6 +73,7 @@ static int ts_lua_server_request_server_addr_get_port(lua_State *L); static int ts_lua_server_request_server_addr_get_addr(lua_State *L); static int ts_lua_server_request_server_addr_set_addr(lua_State *L); static int ts_lua_server_request_server_addr_get_outgoing_port(lua_State *L); +static int ts_lua_server_request_server_addr_set_outgoing_addr(lua_State *L); void ts_lua_inject_server_request_api(lua_State *L) @@ -120,6 +121,9 @@ ts_lua_inject_server_request_server_addr_api(lua_State *L) lua_pushcfunction(L, ts_lua_server_request_server_addr_get_outgoing_port); lua_setfield(L, -2, "get_outgoing_port"); + lua_pushcfunction(L, ts_lua_server_request_server_addr_set_outgoing_addr); + lua_setfield(L, -2, "set_outgoing_addr"); + lua_setfield(L, -2, "server_addr"); lua_pushinteger(L, AF_INET); @@ -816,3 +820,49 @@ ts_lua_server_request_server_addr_set_addr(lua_State *L) return 0; } + +static int +ts_lua_server_request_server_addr_set_outgoing_addr(lua_State *L) +{ + union { + struct sockaddr_in sin4; + struct sockaddr_in6 sin6; + struct sockaddr sa; + } addr; + ts_lua_http_ctx *http_ctx; + int n; + int port; + int family; + const char *sip; + size_t sip_len; + + GET_HTTP_CONTEXT(http_ctx, L); + + n = lua_gettop(L); + + if (n == 3) { + sip = luaL_checklstring(L, 1, &sip_len); + port = luaL_checknumber(L, 2); + family = luaL_checknumber(L, 3); + + if (family == AF_INET) { + addr.sin4.sin_family = AF_INET; + addr.sin4.sin_port = htons(port); + if (!inet_pton(family, sip, &addr.sin4.sin_addr)) { + return luaL_error(L, "invalid ipv4 address"); + } + } else { + addr.sin6.sin6_family = AF_INET6; + addr.sin6.sin6_port = htons(port); + if (!inet_pton(family, sip, &addr.sin6.sin6_addr)) { + return luaL_error(L, "invalid ipv6 address"); + } + } + + TSHttpTxnOutgoingAddrSet(http_ctx->txnp, &addr.sa); + } else { + return luaL_error(L, "incorrect # of arguments to ts.server_request.addr.set_outgoing_addr, receiving %d instead of 3", n); + } + + return 0; +}