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;
+}
+