Repository: trafficserver Updated Branches: refs/heads/master f93ca30fd -> fabf12f3f
TS-3290: Add function to get origin server IP address in lua plugin Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/fabf12f3 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/fabf12f3 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/fabf12f3 Branch: refs/heads/master Commit: fabf12f3fa4db64b34dd6246b845f858e3e93a44 Parents: f93ca30 Author: Kit Chan <[email protected]> Authored: Fri Jan 16 23:40:27 2015 +0000 Committer: Kit Chan <[email protected]> Committed: Fri Jan 16 23:40:27 2015 +0000 ---------------------------------------------------------------------- CHANGES | 2 + doc/reference/plugins/ts_lua.en.rst | 23 ++++ .../experimental/ts_lua/ts_lua_client_request.c | 4 +- .../experimental/ts_lua/ts_lua_server_request.c | 123 +++++++++++++++++++ 4 files changed, 150 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/fabf12f3/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index 8fdbc63..6e00ea8 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,8 @@ -*- coding: utf-8 -*- Changes with Apache Traffic Server 5.3.0 + *) [TS-3290] Add function to get origin server IP address in lua plugin. + *) [TS-3304] Add NULL check to ink_inet_addr() input. *) [TS-3301] improved TLS ticket rotation support. http://git-wip-us.apache.org/repos/asf/trafficserver/blob/fabf12f3/doc/reference/plugins/ts_lua.en.rst ---------------------------------------------------------------------- diff --git a/doc/reference/plugins/ts_lua.en.rst b/doc/reference/plugins/ts_lua.en.rst index 72a2cc5..6a81183 100644 --- a/doc/reference/plugins/ts_lua.en.rst +++ b/doc/reference/plugins/ts_lua.en.rst @@ -1048,6 +1048,29 @@ We will get the output: `TOP <#ts-lua-plugin>`_ +ts.server_request.server_addr.get_addr +-------------------------------------- +**syntax:** *ts.server_request.server_addr.get_addr()* + +**context:** do_remap or do_global_* or later + +**description**: This function can be used to get socket address of the origin server. + +The ts.server_request.server_addr.get_addr function returns three values, ip is a string, port and family is number. + +Here is an example: + +:: + + function do_global_send_request() + ip, port, family = ts.server_request.server_addr.get_addr() + print(ip) -- 192.168.231.17 + print(port) -- 80 + print(family) -- 2(AF_INET) + end + +`TOP <#ts-lua-plugin>`_ + ts.server_response.get_status ----------------------------- **syntax:** *status = ts.server_response.get_status()* http://git-wip-us.apache.org/repos/asf/trafficserver/blob/fabf12f3/plugins/experimental/ts_lua/ts_lua_client_request.c ---------------------------------------------------------------------- diff --git a/plugins/experimental/ts_lua/ts_lua_client_request.c b/plugins/experimental/ts_lua/ts_lua_client_request.c index 14a5353..89c0504 100644 --- a/plugins/experimental/ts_lua/ts_lua_client_request.c +++ b/plugins/experimental/ts_lua/ts_lua_client_request.c @@ -655,11 +655,11 @@ ts_lua_client_request_client_addr_get_addr(lua_State * L) } else { if (client_ip->sa_family == AF_INET) { - port = ((struct sockaddr_in *) client_ip)->sin_port; + port = ntohs(((struct sockaddr_in *) client_ip)->sin_port); inet_ntop(AF_INET, (const void *) &((struct sockaddr_in *) client_ip)->sin_addr, cip, sizeof(cip)); family = AF_INET; } else { - port = ((struct sockaddr_in6 *) client_ip)->sin6_port; + port = ntohs(((struct sockaddr_in6 *) client_ip)->sin6_port); inet_ntop(AF_INET6, (const void *) &((struct sockaddr_in6 *) client_ip)->sin6_addr, cip, sizeof(cip)); family = AF_INET6; } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/fabf12f3/plugins/experimental/ts_lua/ts_lua_server_request.c ---------------------------------------------------------------------- diff --git a/plugins/experimental/ts_lua/ts_lua_server_request.c b/plugins/experimental/ts_lua/ts_lua_server_request.c index 9eb6a8e..18a1385 100644 --- a/plugins/experimental/ts_lua/ts_lua_server_request.c +++ b/plugins/experimental/ts_lua/ts_lua_server_request.c @@ -44,7 +44,9 @@ do { \ } \ } while(0) +static void ts_lua_inject_server_request_server_addr_api(lua_State * L); +static void ts_lua_inject_server_request_socket_api(lua_State * L); static void ts_lua_inject_server_request_header_api(lua_State * L); static void ts_lua_inject_server_request_headers_api(lua_State * L); static void ts_lua_inject_server_request_get_header_size_api(lua_State * L); @@ -62,12 +64,16 @@ static int ts_lua_server_request_set_uri(lua_State * L); 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_server_addr_get_ip(lua_State * L); +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); void ts_lua_inject_server_request_api(lua_State * L) { lua_newtable(L); + ts_lua_inject_server_request_socket_api(L); ts_lua_inject_server_request_header_api(L); ts_lua_inject_server_request_headers_api(L); ts_lua_inject_server_request_get_header_size_api(L); @@ -79,6 +85,28 @@ ts_lua_inject_server_request_api(lua_State * L) lua_setfield(L, -2, "server_request"); } +static void +ts_lua_inject_server_request_socket_api(lua_State * L) +{ + ts_lua_inject_server_request_server_addr_api(L); +} + +static void +ts_lua_inject_server_request_server_addr_api(lua_State * L) +{ + lua_newtable(L); + + lua_pushcfunction(L, ts_lua_server_request_server_addr_get_ip); + lua_setfield(L, -2, "get_ip"); + + lua_pushcfunction(L, ts_lua_server_request_server_addr_get_port); + lua_setfield(L, -2, "get_port"); + + lua_pushcfunction(L, ts_lua_server_request_server_addr_get_addr); + lua_setfield(L, -2, "get_addr"); + + lua_setfield(L, -2, "server_addr"); +} static void ts_lua_inject_server_request_header_api(lua_State * L) @@ -406,3 +434,98 @@ ts_lua_server_request_get_uri_args(lua_State * L) return 1; } + +static int +ts_lua_server_request_server_addr_get_ip(lua_State * L) +{ + struct sockaddr const *server_ip; + char sip[128]; + ts_lua_http_ctx *http_ctx; + + http_ctx = ts_lua_get_http_ctx(L); + + server_ip = TSHttpTxnServerAddrGet(http_ctx->txnp); + + if (server_ip == NULL) { + lua_pushnil(L); + + } else { + + if (server_ip->sa_family == AF_INET) { + inet_ntop(AF_INET, (const void *) &((struct sockaddr_in *) server_ip)->sin_addr, sip, sizeof(sip)); + } else { + inet_ntop(AF_INET6, (const void *) &((struct sockaddr_in6 *) server_ip)->sin6_addr, sip, sizeof(sip)); + } + + lua_pushstring(L, sip); + } + + return 1; +} + +static int +ts_lua_server_request_server_addr_get_port(lua_State * L) +{ + struct sockaddr const *server_ip; + ts_lua_http_ctx *http_ctx; + int port; + + http_ctx = ts_lua_get_http_ctx(L); + + server_ip = TSHttpTxnServerAddrGet(http_ctx->txnp); + + if (server_ip == NULL) { + lua_pushnil(L); + + } else { + + if (server_ip->sa_family == AF_INET) { + port = ((struct sockaddr_in *) server_ip)->sin_port; + } else { + port = ((struct sockaddr_in6 *) server_ip)->sin6_port; + } + + lua_pushnumber(L, port); + } + + return 1; +} + +static int +ts_lua_server_request_server_addr_get_addr(lua_State * L) +{ + struct sockaddr const *server_ip; + ts_lua_http_ctx *http_ctx; + int port; + int family; + char sip[128]; + + http_ctx = ts_lua_get_http_ctx(L); + + server_ip = TSHttpTxnServerAddrGet(http_ctx->txnp); + + if (server_ip == NULL) { + lua_pushnil(L); + lua_pushnil(L); + lua_pushnil(L); + + } else { + + if (server_ip->sa_family == AF_INET) { + port = ntohs(((struct sockaddr_in *) server_ip)->sin_port); + inet_ntop(AF_INET, (const void *) &((struct sockaddr_in *) server_ip)->sin_addr, sip, sizeof(sip)); + family = AF_INET; + } else { + port = ntohs(((struct sockaddr_in6 *) server_ip)->sin6_port); + inet_ntop(AF_INET6, (const void *) &((struct sockaddr_in6 *) server_ip)->sin6_addr, sip, sizeof(sip)); + family = AF_INET6; + } + + lua_pushstring(L, sip); + lua_pushnumber(L, port); + lua_pushnumber(L, family); + } + + return 3; +} +
