You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by ki...@apache.org on 2015/01/17 00:40:42 UTC
trafficserver git commit: TS-3290: Add function to get origin server
IP address in lua plugin
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 <ki...@apache.org>
Authored: Fri Jan 16 23:40:27 2015 +0000
Committer: Kit Chan <ki...@apache.org>
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;
+}
+