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/12/02 08:37:28 UTC
trafficserver git commit: TS-4045: improvement on ts_lua plugin. This
closes #357
Repository: trafficserver
Updated Branches:
refs/heads/master 076279261 -> 2121859b3
TS-4045: improvement on ts_lua plugin. This closes #357
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/2121859b
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/2121859b
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/2121859b
Branch: refs/heads/master
Commit: 2121859b3868e49631f128b7bea993e19eba2cc1
Parents: 0762792
Author: Kit Chan <ki...@apache.org>
Authored: Tue Dec 1 23:37:21 2015 -0800
Committer: Kit Chan <ki...@apache.org>
Committed: Tue Dec 1 23:37:21 2015 -0800
----------------------------------------------------------------------
doc/admin-guide/plugins/ts_lua.en.rst | 20 ++++++++
.../ts_lua/ts_lua_cached_response.c | 8 ++--
.../experimental/ts_lua/ts_lua_client_request.c | 50 ++++++++++----------
.../ts_lua/ts_lua_client_response.c | 17 +++----
plugins/experimental/ts_lua/ts_lua_fetch.c | 4 +-
plugins/experimental/ts_lua/ts_lua_http.c | 34 ++++++++-----
plugins/experimental/ts_lua/ts_lua_http_cntl.c | 4 +-
.../experimental/ts_lua/ts_lua_http_config.c | 47 ++++++++++++------
.../experimental/ts_lua/ts_lua_http_intercept.c | 16 ++++++-
.../experimental/ts_lua/ts_lua_http_milestone.c | 2 +-
plugins/experimental/ts_lua/ts_lua_remap.c | 20 ++++----
.../experimental/ts_lua/ts_lua_server_request.c | 26 +++++-----
.../ts_lua/ts_lua_server_response.c | 14 +++---
plugins/experimental/ts_lua/ts_lua_util.h | 7 +++
14 files changed, 168 insertions(+), 101 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/doc/admin-guide/plugins/ts_lua.en.rst
----------------------------------------------------------------------
diff --git a/doc/admin-guide/plugins/ts_lua.en.rst b/doc/admin-guide/plugins/ts_lua.en.rst
index 37d11f2..27b27a8 100644
--- a/doc/admin-guide/plugins/ts_lua.en.rst
+++ b/doc/admin-guide/plugins/ts_lua.en.rst
@@ -2687,6 +2687,26 @@ Here is an example:
`TOP <#ts-lua-plugin>`_
+ts.http.set_debug
+-----------------
+**syntax:** *ts.http.set_debug(NUMBER)*
+
+**context:** do_remap or do_global_* or later.
+
+**decription:** This function can be used to enable debug log for the transaction
+
+Here is an example:
+
+::
+
+ function do_remap()
+ ts.http.set_debug(1)
+ return 0
+ end
+
+
+`TOP <#ts-lua-plugin>`_
+
ts.http.cntl_get
----------------
**syntax:** *val = ts.http.cntl_get(CNTL_TYPE)*
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/plugins/experimental/ts_lua/ts_lua_cached_response.c
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua_cached_response.c b/plugins/experimental/ts_lua/ts_lua_cached_response.c
index 01be519..2c52e8f 100644
--- a/plugins/experimental/ts_lua/ts_lua_cached_response.c
+++ b/plugins/experimental/ts_lua/ts_lua_cached_response.c
@@ -103,7 +103,7 @@ ts_lua_cached_response_get_status(lua_State *L)
int status;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_CACHED_RESPONSE_HDR(http_ctx);
@@ -123,7 +123,7 @@ ts_lua_cached_response_get_version(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_CACHED_RESPONSE_HDR(http_ctx);
@@ -150,7 +150,7 @@ ts_lua_cached_response_header_get(lua_State *L)
TSMLoc field_loc;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
/* we skip the first argument that is the table */
key = luaL_checklstring(L, 2, &key_len);
@@ -193,7 +193,7 @@ ts_lua_cached_response_get_headers(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_CACHED_RESPONSE_HDR(http_ctx);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/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 7151971..7a729ab 100644
--- a/plugins/experimental/ts_lua/ts_lua_client_request.c
+++ b/plugins/experimental/ts_lua/ts_lua_client_request.c
@@ -145,7 +145,7 @@ ts_lua_client_request_header_get(lua_State *L)
TSMLoc field_loc;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
/* we skip the first argument that is the table */
key = luaL_checklstring(L, 2, &key_len);
@@ -181,7 +181,7 @@ ts_lua_client_request_header_set(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
remove = 0;
val = NULL;
@@ -239,7 +239,7 @@ ts_lua_client_request_get_headers(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
lua_newtable(L);
@@ -305,7 +305,7 @@ ts_lua_client_request_get_url(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
url = TSHttpTxnEffectiveUrlStringGet(http_ctx->txnp, &url_len);
@@ -331,7 +331,7 @@ ts_lua_client_request_get_pristine_url(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
if (TSHttpTxnPristineUrlGet(http_ctx->txnp, &bufp, &url_loc) != TS_SUCCESS)
return 0;
@@ -359,7 +359,7 @@ ts_lua_client_request_get_url_host(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
host = TSUrlHostGet(http_ctx->client_request_bufp, http_ctx->client_request_url, &len);
@@ -398,7 +398,7 @@ ts_lua_client_request_set_url_host(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
host = luaL_checklstring(L, 1, &len);
@@ -414,7 +414,7 @@ ts_lua_client_request_get_url_port(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
port = TSUrlPortGet(http_ctx->client_request_bufp, http_ctx->client_request_url);
@@ -430,7 +430,7 @@ ts_lua_client_request_set_url_port(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
port = luaL_checkint(L, 1);
@@ -447,7 +447,7 @@ ts_lua_client_request_get_url_scheme(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
scheme = TSUrlSchemeGet(http_ctx->client_request_bufp, http_ctx->client_request_url, &len);
@@ -464,7 +464,7 @@ ts_lua_client_request_set_url_scheme(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
scheme = luaL_checklstring(L, 1, &len);
@@ -483,7 +483,7 @@ ts_lua_client_request_get_uri(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
path = TSUrlPathGet(http_ctx->client_request_bufp, http_ctx->client_request_url, &path_len);
@@ -506,7 +506,7 @@ ts_lua_client_request_set_uri(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
path = luaL_checklstring(L, 1, &path_len);
@@ -539,7 +539,7 @@ ts_lua_client_request_get_uri_args(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
param = TSUrlHttpQueryGet(http_ctx->client_request_bufp, http_ctx->client_request_url, ¶m_len);
@@ -560,7 +560,7 @@ ts_lua_client_request_set_uri_args(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
param = luaL_checklstring(L, 1, ¶m_len);
TSUrlHttpQuerySet(http_ctx->client_request_bufp, http_ctx->client_request_url, param, param_len);
@@ -575,7 +575,7 @@ ts_lua_client_request_client_addr_get_ip(lua_State *L)
char cip[128];
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
client_ip = TSHttpTxnClientAddrGet(http_ctx->txnp);
@@ -602,7 +602,7 @@ ts_lua_client_request_client_addr_get_port(lua_State *L)
ts_lua_http_ctx *http_ctx;
int port;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
client_ip = TSHttpTxnClientAddrGet(http_ctx->txnp);
@@ -629,7 +629,7 @@ ts_lua_client_request_client_addr_get_incoming_port(lua_State *L)
ts_lua_http_ctx *http_ctx;
int port;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
incoming_addr = TSHttpTxnIncomingAddrGet(http_ctx->txnp);
@@ -658,7 +658,7 @@ ts_lua_client_request_client_addr_get_addr(lua_State *L)
int family;
char cip[128];
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
client_ip = TSHttpTxnClientAddrGet(http_ctx->txnp);
@@ -704,7 +704,7 @@ ts_lua_client_request_get_method(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
method = TSHttpHdrMethodGet(http_ctx->client_request_bufp, http_ctx->client_request_hdrp, &method_len);
@@ -725,7 +725,7 @@ ts_lua_client_request_set_method(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
method = luaL_checklstring(L, 1, &method_len);
@@ -749,7 +749,7 @@ ts_lua_client_request_get_body_size(lua_State *L)
int64_t body_size;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
body_size = TSHttpTxnClientReqBodyBytesGet(http_ctx->txnp);
lua_pushnumber(L, body_size);
@@ -776,7 +776,7 @@ ts_lua_client_request_get_version(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
version = TSHttpHdrVersionGet(http_ctx->client_request_bufp, http_ctx->client_request_hdrp);
@@ -799,7 +799,7 @@ ts_lua_client_request_set_version(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
version = luaL_checklstring(L, 1, &len);
@@ -823,7 +823,7 @@ ts_lua_client_request_get_header_size(lua_State *L)
int header_size;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
header_size = TSHttpTxnClientReqHdrBytesGet(http_ctx->txnp);
lua_pushnumber(L, header_size);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/plugins/experimental/ts_lua/ts_lua_client_response.c
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua_client_response.c b/plugins/experimental/ts_lua/ts_lua_client_response.c
index d4142b1..7e7d7f4 100644
--- a/plugins/experimental/ts_lua/ts_lua_client_response.c
+++ b/plugins/experimental/ts_lua/ts_lua_client_response.c
@@ -89,7 +89,7 @@ ts_lua_client_response_header_get(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
/* we skip the first argument that is the table */
key = luaL_checklstring(L, 2, &key_len);
@@ -132,7 +132,7 @@ ts_lua_client_response_header_set(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
remove = 0;
val = NULL;
@@ -196,7 +196,7 @@ ts_lua_client_response_get_headers(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_CLIENT_RESPONSE_HDR(http_ctx);
@@ -247,7 +247,7 @@ ts_lua_client_response_get_status(lua_State *L)
int status;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_CLIENT_RESPONSE_HDR(http_ctx);
@@ -267,7 +267,7 @@ ts_lua_client_response_set_status(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_CLIENT_RESPONSE_HDR(http_ctx);
@@ -291,7 +291,7 @@ ts_lua_client_response_get_version(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_CLIENT_RESPONSE_HDR(http_ctx);
@@ -316,7 +316,7 @@ ts_lua_client_response_set_version(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_CLIENT_RESPONSE_HDR(http_ctx);
@@ -343,7 +343,8 @@ ts_lua_client_response_set_error_resp(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
+
TS_LUA_CHECK_CLIENT_RESPONSE_HDR(http_ctx);
n = lua_gettop(L);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/plugins/experimental/ts_lua/ts_lua_fetch.c
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua_fetch.c b/plugins/experimental/ts_lua/ts_lua_fetch.c
index 39cf66a..6f9f314 100644
--- a/plugins/experimental/ts_lua/ts_lua_fetch.c
+++ b/plugins/experimental/ts_lua/ts_lua_fetch.c
@@ -489,8 +489,8 @@ ts_lua_fill_one_result(lua_State *L, ts_lua_fetch_info *fi)
TSfree(dst);
}
- // truncked
- lua_pushlstring(L, "truncked", sizeof("truncked") - 1);
+ // truncated
+ lua_pushlstring(L, "truncated", sizeof("truncated") - 1);
if (fi->failed) {
lua_pushboolean(L, 1);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/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 3ed16ea..69c246b 100644
--- a/plugins/experimental/ts_lua/ts_lua_http.c
+++ b/plugins/experimental/ts_lua/ts_lua_http.c
@@ -171,7 +171,7 @@ ts_lua_http_set_retstatus(lua_State *L)
int status;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
status = luaL_checkinteger(L, 1);
TSHttpTxnSetHttpRetStatus(http_ctx->txnp, status);
@@ -185,7 +185,7 @@ ts_lua_http_set_retbody(lua_State *L)
size_t body_len;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
body = luaL_checklstring(L, 1, &body_len);
TSHttpTxnErrorBodySet(http_ctx->txnp, TSstrdup(body), body_len, NULL); // Defaults to text/html
@@ -200,7 +200,7 @@ ts_lua_http_set_resp(lua_State *L)
size_t body_len;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
n = lua_gettop(L);
@@ -222,7 +222,7 @@ ts_lua_http_get_cache_lookup_status(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
if (TSHttpTxnCacheLookupStatusGet(http_ctx->txnp, &status) == TS_ERROR) {
lua_pushnil(L);
@@ -240,7 +240,7 @@ ts_lua_http_set_cache_lookup_status(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
status = luaL_checknumber(L, 1);
@@ -260,7 +260,7 @@ ts_lua_http_get_cache_lookup_url(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
if (TSUrlCreate(http_ctx->client_request_bufp, &url) != TS_SUCCESS) {
lua_pushnil(L);
@@ -301,7 +301,7 @@ ts_lua_http_set_cache_lookup_url(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
url = luaL_checklstring(L, 1, &url_len);
@@ -329,7 +329,7 @@ ts_lua_http_set_cache_url(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
url = luaL_checklstring(L, 1, &url_len);
@@ -362,7 +362,7 @@ ts_lua_http_resp_cache_transformed(lua_State *L)
int action;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
action = luaL_checkinteger(L, 1);
@@ -377,7 +377,7 @@ ts_lua_http_resp_cache_untransformed(lua_State *L)
int action;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
action = luaL_checkinteger(L, 1);
@@ -392,7 +392,7 @@ ts_lua_http_is_internal_request(lua_State *L)
TSReturnCode ret;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
ret = TSHttpTxnIsInternal(http_ctx->txnp);
@@ -412,7 +412,7 @@ ts_lua_http_skip_remapping_set(lua_State *L)
int action;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
action = luaL_checkinteger(L, 1);
@@ -426,7 +426,7 @@ ts_lua_http_transaction_count(lua_State *L)
{
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TSHttpSsn ssn = TSHttpTxnSsnGet(http_ctx->txnp);
if (ssn) {
@@ -445,6 +445,10 @@ ts_lua_http_resp_transform_get_upstream_bytes(lua_State *L)
ts_lua_http_transform_ctx *transform_ctx;
transform_ctx = ts_lua_get_http_transform_ctx(L);
+ if (transform_ctx == NULL) {
+ TSError("[ts_lua] missing transform_ctx");
+ return 0;
+ }
lua_pushnumber(L, transform_ctx->upstream_bytes);
@@ -458,6 +462,10 @@ ts_lua_http_resp_transform_set_downstream_bytes(lua_State *L)
ts_lua_http_transform_ctx *transform_ctx;
transform_ctx = ts_lua_get_http_transform_ctx(L);
+ if (transform_ctx == NULL) {
+ TSError("[ts_lua] missing transform_ctx");
+ return 0;
+ }
n = luaL_checkinteger(L, 1);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/plugins/experimental/ts_lua/ts_lua_http_cntl.c
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua_http_cntl.c b/plugins/experimental/ts_lua/ts_lua_http_cntl.c
index d2c1390..b12da71 100644
--- a/plugins/experimental/ts_lua/ts_lua_http_cntl.c
+++ b/plugins/experimental/ts_lua/ts_lua_http_cntl.c
@@ -68,7 +68,7 @@ ts_lua_http_cntl_set(lua_State *L)
int value;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
cntl_type = luaL_checkinteger(L, 1);
value = luaL_checkinteger(L, 2);
@@ -85,7 +85,7 @@ ts_lua_http_cntl_get(lua_State *L)
int64_t value;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
cntl_type = luaL_checkinteger(L, 1);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/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 05edf21..738cd0d 100644
--- a/plugins/experimental/ts_lua/ts_lua_http_config.c
+++ b/plugins/experimental/ts_lua/ts_lua_http_config.c
@@ -224,6 +224,7 @@ static int ts_lua_http_server_packet_tos_set(lua_State *L);
static int ts_lua_http_client_packet_dscp_set(lua_State *L);
static int ts_lua_http_server_packet_dscp_set(lua_State *L);
static int ts_lua_http_enable_redirect(lua_State *L);
+static int ts_lua_http_set_debug(lua_State *L);
void
ts_lua_inject_http_config_api(lua_State *L)
@@ -271,6 +272,9 @@ ts_lua_inject_http_config_api(lua_State *L)
lua_pushcfunction(L, ts_lua_http_enable_redirect);
lua_setfield(L, -2, "enable_redirect");
+
+ lua_pushcfunction(L, ts_lua_http_set_debug);
+ lua_setfield(L, -2, "set_debug");
}
static void
@@ -296,7 +300,7 @@ ts_lua_http_config_int_set(lua_State *L)
int value;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
conf = luaL_checkinteger(L, 1);
value = luaL_checkinteger(L, 2);
@@ -313,7 +317,7 @@ ts_lua_http_config_int_get(lua_State *L)
int64_t value;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
conf = luaL_checkinteger(L, 1);
@@ -331,7 +335,7 @@ ts_lua_http_config_float_set(lua_State *L)
float value;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
conf = luaL_checkinteger(L, 1);
value = luaL_checknumber(L, 2);
@@ -348,7 +352,7 @@ ts_lua_http_config_float_get(lua_State *L)
float value;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
conf = luaL_checkinteger(L, 1);
@@ -367,7 +371,7 @@ ts_lua_http_config_string_set(lua_State *L)
size_t value_len;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
conf = luaL_checkinteger(L, 1);
value = luaL_checklstring(L, 2, &value_len);
@@ -385,7 +389,7 @@ ts_lua_http_config_string_get(lua_State *L)
int value_len;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
conf = luaL_checkinteger(L, 1);
@@ -403,7 +407,7 @@ ts_lua_http_timeout_set(lua_State *L)
int value;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
conf = luaL_checkinteger(L, 1);
value = luaL_checkinteger(L, 2);
@@ -443,7 +447,7 @@ 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);
+ GET_HTTP_CONTEXT(http_ctx, L);
value = luaL_checkinteger(L, 1);
@@ -459,7 +463,7 @@ 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);
+ GET_HTTP_CONTEXT(http_ctx, L);
value = luaL_checkinteger(L, 1);
@@ -475,7 +479,7 @@ 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);
+ GET_HTTP_CONTEXT(http_ctx, L);
value = luaL_checkinteger(L, 1);
@@ -491,7 +495,7 @@ ts_lua_http_enable_redirect(lua_State *L)
int value;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
value = luaL_checkinteger(L, 1);
@@ -501,6 +505,21 @@ ts_lua_http_enable_redirect(lua_State *L)
return 0;
}
+static int
+ts_lua_http_set_debug(lua_State *L)
+{
+ int value;
+ ts_lua_http_ctx *http_ctx;
+
+ GET_HTTP_CONTEXT(http_ctx, L);
+
+ value = luaL_checkinteger(L, 1);
+
+ TSDebug(TS_LUA_DEBUG_TAG, "set debug");
+ TSHttpTxnDebugSet(http_ctx->txnp, value);
+
+ return 0;
+}
static int
ts_lua_http_server_packet_tos_set(lua_State *L)
@@ -508,7 +527,7 @@ 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);
+ GET_HTTP_CONTEXT(http_ctx, L);
value = luaL_checkinteger(L, 1);
@@ -524,7 +543,7 @@ ts_lua_http_client_packet_dscp_set(lua_State *L)
int value;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
value = luaL_checkinteger(L, 1);
@@ -540,7 +559,7 @@ ts_lua_http_server_packet_dscp_set(lua_State *L)
int value;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
value = luaL_checkinteger(L, 1);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/plugins/experimental/ts_lua/ts_lua_http_intercept.c
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua_http_intercept.c b/plugins/experimental/ts_lua/ts_lua_http_intercept.c
index e2fbd9d..58467ca 100644
--- a/plugins/experimental/ts_lua/ts_lua_http_intercept.c
+++ b/plugins/experimental/ts_lua/ts_lua_http_intercept.c
@@ -70,7 +70,8 @@ ts_lua_http_intercept(lua_State *L)
ts_lua_http_ctx *http_ctx;
ts_lua_http_intercept_ctx *ictx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
+
n = lua_gettop(L);
if (n < 1) {
@@ -102,7 +103,8 @@ ts_lua_http_server_intercept(lua_State *L)
ts_lua_http_ctx *http_ctx;
ts_lua_http_intercept_ctx *ictx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
+
n = lua_gettop(L);
if (n < 1) {
@@ -354,6 +356,11 @@ ts_lua_say(lua_State *L)
ts_lua_http_intercept_ctx *ictx;
ictx = ts_lua_get_http_intercept_ctx(L);
+ if (ictx == NULL) {
+ TSError("[ts_lua] missing ictx");
+ return 0;
+ }
+
data = luaL_checklstring(L, 1, &len);
if (len > 0) {
@@ -371,6 +378,11 @@ ts_lua_flush(lua_State *L)
ts_lua_http_intercept_ctx *ictx;
ictx = ts_lua_get_http_intercept_ctx(L);
+ if (ictx == NULL) {
+ TSError("[ts_lua] missing ictx");
+ return 0;
+ }
+
avail = TSIOBufferReaderAvail(ictx->output.reader);
if (avail > 0) {
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/plugins/experimental/ts_lua/ts_lua_http_milestone.c
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua_http_milestone.c b/plugins/experimental/ts_lua/ts_lua_http_milestone.c
index 93105cc..82bf25e 100644
--- a/plugins/experimental/ts_lua/ts_lua_http_milestone.c
+++ b/plugins/experimental/ts_lua/ts_lua_http_milestone.c
@@ -92,7 +92,7 @@ ts_lua_http_milestone_get(lua_State *L)
TSHRTime epoch;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
milestone_type = luaL_checkinteger(L, 1);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/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 3459158..1b53788 100644
--- a/plugins/experimental/ts_lua/ts_lua_remap.c
+++ b/plugins/experimental/ts_lua/ts_lua_remap.c
@@ -108,7 +108,7 @@ ts_lua_remap_get_from_url_host(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
if (http_ctx->rri != NULL) {
host = TSUrlHostGet(http_ctx->client_request_bufp, http_ctx->rri->mapFromUrl, &len);
@@ -132,7 +132,7 @@ ts_lua_remap_get_from_url_port(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
if (http_ctx->rri != NULL) {
port = TSUrlPortGet(http_ctx->client_request_bufp, http_ctx->rri->mapFromUrl);
@@ -153,7 +153,7 @@ ts_lua_remap_get_from_url_scheme(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
if (http_ctx->rri != NULL) {
scheme = TSUrlSchemeGet(http_ctx->client_request_bufp, http_ctx->rri->mapFromUrl, &len);
@@ -180,7 +180,7 @@ ts_lua_remap_get_from_uri(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
if (http_ctx->rri != NULL) {
path = TSUrlPathGet(http_ctx->client_request_bufp, http_ctx->rri->mapFromUrl, &path_len);
@@ -209,7 +209,7 @@ ts_lua_remap_get_from_url(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
if (http_ctx->rri != NULL) {
url = TSUrlStringGet(http_ctx->client_request_bufp, http_ctx->rri->mapFromUrl, &url_len);
@@ -238,7 +238,7 @@ ts_lua_remap_get_to_url_host(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
if (http_ctx->rri != NULL) {
host = TSUrlHostGet(http_ctx->client_request_bufp, http_ctx->rri->mapToUrl, &len);
@@ -262,7 +262,7 @@ ts_lua_remap_get_to_url_port(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
if (http_ctx->rri != NULL) {
port = TSUrlPortGet(http_ctx->client_request_bufp, http_ctx->rri->mapToUrl);
@@ -283,7 +283,7 @@ ts_lua_remap_get_to_url_scheme(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
if (http_ctx->rri != NULL) {
scheme = TSUrlSchemeGet(http_ctx->client_request_bufp, http_ctx->rri->mapToUrl, &len);
@@ -310,7 +310,7 @@ ts_lua_remap_get_to_uri(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
if (http_ctx->rri != NULL) {
path = TSUrlPathGet(http_ctx->client_request_bufp, http_ctx->rri->mapToUrl, &path_len);
@@ -339,7 +339,7 @@ ts_lua_remap_get_to_url(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
if (http_ctx->rri != NULL) {
url = TSUrlStringGet(http_ctx->client_request_bufp, http_ctx->rri->mapToUrl, &url_len);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/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 9f40fcb..326d266 100644
--- a/plugins/experimental/ts_lua/ts_lua_server_request.c
+++ b/plugins/experimental/ts_lua/ts_lua_server_request.c
@@ -137,7 +137,7 @@ ts_lua_server_request_header_get(lua_State *L)
TSMLoc field_loc;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
/* we skip the first argument that is the table */
key = luaL_checklstring(L, 2, &key_len);
@@ -180,7 +180,7 @@ ts_lua_server_request_header_set(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
remove = 0;
val = NULL;
@@ -244,7 +244,7 @@ ts_lua_server_request_get_headers(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_SERVER_REQUEST_HDR(http_ctx);
@@ -282,7 +282,7 @@ ts_lua_server_request_get_header_size(lua_State *L)
int header_size;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
header_size = TSHttpTxnServerReqHdrBytesGet(http_ctx->txnp);
lua_pushnumber(L, header_size);
@@ -303,7 +303,7 @@ ts_lua_server_request_get_body_size(lua_State *L)
int64_t body_size;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
body_size = TSHttpTxnServerReqBodyBytesGet(http_ctx->txnp);
lua_pushnumber(L, body_size);
@@ -331,7 +331,7 @@ ts_lua_server_request_get_uri(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_SERVER_REQUEST_URL(http_ctx);
@@ -356,7 +356,7 @@ ts_lua_server_request_set_uri(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_SERVER_REQUEST_URL(http_ctx);
@@ -390,7 +390,7 @@ ts_lua_server_request_set_uri_args(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_SERVER_REQUEST_URL(http_ctx);
@@ -408,7 +408,7 @@ ts_lua_server_request_get_uri_args(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_SERVER_REQUEST_URL(http_ctx);
@@ -431,7 +431,7 @@ ts_lua_server_request_server_addr_get_ip(lua_State *L)
char sip[128];
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
server_ip = TSHttpTxnServerAddrGet(http_ctx->txnp);
@@ -458,7 +458,7 @@ ts_lua_server_request_server_addr_get_port(lua_State *L)
ts_lua_http_ctx *http_ctx;
int port;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
server_ip = TSHttpTxnServerAddrGet(http_ctx->txnp);
@@ -485,7 +485,7 @@ ts_lua_server_request_server_addr_get_outgoing_port(lua_State *L)
ts_lua_http_ctx *http_ctx;
int port;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
outgoing_addr = TSHttpTxnOutgoingAddrGet(http_ctx->txnp);
@@ -514,7 +514,7 @@ ts_lua_server_request_server_addr_get_addr(lua_State *L)
int family;
char sip[128];
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
server_ip = TSHttpTxnServerAddrGet(http_ctx->txnp);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/plugins/experimental/ts_lua/ts_lua_server_response.c
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua_server_response.c b/plugins/experimental/ts_lua/ts_lua_server_response.c
index 24bbef9..caa35d2 100644
--- a/plugins/experimental/ts_lua/ts_lua_server_response.c
+++ b/plugins/experimental/ts_lua/ts_lua_server_response.c
@@ -95,7 +95,7 @@ ts_lua_server_response_get_headers(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_SERVER_RESPONSE_HDR(http_ctx);
@@ -146,7 +146,7 @@ ts_lua_server_response_header_get(lua_State *L)
TSMLoc field_loc;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
/* we skip the first argument that is the table */
key = luaL_checklstring(L, 2, &key_len);
@@ -184,7 +184,7 @@ ts_lua_server_response_header_set(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
remove = 0;
val = NULL;
@@ -231,7 +231,7 @@ ts_lua_server_response_get_status(lua_State *L)
int status;
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_SERVER_RESPONSE_HDR(http_ctx);
@@ -251,7 +251,7 @@ ts_lua_server_response_set_status(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_SERVER_RESPONSE_HDR(http_ctx);
@@ -275,7 +275,7 @@ ts_lua_server_response_get_version(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_SERVER_RESPONSE_HDR(http_ctx);
@@ -301,7 +301,7 @@ ts_lua_server_response_set_version(lua_State *L)
ts_lua_http_ctx *http_ctx;
- http_ctx = ts_lua_get_http_ctx(L);
+ GET_HTTP_CONTEXT(http_ctx, L);
TS_LUA_CHECK_SERVER_RESPONSE_HDR(http_ctx);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/2121859b/plugins/experimental/ts_lua/ts_lua_util.h
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua_util.h b/plugins/experimental/ts_lua/ts_lua_util.h
index d8a003b..7cd7675 100644
--- a/plugins/experimental/ts_lua/ts_lua_util.h
+++ b/plugins/experimental/ts_lua/ts_lua_util.h
@@ -42,6 +42,13 @@ ts_lua_cont_info *ts_lua_get_cont_info(lua_State *L);
void ts_lua_set_http_ctx(lua_State *L, ts_lua_http_ctx *ctx);
ts_lua_http_ctx *ts_lua_get_http_ctx(lua_State *L);
+#define GET_HTTP_CONTEXT(ctx, list) \
+ ctx = ts_lua_get_http_ctx(list); \
+ if (ctx == NULL) { \
+ TSError("[ts_lua] missing http_ctx"); \
+ return 0; \
+ }
+
ts_lua_http_ctx *ts_lua_create_http_ctx(ts_lua_main_ctx *mctx, ts_lua_instance_conf *conf);
void ts_lua_destroy_http_ctx(ts_lua_http_ctx *http_ctx);