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/08/20 09:56:15 UTC

trafficserver git commit: TS-3856: add api support for ts_lua plugin

Repository: trafficserver
Updated Branches:
  refs/heads/master 5c404b0d6 -> 4cfbfdfcf


TS-3856: add api support for ts_lua plugin


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/4cfbfdfc
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/4cfbfdfc
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/4cfbfdfc

Branch: refs/heads/master
Commit: 4cfbfdfcfee65987d6d4eb7ae9b6b1e6ea2d4a77
Parents: 5c404b0
Author: Kit Chan <ki...@apache.org>
Authored: Thu Aug 20 00:55:59 2015 -0700
Committer: Kit Chan <ki...@apache.org>
Committed: Thu Aug 20 00:55:59 2015 -0700

----------------------------------------------------------------------
 plugins/experimental/ts_lua/ts_lua.c        |   2 +
 plugins/experimental/ts_lua/ts_lua_common.h |   2 +
 plugins/experimental/ts_lua/ts_lua_http.c   | 102 ++++++++
 plugins/experimental/ts_lua/ts_lua_remap.c  | 306 +++++++++++++++++++++++
 4 files changed, 412 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/4cfbfdfc/plugins/experimental/ts_lua/ts_lua.c
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua.c b/plugins/experimental/ts_lua/ts_lua.c
index b20cf3f..1c1a770 100644
--- a/plugins/experimental/ts_lua/ts_lua.c
+++ b/plugins/experimental/ts_lua/ts_lua.c
@@ -146,6 +146,7 @@ TSRemapDoRemap(void *ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
   http_ctx->client_request_bufp = rri->requestBufp;
   http_ctx->client_request_hdrp = rri->requestHdrp;
   http_ctx->client_request_url = rri->requestUrl;
+  http_ctx->rri = rri;
   http_ctx->remap = 1;
   http_ctx->has_hook = 0;
 
@@ -218,6 +219,7 @@ globalHookHandler(TSCont contp, TSEvent event ATS_UNUSED, void *edata)
 
   http_ctx = ts_lua_create_http_ctx(main_ctx, conf);
   http_ctx->txnp = txnp;
+  http_ctx->rri = NULL;
   http_ctx->remap = 0;
   http_ctx->has_hook = 0;
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/4cfbfdfc/plugins/experimental/ts_lua/ts_lua_common.h
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua_common.h b/plugins/experimental/ts_lua/ts_lua_common.h
index 06187d7..04c95d0 100644
--- a/plugins/experimental/ts_lua/ts_lua_common.h
+++ b/plugins/experimental/ts_lua/ts_lua_common.h
@@ -129,6 +129,8 @@ typedef struct {
   int remap;
   int has_hook;
 
+  TSRemapRequestInfo *rri;
+
 } ts_lua_http_ctx;
 
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/4cfbfdfc/plugins/experimental/ts_lua/ts_lua_http.c
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua_http.c b/plugins/experimental/ts_lua/ts_lua_http.c
index a468cb5..3ed16ea 100644
--- a/plugins/experimental/ts_lua/ts_lua_http.c
+++ b/plugins/experimental/ts_lua/ts_lua_http.c
@@ -45,6 +45,8 @@ static int ts_lua_http_set_resp(lua_State *L);
 static int ts_lua_http_get_cache_lookup_status(lua_State *L);
 static int ts_lua_http_set_cache_lookup_status(lua_State *L);
 static int ts_lua_http_set_cache_url(lua_State *L);
+static int ts_lua_http_get_cache_lookup_url(lua_State *L);
+static int ts_lua_http_set_cache_lookup_url(lua_State *L);
 static int ts_lua_http_set_server_resp_no_store(lua_State *L);
 
 static void ts_lua_inject_cache_lookup_result_variables(lua_State *L);
@@ -54,6 +56,7 @@ static int ts_lua_http_resp_cache_untransformed(lua_State *L);
 
 static int ts_lua_http_is_internal_request(lua_State *L);
 static int ts_lua_http_skip_remapping_set(lua_State *L);
+static int ts_lua_http_transaction_count(lua_State *L);
 
 static void ts_lua_inject_http_resp_transform_api(lua_State *L);
 static int ts_lua_http_resp_transform_get_upstream_bytes(lua_State *L);
@@ -101,6 +104,12 @@ ts_lua_inject_http_cache_api(lua_State *L)
   lua_pushcfunction(L, ts_lua_http_set_cache_url);
   lua_setfield(L, -2, "set_cache_url");
 
+  lua_pushcfunction(L, ts_lua_http_get_cache_lookup_url);
+  lua_setfield(L, -2, "get_cache_lookup_url");
+
+  lua_pushcfunction(L, ts_lua_http_set_cache_lookup_url);
+  lua_setfield(L, -2, "set_cache_lookup_url");
+
   lua_pushcfunction(L, ts_lua_http_set_server_resp_no_store);
   lua_setfield(L, -2, "set_server_resp_no_store");
 
@@ -140,6 +149,9 @@ ts_lua_inject_http_misc_api(lua_State *L)
 
   lua_pushcfunction(L, ts_lua_http_skip_remapping_set);
   lua_setfield(L, -2, "skip_remapping_set");
+
+  lua_pushcfunction(L, ts_lua_http_transaction_count);
+  lua_setfield(L, -2, "transaction_count");
 }
 
 static void
@@ -238,6 +250,78 @@ ts_lua_http_set_cache_lookup_status(lua_State *L)
 }
 
 static int
+ts_lua_http_get_cache_lookup_url(lua_State *L)
+{
+  char output[TS_LUA_MAX_URL_LENGTH];
+  int output_len;
+  TSMLoc url = TS_NULL_MLOC;
+  char *str = NULL;
+  int len;
+
+  ts_lua_http_ctx *http_ctx;
+
+  http_ctx = ts_lua_get_http_ctx(L);
+
+  if (TSUrlCreate(http_ctx->client_request_bufp, &url) != TS_SUCCESS) {
+    lua_pushnil(L);
+    goto done;
+  }
+
+  if (TSHttpTxnCacheLookupUrlGet(http_ctx->txnp, http_ctx->client_request_bufp, url) != TS_SUCCESS) {
+    lua_pushnil(L);
+    goto done;
+  }
+
+  str = TSUrlStringGet(http_ctx->client_request_bufp, url, &len);
+
+  output_len = snprintf(output, TS_LUA_MAX_URL_LENGTH, "%.*s", len, str);
+  if (output_len >= TS_LUA_MAX_URL_LENGTH) {
+    lua_pushlstring(L, output, TS_LUA_MAX_URL_LENGTH - 1);
+  } else {
+    lua_pushlstring(L, output, output_len);
+  }
+
+done:
+  if (url != TS_NULL_MLOC) {
+    TSHandleMLocRelease(http_ctx->client_request_bufp, TS_NULL_MLOC, url);
+  }
+
+  if (str != NULL) {
+    TSfree(str);
+  }
+
+  return 1;
+}
+
+static int
+ts_lua_http_set_cache_lookup_url(lua_State *L)
+{
+  const char *url;
+  size_t url_len;
+
+  ts_lua_http_ctx *http_ctx;
+
+  http_ctx = ts_lua_get_http_ctx(L);
+
+  url = luaL_checklstring(L, 1, &url_len);
+
+  if (url && url_len) {
+    const char *start = url;
+    const char *end = url + url_len;
+    TSMLoc new_url_loc;
+    if (TSUrlCreate(http_ctx->client_request_bufp, &new_url_loc) == TS_SUCCESS &&
+        TSUrlParse(http_ctx->client_request_bufp, new_url_loc, &start, end) == TS_PARSE_DONE &&
+        TSHttpTxnCacheLookupUrlSet(http_ctx->txnp, http_ctx->client_request_bufp, new_url_loc) == TS_SUCCESS) {
+      TSDebug(TS_LUA_DEBUG_TAG, "Set cache lookup URL");
+    } else {
+      TSError("[ts_lua] Failed to set cache lookup URL");
+    }
+  }
+
+  return 0;
+}
+
+static int
 ts_lua_http_set_cache_url(lua_State *L)
 {
   const char *url;
@@ -338,6 +422,24 @@ ts_lua_http_skip_remapping_set(lua_State *L)
 }
 
 static int
+ts_lua_http_transaction_count(lua_State *L)
+{
+  ts_lua_http_ctx *http_ctx;
+
+  http_ctx = ts_lua_get_http_ctx(L);
+
+  TSHttpSsn ssn = TSHttpTxnSsnGet(http_ctx->txnp);
+  if (ssn) {
+    int n = TSHttpSsnTransactionCount(ssn);
+    lua_pushnumber(L, n);
+  } else {
+    lua_pushnil(L);
+  }
+
+  return 1;
+}
+
+static int
 ts_lua_http_resp_transform_get_upstream_bytes(lua_State *L)
 {
   ts_lua_http_transform_ctx *transform_ctx;

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/4cfbfdfc/plugins/experimental/ts_lua/ts_lua_remap.c
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua_remap.c b/plugins/experimental/ts_lua/ts_lua_remap.c
index e27a612..3459158 100644
--- a/plugins/experimental/ts_lua/ts_lua_remap.c
+++ b/plugins/experimental/ts_lua/ts_lua_remap.c
@@ -17,6 +17,7 @@
 */
 
 
+#include "ts_lua_util.h"
 #include "ts_lua_remap.h"
 
 
@@ -33,6 +34,17 @@ ts_lua_var_item ts_lua_remap_status_vars[] = {
   TS_LUA_MAKE_VAR_ITEM(TS_LUA_REMAP_NO_REMAP_STOP), TS_LUA_MAKE_VAR_ITEM(TS_LUA_REMAP_DID_REMAP_STOP),
   TS_LUA_MAKE_VAR_ITEM(TS_LUA_REMAP_ERROR)};
 
+static int ts_lua_remap_get_from_url_host(lua_State *L);
+static int ts_lua_remap_get_from_url_port(lua_State *L);
+static int ts_lua_remap_get_from_url_scheme(lua_State *L);
+static int ts_lua_remap_get_from_uri(lua_State *L);
+static int ts_lua_remap_get_from_url(lua_State *L);
+
+static int ts_lua_remap_get_to_url_host(lua_State *L);
+static int ts_lua_remap_get_to_url_port(lua_State *L);
+static int ts_lua_remap_get_to_url_scheme(lua_State *L);
+static int ts_lua_remap_get_to_uri(lua_State *L);
+static int ts_lua_remap_get_to_url(lua_State *L);
 
 static void ts_lua_inject_remap_variables(lua_State *L);
 
@@ -41,6 +53,40 @@ void
 ts_lua_inject_remap_api(lua_State *L)
 {
   ts_lua_inject_remap_variables(L);
+
+  lua_newtable(L);
+
+  lua_pushcfunction(L, ts_lua_remap_get_from_url_host);
+  lua_setfield(L, -2, "get_from_url_host");
+
+  lua_pushcfunction(L, ts_lua_remap_get_from_url_port);
+  lua_setfield(L, -2, "get_from_url_port");
+
+  lua_pushcfunction(L, ts_lua_remap_get_from_url_scheme);
+  lua_setfield(L, -2, "get_from_url_scheme");
+
+  lua_pushcfunction(L, ts_lua_remap_get_from_uri);
+  lua_setfield(L, -2, "get_from_uri");
+
+  lua_pushcfunction(L, ts_lua_remap_get_from_url);
+  lua_setfield(L, -2, "get_from_url");
+
+  lua_pushcfunction(L, ts_lua_remap_get_to_url_host);
+  lua_setfield(L, -2, "get_to_url_host");
+
+  lua_pushcfunction(L, ts_lua_remap_get_to_url_port);
+  lua_setfield(L, -2, "get_to_url_port");
+
+  lua_pushcfunction(L, ts_lua_remap_get_to_url_scheme);
+  lua_setfield(L, -2, "get_to_url_scheme");
+
+  lua_pushcfunction(L, ts_lua_remap_get_to_uri);
+  lua_setfield(L, -2, "get_to_uri");
+
+  lua_pushcfunction(L, ts_lua_remap_get_to_url);
+  lua_setfield(L, -2, "get_to_url");
+
+  lua_setfield(L, -2, "remap");
 }
 
 static void
@@ -53,3 +99,263 @@ ts_lua_inject_remap_variables(lua_State *L)
     lua_setglobal(L, ts_lua_remap_status_vars[i].svar);
   }
 }
+
+static int
+ts_lua_remap_get_from_url_host(lua_State *L)
+{
+  const char *host;
+  int len = 0;
+
+  ts_lua_http_ctx *http_ctx;
+
+  http_ctx = ts_lua_get_http_ctx(L);
+
+  if (http_ctx->rri != NULL) {
+    host = TSUrlHostGet(http_ctx->client_request_bufp, http_ctx->rri->mapFromUrl, &len);
+
+    if (len == 0) {
+      lua_pushnil(L);
+    } else {
+      lua_pushlstring(L, host, len);
+    }
+  } else {
+    lua_pushnil(L);
+  }
+
+  return 1;
+}
+
+static int
+ts_lua_remap_get_from_url_port(lua_State *L)
+{
+  int port;
+
+  ts_lua_http_ctx *http_ctx;
+
+  http_ctx = ts_lua_get_http_ctx(L);
+
+  if (http_ctx->rri != NULL) {
+    port = TSUrlPortGet(http_ctx->client_request_bufp, http_ctx->rri->mapFromUrl);
+
+    lua_pushnumber(L, port);
+  } else {
+    lua_pushnil(L);
+  }
+
+  return 1;
+}
+
+static int
+ts_lua_remap_get_from_url_scheme(lua_State *L)
+{
+  const char *scheme;
+  int len;
+
+  ts_lua_http_ctx *http_ctx;
+
+  http_ctx = ts_lua_get_http_ctx(L);
+
+  if (http_ctx->rri != NULL) {
+    scheme = TSUrlSchemeGet(http_ctx->client_request_bufp, http_ctx->rri->mapFromUrl, &len);
+
+    if (len == 0) {
+      lua_pushnil(L);
+    } else {
+      lua_pushlstring(L, scheme, len);
+    }
+  } else {
+    lua_pushnil(L);
+  }
+
+  return 1;
+}
+
+static int
+ts_lua_remap_get_from_uri(lua_State *L)
+{
+  char uri[TS_LUA_MAX_URL_LENGTH];
+  const char *path;
+  int path_len;
+  int uri_len;
+
+  ts_lua_http_ctx *http_ctx;
+
+  http_ctx = ts_lua_get_http_ctx(L);
+
+  if (http_ctx->rri != NULL) {
+    path = TSUrlPathGet(http_ctx->client_request_bufp, http_ctx->rri->mapFromUrl, &path_len);
+
+    uri_len = snprintf(uri, TS_LUA_MAX_URL_LENGTH, "/%.*s", path_len, path);
+
+    if (uri_len >= TS_LUA_MAX_URL_LENGTH) {
+      lua_pushlstring(L, uri, TS_LUA_MAX_URL_LENGTH - 1);
+    } else {
+      lua_pushlstring(L, uri, uri_len);
+    }
+  } else {
+    lua_pushnil(L);
+  }
+
+  return 1;
+}
+
+static int
+ts_lua_remap_get_from_url(lua_State *L)
+{
+  char output[TS_LUA_MAX_URL_LENGTH];
+  char *url;
+  int url_len;
+  int output_len;
+
+  ts_lua_http_ctx *http_ctx;
+
+  http_ctx = ts_lua_get_http_ctx(L);
+
+  if (http_ctx->rri != NULL) {
+    url = TSUrlStringGet(http_ctx->client_request_bufp, http_ctx->rri->mapFromUrl, &url_len);
+
+    output_len = snprintf(output, TS_LUA_MAX_URL_LENGTH, "%.*s", url_len, url);
+
+    if (output_len >= TS_LUA_MAX_URL_LENGTH) {
+      lua_pushlstring(L, output, TS_LUA_MAX_URL_LENGTH - 1);
+    } else {
+      lua_pushlstring(L, output, output_len);
+    }
+
+    TSfree(url);
+  } else {
+    lua_pushnil(L);
+  }
+
+  return 1;
+}
+
+static int
+ts_lua_remap_get_to_url_host(lua_State *L)
+{
+  const char *host;
+  int len = 0;
+
+  ts_lua_http_ctx *http_ctx;
+
+  http_ctx = ts_lua_get_http_ctx(L);
+
+  if (http_ctx->rri != NULL) {
+    host = TSUrlHostGet(http_ctx->client_request_bufp, http_ctx->rri->mapToUrl, &len);
+
+    if (len == 0) {
+      lua_pushnil(L);
+    } else {
+      lua_pushlstring(L, host, len);
+    }
+  } else {
+    lua_pushnil(L);
+  }
+
+  return 1;
+}
+
+static int
+ts_lua_remap_get_to_url_port(lua_State *L)
+{
+  int port;
+
+  ts_lua_http_ctx *http_ctx;
+
+  http_ctx = ts_lua_get_http_ctx(L);
+
+  if (http_ctx->rri != NULL) {
+    port = TSUrlPortGet(http_ctx->client_request_bufp, http_ctx->rri->mapToUrl);
+
+    lua_pushnumber(L, port);
+  } else {
+    lua_pushnil(L);
+  }
+
+  return 1;
+}
+
+static int
+ts_lua_remap_get_to_url_scheme(lua_State *L)
+{
+  const char *scheme;
+  int len;
+
+  ts_lua_http_ctx *http_ctx;
+
+  http_ctx = ts_lua_get_http_ctx(L);
+
+  if (http_ctx->rri != NULL) {
+    scheme = TSUrlSchemeGet(http_ctx->client_request_bufp, http_ctx->rri->mapToUrl, &len);
+
+    if (len == 0) {
+      lua_pushnil(L);
+    } else {
+      lua_pushlstring(L, scheme, len);
+    }
+  } else {
+    lua_pushnil(L);
+  }
+
+  return 1;
+}
+
+static int
+ts_lua_remap_get_to_uri(lua_State *L)
+{
+  char uri[TS_LUA_MAX_URL_LENGTH];
+  const char *path;
+  int path_len;
+  int uri_len;
+
+  ts_lua_http_ctx *http_ctx;
+
+  http_ctx = ts_lua_get_http_ctx(L);
+
+  if (http_ctx->rri != NULL) {
+    path = TSUrlPathGet(http_ctx->client_request_bufp, http_ctx->rri->mapToUrl, &path_len);
+
+    uri_len = snprintf(uri, TS_LUA_MAX_URL_LENGTH, "/%.*s", path_len, path);
+
+    if (uri_len >= TS_LUA_MAX_URL_LENGTH) {
+      lua_pushlstring(L, uri, TS_LUA_MAX_URL_LENGTH - 1);
+    } else {
+      lua_pushlstring(L, uri, uri_len);
+    }
+  } else {
+    lua_pushnil(L);
+  }
+
+  return 1;
+}
+
+static int
+ts_lua_remap_get_to_url(lua_State *L)
+{
+  char output[TS_LUA_MAX_URL_LENGTH];
+  char *url;
+  int url_len;
+  int output_len;
+
+  ts_lua_http_ctx *http_ctx;
+
+  http_ctx = ts_lua_get_http_ctx(L);
+
+  if (http_ctx->rri != NULL) {
+    url = TSUrlStringGet(http_ctx->client_request_bufp, http_ctx->rri->mapToUrl, &url_len);
+
+    output_len = snprintf(output, TS_LUA_MAX_URL_LENGTH, "%.*s", url_len, url);
+
+    if (output_len >= TS_LUA_MAX_URL_LENGTH) {
+      lua_pushlstring(L, output, TS_LUA_MAX_URL_LENGTH - 1);
+    } else {
+      lua_pushlstring(L, output, output_len);
+    }
+
+    TSfree(url);
+  } else {
+    lua_pushnil(L);
+  }
+
+  return 1;
+}