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 2014/12/23 23:40:53 UTC
trafficserver git commit: TS-3225: add more API support to ts_lua
plugin
Repository: trafficserver
Updated Branches:
refs/heads/master 46d05a3cc -> e02420a42
TS-3225: add more API support to 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/e02420a4
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/e02420a4
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/e02420a4
Branch: refs/heads/master
Commit: e02420a424c049808c56f62c21ef84757060ffe8
Parents: 46d05a3
Author: Kit Chan <ki...@apache.org>
Authored: Tue Dec 23 22:40:34 2014 +0000
Committer: Kit Chan <ki...@apache.org>
Committed: Tue Dec 23 22:40:34 2014 +0000
----------------------------------------------------------------------
CHANGES | 4 +-
doc/reference/plugins/ts_lua.en.rst | 198 +++++++++++++++++++
plugins/experimental/ts_lua/ts_lua_common.h | 1 +
plugins/experimental/ts_lua/ts_lua_crypto.c | 156 +++++++++++++++
plugins/experimental/ts_lua/ts_lua_http.c | 20 ++
.../experimental/ts_lua/ts_lua_http_config.c | 146 +++++++++++++-
6 files changed, 523 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e02420a4/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 050abfe..d696bbd 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,7 +1,9 @@
-*- coding: utf-8 -*-
Changes with Apache Traffic Server 5.3.0
- *) [TS-3255] support flush option in gzip plugins.
+ *) [TS-3225] add more API support to ts_lua plugin.
+
+ *) [TS-3255] support flush option in gzip plugin.
*) [TS-3222] Fix port print to not have leading 0.
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e02420a4/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 3e190c0..72a2cc5 100644
--- a/doc/reference/plugins/ts_lua.en.rst
+++ b/doc/reference/plugins/ts_lua.en.rst
@@ -734,6 +734,36 @@ Here is an example:
`TOP <#ts-lua-plugin>`_
+ts.http.set_cache_lookup_status
+-------------------------------
+**syntax:** *ts.http.set_cache_lookup_status()*
+
+**context:** function after TS_LUA_HOOK_CACHE_LOOKUP_COMPLETE hook point
+
+**description:** This function can be used to set cache lookup status.
+
+Here is an example:
+
+::
+
+ function cache_lookup()
+ local cache_status = ts.http.get_cache_lookup_status()
+ if cache_status == TS_LUA_CACHE_LOOKUP_HIT_FRESH then
+ print('hit')
+ else
+ print('not hit')
+ end
+ ts.http.set_cache_lookup_status(TS_LUA_CACHE_LOOKUP_MISS)
+ end
+
+ function do_remap()
+ ts.hook(TS_LUA_HOOK_CACHE_LOOKUP_COMPLETE, cache_lookup)
+ return 0
+ end
+
+
+`TOP <#ts-lua-plugin>`_
+
Http cache lookup status constants
----------------------------------
**context:** global
@@ -1595,6 +1625,87 @@ Here is an example:
`TOP <#ts-lua-plugin>`_
+ts.base64_encode
+-----------
+**syntax:** *value = ts.base64_encode(str)*
+
+**context:** global
+
+**description:** Returns the base64 encoding of the ``str`` argument.
+
+Here is an example:
+
+::
+
+ function do_remap()
+ uri = ts.client_request.get_uri()
+ value = ts.base64_encode(uri)
+ end
+
+
+`TOP <#ts-lua-plugin>`_
+
+ts.base64_decode
+-----------
+**syntax:** *value = ts.base64_decode(str)*
+
+**context:** global
+
+**description:** Returns the base64 decoding of the ``str`` argument.
+
+Here is an example:
+
+::
+
+ function do_remap()
+ uri = ts.client_request.get_uri()
+ encoded_value = ts.base64_encode(uri)
+ decoded_value = ts.base64_decode(encoded_value)
+ end
+
+
+`TOP <#ts-lua-plugin>`_
+
+ts.escape_uri
+-----------
+**syntax:** *value = ts.escape_uri(str)*
+
+**context:** global
+
+**description:** Returns the uri-escaped value of the ``str`` argument.
+
+Here is an example:
+
+::
+
+ function do_remap()
+ test = '/some value/'
+ value = ts.escape_uri(test)
+ end
+
+`TOP <#ts-lua-plugin>`_
+
+ts.unescape_uri
+-----------
+**syntax:** *value = ts.unescape_uri(str)*
+
+**context:** global
+
+**description:** Returns the uri-unescaped value of the ``str`` argument.
+
+Here is an example:
+
+::
+
+ function do_remap()
+ test = '/some value/'
+ escaped_value = ts.escape_uri(test)
+ unescaped_value = ts.unescape_uri(escaped_value)
+ end
+
+
+`TOP <#ts-lua-plugin>`_
+
ts.intercept
------------
**syntax:** *ts.intercept(FUNCTION)*
@@ -1962,6 +2073,93 @@ Http config constants
TS_LUA_CONFIG_NET_SOCK_PACKET_MARK_OUT
TS_LUA_CONFIG_NET_SOCK_PACKET_TOS_OUT
+
+`TOP <#ts-lua-plugin>`_
+
+ts.http.timeout_set
+----------------------
+**syntax:** *ts.http.timeout_set(CONFIG, NUMBER)*
+
+**context:** do_remap or do_global_* or later.
+
+**description:** This function can be used to overwrite the timeout settings.
+
+Here is an example:
+
+::
+
+ function do_remap()
+ ts.http.timeout_set(TS_LUA_TIMEOUT_DNS, 30) -- 30 seconds
+ return 0
+ end
+
+
+`TOP <#ts-lua-plugin>`_
+
+Timeout constants
+---------------------
+**context:** do_remap or do_global_* or later
+
+::
+
+ TS_LUA_TIMEOUT_ACTIVE
+ TS_LUA_TIMEOUT_DNS
+ TS_LUA_TIMEOUT_CONNECT
+ TS_LUA_TIMEOUT_NO_ACTIVITY
+
+
+`TOP <#ts-lua-plugin>`_
+
+ts.http.client_packet_mark_set
+----------------------
+**syntax:** *ts.http.client_packet_mark_set(NUMBER)*
+
+**context:** do_remap or do_global_* or later.
+
+**description:** This function can be used to set packet mark for client connection.
+
+Here is an example:
+
+::
+
+ function do_remap()
+ ts.http.client_packet_mark_set(TS_LUA_TIMEOUT_DNS, 0)
+ return 0
+ end
+
+`TOP <#ts-lua-plugin>`_
+
+ts.http.server_packet_mark_set
+-------------------------
+**syntax:** *ts.http.server_packet_mark_set(NUMBER)*
+
+**context:** do_remap or do_global_* or later.
+
+**description:** This function can be used to set packet mark for server connection.
+
+
+`TOP <#ts-lua-plugin>`_
+
+ts.http.client_packet_tos_set
+-------------------------
+**syntax:** *ts.http.client_packet_tos_set(NUMBER)*
+
+**context:** do_remap or do_global_* or later.
+
+**description:** This function can be used to set packet tos for client connection.
+
+
+`TOP <#ts-lua-plugin>`_
+
+ts.http.server_packet_tos_set
+-------------------------
+**syntax:** *ts.http.server_packet_tos_set(NUMBER)*
+
+**context:** do_remap or do_global_* or later.
+
+**description:** This function can be used to set packet tos for server connection.
+
+
`TOP <#ts-lua-plugin>`_
ts.http.cntl_get
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e02420a4/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 1ba925d..4599787 100644
--- a/plugins/experimental/ts_lua/ts_lua_common.h
+++ b/plugins/experimental/ts_lua/ts_lua_common.h
@@ -70,6 +70,7 @@
#define TS_LUA_MAX_URL_LENGTH 2048
#define TS_LUA_MAX_OVEC_SIZE (3 * 32)
#define TS_LUA_MAX_RESIDENT_PCRE 64
+#define TS_LUA_MAX_STR_LENGTH 2048
#define TS_LUA_MIN_ALIGN sizeof(void*)
#define TS_LUA_MEM_ALIGN(size) (((size) + ((TS_LUA_MIN_ALIGN) - 1)) & ~((TS_LUA_MIN_ALIGN) - 1))
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e02420a4/plugins/experimental/ts_lua/ts_lua_crypto.c
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua_crypto.c b/plugins/experimental/ts_lua/ts_lua_crypto.c
index addd128..a3aea2f 100644
--- a/plugins/experimental/ts_lua/ts_lua_crypto.c
+++ b/plugins/experimental/ts_lua/ts_lua_crypto.c
@@ -31,6 +31,12 @@ static int ts_lua_md5_bin(lua_State * L);
static int ts_lua_sha1(lua_State * L);
static int ts_lua_sha1_bin(lua_State * L);
+static int ts_lua_base64_encode(lua_State *L);
+static int ts_lua_base64_decode(lua_State *L);
+
+static int ts_lua_escape_uri(lua_State *L);
+static int ts_lua_unescape_uri(lua_State *L);
+
void
ts_lua_inject_crypto_api(lua_State * L)
{
@@ -49,6 +55,22 @@ ts_lua_inject_crypto_api(lua_State * L)
/* ts.sha1_bin(...) */
lua_pushcfunction(L, ts_lua_sha1_bin);
lua_setfield(L, -2, "sha1_bin");
+
+ /* ts.base64_encode(...) */
+ lua_pushcfunction(L, ts_lua_base64_encode);
+ lua_setfield(L, -2, "base64_encode");
+
+ /* ts.base64_decode(...) */
+ lua_pushcfunction(L, ts_lua_base64_decode);
+ lua_setfield(L, -2, "base64_decode");
+
+ /* ts.escape_uri(...) */
+ lua_pushcfunction(L, ts_lua_escape_uri);
+ lua_setfield(L, -2, "escape_uri");
+
+ /* ts.unescape_uri(...) */
+ lua_pushcfunction(L, ts_lua_unescape_uri);
+ lua_setfield(L, -2, "unescape_uri");
}
static int
@@ -175,3 +197,137 @@ ts_lua_sha1_bin(lua_State * L)
return 1;
}
+
+static int
+ts_lua_base64_encode(lua_State *L)
+{
+ u_char *src;
+ u_char *dst;
+ size_t slen;
+ size_t dlen;
+
+ size_t length;
+
+ if (lua_gettop(L) != 1) {
+ return luaL_error(L, "expecting one argument");
+ }
+
+ if (lua_isnil(L, 1)) {
+ src = (u_char *)"";
+ slen = 0;
+ } else {
+ src = (u_char*)luaL_checklstring(L, 1, &slen);
+ }
+
+ dlen = TS_LUA_MAX_STR_LENGTH;
+ dst = lua_newuserdata(L, dlen);
+
+ if(TS_SUCCESS == TSBase64Encode((const char *)src, slen, (char *)dst, dlen,
+ &length)) {
+ lua_pushlstring( L, (char*)dst, length);
+ return 1;
+ } else {
+ return luaL_error(L, "base64 encoding error");
+ }
+}
+
+static int
+ts_lua_base64_decode(lua_State *L)
+{
+ u_char *src;
+ u_char *dst;
+ size_t slen;
+ size_t dlen;
+
+ size_t length;
+
+ if (lua_gettop(L) != 1) {
+ return luaL_error(L, "expecting one argument");
+ }
+
+ if (lua_isnil(L, 1)) {
+ src = (u_char *)"";
+ slen = 0;
+ } else {
+ src = (u_char*)luaL_checklstring(L, 1, &slen);
+ }
+
+ dlen = TS_LUA_MAX_STR_LENGTH;
+ dst = lua_newuserdata(L, dlen);
+
+ if(TS_SUCCESS == TSBase64Decode((const char *)src, slen, (unsigned char *)dst,
+ dlen, &length)) {
+ lua_pushlstring(L, (char*)dst, length);
+ return 1;
+ } else {
+ return luaL_error(L, "base64 decoding error");
+ }
+}
+
+static int
+ts_lua_escape_uri(lua_State *L)
+{
+ size_t len, dlen;
+ u_char *src, *dst;
+
+ size_t length;
+
+ if (lua_gettop(L) != 1) {
+ return luaL_error(L, "expecting one argument for ts.escape_uri(...)");
+ }
+
+ if (lua_isnil(L, 1)) {
+ lua_pushliteral(L, "");
+ return 1;
+ }
+
+ src = (u_char*)luaL_checklstring(L, 1, &len);
+ if (len == 0)
+ return 1;
+
+ dlen = TS_LUA_MAX_STR_LENGTH;
+ dst = lua_newuserdata(L, dlen);
+
+ if(TS_SUCCESS == TSStringPercentEncode((const char *)src, len, (char *)dst,
+ dlen, &length, NULL)) {
+ lua_pushlstring(L, (char *) dst, length);
+ return 1;
+ } else {
+ return luaL_error(L, "percent encoding error");
+ }
+}
+
+static int
+ts_lua_unescape_uri(lua_State *L)
+{
+ size_t len, dlen;
+ u_char *src, *dst;
+
+ size_t length;
+
+ if (lua_gettop(L) != 1) {
+ return luaL_error(L, "expecting one argument for ts.unescape_uri(...)");
+ }
+
+ if (lua_isnil(L, 1)) {
+ lua_pushliteral(L, "");
+ return 1;
+ }
+
+ src = (u_char *) luaL_checklstring(L, 1, &len);
+ if(len == 0)
+ return 1;
+
+ /* the unescaped string can only be smaller */
+ dlen = len;
+ dst = lua_newuserdata(L, dlen);
+
+ if(TS_SUCCESS == TSStringPercentDecode((const char *)src, len, (char *)dst,
+ dlen, &length)) {
+ lua_pushlstring(L, (char *) dst, length);
+ return 1;
+ } else {
+ return luaL_error(L, "percent decoding error");
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e02420a4/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 c79680b..dfc981e 100644
--- a/plugins/experimental/ts_lua/ts_lua_http.c
+++ b/plugins/experimental/ts_lua/ts_lua_http.c
@@ -47,6 +47,7 @@ static int ts_lua_http_set_retbody(lua_State * L);
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 void ts_lua_inject_cache_lookup_result_variables(lua_State * L);
@@ -92,6 +93,9 @@ ts_lua_inject_http_cache_api(lua_State * L)
lua_pushcfunction(L, ts_lua_http_get_cache_lookup_status);
lua_setfield(L, -2, "get_cache_lookup_status");
+ lua_pushcfunction(L, ts_lua_http_set_cache_lookup_status);
+ lua_setfield(L, -2, "set_cache_lookup_status");
+
lua_pushcfunction(L, ts_lua_http_set_cache_url);
lua_setfield(L, -2, "set_cache_url");
@@ -198,6 +202,22 @@ ts_lua_http_get_cache_lookup_status(lua_State * L)
}
static int
+ts_lua_http_set_cache_lookup_status(lua_State *L)
+{
+ int status;
+
+ ts_lua_http_ctx *http_ctx;
+
+ http_ctx = ts_lua_get_http_ctx(L);
+
+ status = luaL_checknumber(L, 1);
+
+ TSHttpTxnCacheLookupStatusSet(http_ctx->txnp, status);
+
+ return 0;
+}
+
+static int
ts_lua_http_set_cache_url(lua_State * L)
{
const char *url;
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e02420a4/plugins/experimental/ts_lua/ts_lua_http_config.c
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua_http_config.c b/plugins/experimental/ts_lua/ts_lua_http_config.c
index 6fe190e..ee1c8d3 100644
--- a/plugins/experimental/ts_lua/ts_lua_http_config.c
+++ b/plugins/experimental/ts_lua/ts_lua_http_config.c
@@ -85,6 +85,13 @@ typedef enum
TS_LUA_CONFIG_LAST_ENTRY = TS_CONFIG_LAST_ENTRY
} TSLuaOverridableConfigKey;
+typedef enum
+{
+ TS_LUA_TIMEOUT_ACTIVE = 0,
+ TS_LUA_TIMEOUT_CONNECT = 1,
+ TS_LUA_TIMEOUT_DNS = 2,
+ TS_LUA_TIMEOUT_NO_ACTIVITY = 3
+} TSLuaTimeoutKey;
ts_lua_var_item ts_lua_http_config_vars[] = {
TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_URL_REMAP_PRISTINE_HOST_HDR),
@@ -151,6 +158,13 @@ ts_lua_var_item ts_lua_http_config_vars[] = {
TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_LAST_ENTRY),
};
+ts_lua_var_item ts_lua_http_timeout_vars[] = {
+ TS_LUA_MAKE_VAR_ITEM(TS_LUA_TIMEOUT_ACTIVE),
+ TS_LUA_MAKE_VAR_ITEM(TS_LUA_TIMEOUT_CONNECT),
+ TS_LUA_MAKE_VAR_ITEM(TS_LUA_TIMEOUT_DNS),
+ TS_LUA_MAKE_VAR_ITEM(TS_LUA_TIMEOUT_NO_ACTIVITY),
+};
+
static void ts_lua_inject_http_config_variables(lua_State * L);
static int ts_lua_http_config_int_set(lua_State * L);
@@ -159,7 +173,11 @@ static int ts_lua_http_config_float_set(lua_State * L);
static int ts_lua_http_config_float_get(lua_State * L);
static int ts_lua_http_config_string_set(lua_State * L);
static int ts_lua_http_config_string_get(lua_State * L);
-
+static int ts_lua_http_timeout_set(lua_State * L);
+static int ts_lua_http_client_packet_mark_set(lua_State * L);
+static int ts_lua_http_server_packet_mark_set(lua_State * L);
+static int ts_lua_http_client_packet_tos_set(lua_State * L);
+static int ts_lua_http_server_packet_tos_set(lua_State * L);
void
ts_lua_inject_http_config_api(lua_State * L)
@@ -183,6 +201,21 @@ ts_lua_inject_http_config_api(lua_State * L)
lua_pushcfunction(L, ts_lua_http_config_string_get);
lua_setfield(L, -2, "config_string_get");
+
+ lua_pushcfunction(L, ts_lua_http_timeout_set);
+ lua_setfield(L, -2, "timeout_set");
+
+ lua_pushcfunction(L, ts_lua_http_client_packet_mark_set);
+ lua_setfield(L, -2, "client_packet_mark_set");
+
+ lua_pushcfunction(L, ts_lua_http_server_packet_mark_set);
+ lua_setfield(L, -2, "server_packet_mark_set");
+
+ lua_pushcfunction(L, ts_lua_http_client_packet_tos_set);
+ lua_setfield(L, -2, "client_packet_tos_set");
+
+ lua_pushcfunction(L, ts_lua_http_server_packet_tos_set);
+ lua_setfield(L, -2, "server_packet_tos_set");
}
static void
@@ -194,6 +227,11 @@ ts_lua_inject_http_config_variables(lua_State * L)
lua_pushinteger(L, ts_lua_http_config_vars[i].nvar);
lua_setglobal(L, ts_lua_http_config_vars[i].svar);
}
+
+ for (i = 0; i < sizeof(ts_lua_http_timeout_vars)/ sizeof(ts_lua_var_item); i++) {
+ lua_pushinteger(L, ts_lua_http_timeout_vars[i].nvar);
+ lua_setglobal(L, ts_lua_http_timeout_vars[i].svar);
+ }
}
static int
@@ -302,3 +340,109 @@ ts_lua_http_config_string_get(lua_State * L)
return 1;
}
+
+static int
+ts_lua_http_timeout_set(lua_State * L)
+{
+ int conf;
+ int value;
+ ts_lua_http_ctx *http_ctx;
+
+ http_ctx = ts_lua_get_http_ctx(L);
+
+ conf = luaL_checkinteger(L, 1);
+ value = luaL_checkinteger(L, 2);
+
+ switch(conf) {
+ case TS_LUA_TIMEOUT_ACTIVE:
+ TSDebug(TS_LUA_DEBUG_TAG, "setting active timeout");
+ TSHttpTxnActiveTimeoutSet(http_ctx->txnp, value);
+ break;
+
+ case TS_LUA_TIMEOUT_CONNECT:
+ TSDebug(TS_LUA_DEBUG_TAG, "setting connect timeout");
+ TSHttpTxnConnectTimeoutSet(http_ctx->txnp, value);
+ break;
+
+ case TS_LUA_TIMEOUT_DNS:
+ TSDebug(TS_LUA_DEBUG_TAG, "setting dns timeout");
+ TSHttpTxnDNSTimeoutSet(http_ctx->txnp, value);
+ break;
+
+ case TS_LUA_TIMEOUT_NO_ACTIVITY:
+ TSDebug(TS_LUA_DEBUG_TAG, "setting no activity timeout");
+ TSHttpTxnNoActivityTimeoutSet(http_ctx->txnp, value);
+ break;
+
+ default:
+ TSError("unsupported timeout config option for lua plugin");
+ break;
+ }
+
+ return 0;
+}
+
+static int
+ts_lua_http_client_packet_mark_set(lua_State * L)
+{
+ int value;
+ ts_lua_http_ctx *http_ctx;
+
+ http_ctx = ts_lua_get_http_ctx(L);
+
+ value = luaL_checkinteger(L, 1);
+
+ TSDebug(TS_LUA_DEBUG_TAG, "client packet mark set");
+ TSHttpTxnClientPacketMarkSet(http_ctx->txnp, value);
+
+ return 0;
+}
+
+static int
+ts_lua_http_server_packet_mark_set(lua_State * L)
+{
+ int value;
+ ts_lua_http_ctx *http_ctx;
+
+ http_ctx = ts_lua_get_http_ctx(L);
+
+ value = luaL_checkinteger(L, 1);
+
+ TSDebug(TS_LUA_DEBUG_TAG, "server packet mark set");
+ TSHttpTxnServerPacketMarkSet(http_ctx->txnp, value);
+
+ return 0;
+}
+
+static int
+ts_lua_http_client_packet_tos_set(lua_State * L)
+{
+ int value;
+ ts_lua_http_ctx *http_ctx;
+
+ http_ctx = ts_lua_get_http_ctx(L);
+
+ value = luaL_checkinteger(L, 1);
+
+ TSDebug(TS_LUA_DEBUG_TAG, "client packet tos set");
+ TSHttpTxnClientPacketTosSet(http_ctx->txnp, value);
+
+ return 0;
+}
+
+static int
+ts_lua_http_server_packet_tos_set(lua_State * L)
+{
+ int value;
+ ts_lua_http_ctx *http_ctx;
+
+ http_ctx = ts_lua_get_http_ctx(L);
+
+ value = luaL_checkinteger(L, 1);
+
+ TSDebug(TS_LUA_DEBUG_TAG, "server packet tos set");
+ TSHttpTxnServerPacketTosSet(http_ctx->txnp, value);
+
+ return 0;
+}
+