Simple and miscellaneous fixes/additions for lua plugin
diff --git a/doc/admin-guide/plugins/lua.en.rst b/doc/admin-guide/plugins/lua.en.rst
index 3200f0a..281246c 100644
--- a/doc/admin-guide/plugins/lua.en.rst
+++ b/doc/admin-guide/plugins/lua.en.rst
@@ -213,6 +213,38 @@
:ref:`TOP <admin-plugins-ts-lua>`
+ts.fatal
+--------
+**syntax:** *ts.fatal(MESSAGE)*
+
+**context:** global
+
+**description**: Log the MESSAGE to error.log and shutdown Traffic Server
+
+Here is an example:
+
+::
+
+ ts.fatal('This is an fatal message')
+
+:ref:`TOP <admin-plugins-ts-lua>`
+
+ts.emergency
+------------
+**syntax:** *ts.emergency(MESSAGE)*
+
+**context:** global
+
+**description**: Log the MESSAGE to error.log and shutdown Traffic Server
+
+Here is an example:
+
+::
+
+ ts.emergency('This is an emergency message')
+
+:ref:`TOP <admin-plugins-ts-lua>`
+
TS Basic Internal Information
-----------------------------
**syntax:** *ts.get_install_dir()*
@@ -1093,6 +1125,16 @@
:ref:`TOP <admin-plugins-ts-lua>`
+ts.http.redo_cache_lookup
+-------------------------
+**syntax:** *ts.http.redo_cache_lookup()*
+
+**context:** do_global_cache_lookup_complete
+
+**description:** This function can be used to redo cache lookup with a different url.
+
+:ref:`TOP <admin-plugins-ts-lua>`
+
ts.http.get_parent_proxy
------------------------
**syntax:** *ts.http.get_parent_proxy()*
@@ -2432,6 +2474,9 @@
return 0
end
+The above example also shows the use of eos passed as a parameter to transform function. It indicates the end of the
+data stream to the transform function.
+
:ref:`TOP <admin-plugins-ts-lua>`
ts.http.resp_transform.get_upstream_watermark_bytes
@@ -3808,7 +3853,7 @@
:ref:`TOP <admin-plugins-ts-lua>`
Milestone constants
-------------------------------
+-------------------
**context:** do_remap/do_os_response or do_global_* or later
::
@@ -3841,6 +3886,36 @@
:ref:`TOP <admin-plugins-ts-lua>`
+ts.http.txn_info_get
+--------------------
+**syntax:** *val = ts.http.txn_info_get(TXN_INFO_TYPE)*
+
+**context:** do_global_cache_lookup_complete
+
+**description:** This function can be used to retrieve the various cache related info about a transaction.
+
+::
+
+ val = ts.http.txn_info_get(TS_LUA_TXN_INFO_CACHE_HIT_RAM)
+
+:ref:`TOP <admin-plugins-ts-lua>`
+
+Txn Info constants
+------------------
+**context:** do_global_cache_lookup_complete
+
+::
+
+ TS_LUA_TXN_INFO_CACHE_HIT_RAM
+ TS_LUA_TXN_INFO_CACHE_COMPRESSED_IN_RAM
+ TS_LUA_TXN_INFO_CACHE_HIT_RWW
+ TS_LUA_TXN_INFO_CACHE_OPEN_READ_TRIES
+ TS_LUA_TXN_INFO_CACHE_OPEN_WRITE_TRIES
+ TS_LUA_TXN_INFo_CACHE_VOLUME
+
+
+:ref:`TOP <admin-plugins-ts-lua>`
+
ts.mgmt.get_counter
-------------------
**syntax:** *val = ts.mgmt.get_counter(RECORD_NAME)*
diff --git a/plugins/lua/Makefile.inc b/plugins/lua/Makefile.inc
index adcdde5..d68faa8 100644
--- a/plugins/lua/Makefile.inc
+++ b/plugins/lua/Makefile.inc
@@ -37,6 +37,7 @@
lua/ts_lua_remap.c \
lua/ts_lua_http_cntl.c \
lua/ts_lua_http_milestone.c \
+ lua/ts_lua_http_txn_info.c \
lua/ts_lua_http_config.c \
lua/ts_lua_mgmt.c \
lua/ts_lua_package.c \
diff --git a/plugins/lua/ts_lua.c b/plugins/lua/ts_lua.c
index 5aef7b5..685fe35 100644
--- a/plugins/lua/ts_lua.c
+++ b/plugins/lua/ts_lua.c
@@ -239,7 +239,7 @@
ts_lua_set_cont_info(L, NULL);
if (lua_pcall(L, 0, 1, 0) != 0) {
- TSError("[ts_lua] lua_pcall failed: %s", lua_tostring(L, -1));
+ TSError("[ts_lua][%s] lua_pcall failed: %s", __FUNCTION__, lua_tostring(L, -1));
ret = TSREMAP_NO_REMAP;
} else {
@@ -364,6 +364,7 @@
// to allow API(s) to fetch the pointers again when it re-enters the hook
if (http_ctx->client_response_hdrp != NULL) {
TSHandleMLocRelease(http_ctx->client_response_bufp, TS_NULL_MLOC, http_ctx->client_response_hdrp);
+ http_ctx->client_response_bufp = NULL;
http_ctx->client_response_hdrp = NULL;
}
lua_getglobal(l, TS_LUA_FUNCTION_G_SEND_RESPONSE);
@@ -416,12 +417,21 @@
ts_lua_set_cont_info(l, NULL);
if (lua_pcall(l, 0, 1, 0) != 0) {
- TSError("[ts_lua] lua_pcall failed: %s", lua_tostring(l, -1));
+ TSError("[ts_lua][%s] lua_pcall failed: %s", __FUNCTION__, lua_tostring(l, -1));
}
ret = lua_tointeger(l, -1);
lua_pop(l, 1);
+ // client response can be changed within a transaction
+ // (e.g. due to the follow redirect feature). So, clearing the pointers
+ // to allow API(s) to fetch the pointers again when it re-enters the hook
+ if (http_ctx->client_response_hdrp != NULL) {
+ TSHandleMLocRelease(http_ctx->client_response_bufp, TS_NULL_MLOC, http_ctx->client_response_hdrp);
+ http_ctx->client_response_bufp = NULL;
+ http_ctx->client_response_hdrp = NULL;
+ }
+
if (http_ctx->has_hook) {
// add a hook to release resources for context
TSDebug(TS_LUA_DEBUG_TAG, "[%s] has txn hook -> adding txn close hook handler to release resources", __FUNCTION__);
@@ -452,7 +462,7 @@
info.support_email = "dev@trafficserver.apache.org";
if (TSPluginRegister(&info) != TS_SUCCESS) {
- TSError("[ts_lua] Plugin registration failed");
+ TSError("[ts_lua][%s] Plugin registration failed", __FUNCTION__);
}
int ret = 0;
diff --git a/plugins/lua/ts_lua_client_request.c b/plugins/lua/ts_lua_client_request.c
index e5c8c62..5f8cb9b 100644
--- a/plugins/lua/ts_lua_client_request.c
+++ b/plugins/lua/ts_lua_client_request.c
@@ -900,7 +900,7 @@
{
const char *version;
size_t len;
- int major, minor;
+ unsigned int major, minor;
ts_lua_http_ctx *http_ctx;
diff --git a/plugins/lua/ts_lua_client_response.c b/plugins/lua/ts_lua_client_response.c
index 224e5e4..8ecbf44 100644
--- a/plugins/lua/ts_lua_client_response.c
+++ b/plugins/lua/ts_lua_client_response.c
@@ -358,7 +358,7 @@
{
const char *version;
size_t len;
- int major, minor;
+ unsigned int major, minor;
ts_lua_http_ctx *http_ctx;
diff --git a/plugins/lua/ts_lua_fetch.c b/plugins/lua/ts_lua_fetch.c
index 88042f0..88c7660 100644
--- a/plugins/lua/ts_lua_fetch.c
+++ b/plugins/lua/ts_lua_fetch.c
@@ -256,9 +256,9 @@
addr = luaL_checklstring(L, -1, &addr_len);
if (TS_ERROR == TSIpStringToAddr(addr, addr_len, &clientaddr)) {
- TSError("[%s] Client ip parse failed! Using default.", TS_LUA_DEBUG_TAG);
+ TSError("[ts_lua][%s] Client ip parse failed! Using default.", TS_LUA_DEBUG_TAG);
if (TS_ERROR == TSIpStringToAddr(TS_LUA_FETCH_CLIENT_ADDRPORT, TS_LUA_FETCH_CLIENT_ADDRPORT_LEN, &clientaddr)) {
- TSError("[%s] Default client ip parse failed!", TS_LUA_DEBUG_TAG);
+ TSError("[ts_lua][%s] Default client ip parse failed!", TS_LUA_DEBUG_TAG);
return 0;
}
}
diff --git a/plugins/lua/ts_lua_http.c b/plugins/lua/ts_lua_http.c
index b10fefb..9ea883c 100644
--- a/plugins/lua/ts_lua_http.c
+++ b/plugins/lua/ts_lua_http.c
@@ -21,6 +21,7 @@
#include "ts_lua_http_config.h"
#include "ts_lua_http_cntl.h"
#include "ts_lua_http_milestone.h"
+#include "ts_lua_http_txn_info.h"
typedef enum {
TS_LUA_CACHE_LOOKUP_MISS,
@@ -71,6 +72,7 @@
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_redo_cache_lookup(lua_State *L);
static int ts_lua_http_get_parent_proxy(lua_State *L);
static int ts_lua_http_set_parent_proxy(lua_State *L);
static int ts_lua_http_get_parent_selection_url(lua_State *L);
@@ -121,6 +123,7 @@
ts_lua_inject_http_config_api(L);
ts_lua_inject_http_cntl_api(L);
ts_lua_inject_http_milestone_api(L);
+ ts_lua_inject_txn_info_api(L);
ts_lua_inject_http_misc_api(L);
lua_setfield(L, -2, "http");
@@ -157,6 +160,9 @@
lua_pushcfunction(L, ts_lua_http_set_cache_lookup_url);
lua_setfield(L, -2, "set_cache_lookup_url");
+ lua_pushcfunction(L, ts_lua_http_redo_cache_lookup);
+ lua_setfield(L, -2, "redo_cache_lookup");
+
lua_pushcfunction(L, ts_lua_http_get_parent_proxy);
lua_setfield(L, -2, "get_parent_proxy");
@@ -424,7 +430,28 @@
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");
+ TSError("[ts_lua][%s] Failed to set cache lookup URL", __FUNCTION__);
+ }
+ }
+
+ return 0;
+}
+
+static int
+ts_lua_http_redo_cache_lookup(lua_State *L)
+{
+ const char *url;
+ size_t url_len;
+
+ ts_lua_http_ctx *http_ctx;
+
+ GET_HTTP_CONTEXT(http_ctx, L);
+
+ url = luaL_checklstring(L, 1, &url_len);
+
+ if (url && url_len) {
+ if (TSHttpTxnRedoCacheLookup(http_ctx->txnp, url, url_len) != TS_SUCCESS) {
+ TSError("[ts_lua][%s] Failed to redo cache lookup", __FUNCTION__);
}
}
@@ -536,7 +563,7 @@
TSHttpTxnParentSelectionUrlSet(http_ctx->txnp, http_ctx->client_request_bufp, new_url_loc) == TS_SUCCESS) {
TSDebug(TS_LUA_DEBUG_TAG, "Set parent selection URL");
} else {
- TSError("[ts_lua] Failed to set parent selection URL");
+ TSError("[ts_lua][%s] Failed to set parent selection URL", __FUNCTION__);
}
}
@@ -557,7 +584,7 @@
if (url && url_len) {
if (TSCacheUrlSet(http_ctx->txnp, url, url_len) != TS_SUCCESS) {
- TSError("[ts_lua] Failed to set cache url");
+ TSError("[ts_lua][%s] Failed to set cache url", __FUNCTION__);
}
}
@@ -883,7 +910,7 @@
transform_ctx = ts_lua_get_http_transform_ctx(L);
if (transform_ctx == NULL) {
- TSError("[ts_lua] missing transform_ctx");
+ TSError("[ts_lua][%s] missing transform_ctx", __FUNCTION__);
return 0;
}
@@ -899,7 +926,7 @@
transform_ctx = ts_lua_get_http_transform_ctx(L);
if (transform_ctx == NULL) {
- TSError("[ts_lua] missing transform_ctx");
+ TSError("[ts_lua][%s] missing transform_ctx", __FUNCTION__);
return 0;
}
@@ -916,7 +943,7 @@
transform_ctx = ts_lua_get_http_transform_ctx(L);
if (transform_ctx == NULL) {
- TSError("[ts_lua] missing transform_ctx");
+ TSError("[ts_lua][%s] missing transform_ctx", __FUNCTION__);
return 0;
}
@@ -935,7 +962,7 @@
transform_ctx = ts_lua_get_http_transform_ctx(L);
if (transform_ctx == NULL) {
- TSError("[ts_lua] missing transform_ctx");
+ TSError("[ts_lua][%s] missing transform_ctx", __FUNCTION__);
return 0;
}
diff --git a/plugins/lua/ts_lua_http_config.c b/plugins/lua/ts_lua_http_config.c
index dd72d14..a926eb6 100644
--- a/plugins/lua/ts_lua_http_config.c
+++ b/plugins/lua/ts_lua_http_config.c
@@ -504,7 +504,7 @@
break;
default:
- TSError("[ts_lua] Unsupported timeout config option for lua plugin");
+ TSError("[ts_lua][%s] Unsupported timeout config option for lua plugin", __FUNCTION__);
break;
}
diff --git a/plugins/lua/ts_lua_http_intercept.c b/plugins/lua/ts_lua_http_intercept.c
index d794231..d03bd0c 100644
--- a/plugins/lua/ts_lua_http_intercept.c
+++ b/plugins/lua/ts_lua_http_intercept.c
@@ -73,13 +73,13 @@
n = lua_gettop(L);
if (n < 1) {
- TSError("[ts_lua] ts.http.intercept need at least one param");
+ TSError("[ts_lua][%s] ts.http.intercept need at least one param", __FUNCTION__);
return 0;
}
type = lua_type(L, 1);
if (type != LUA_TFUNCTION) {
- TSError("[ts_lua] ts.http.intercept should use function as param, but there is %s", lua_typename(L, type));
+ TSError("[ts_lua][%s] ts.http.intercept should use function as param, but there is %s", __FUNCTION__, lua_typename(L, type));
return 0;
}
@@ -106,13 +106,14 @@
n = lua_gettop(L);
if (n < 1) {
- TSError("[ts_lua] ts.http.server_intercept need at least one param");
+ TSError("[ts_lua][%s] ts.http.server_intercept need at least one param", __FUNCTION__);
return 0;
}
type = lua_type(L, 1);
if (type != LUA_TFUNCTION) {
- TSError("[ts_lua] ts.http.server_intercept should use function as param, but there is %s", lua_typename(L, type));
+ TSError("[ts_lua][%s] ts.http.server_intercept should use function as param, but there is %s", __FUNCTION__,
+ lua_typename(L, type));
return 0;
}
@@ -274,7 +275,7 @@
break;
default: // error
- TSError("[ts_lua] lua_resume failed: %s", lua_tostring(L, -1));
+ TSError("[ts_lua][%s] lua_resume failed: %s", __FUNCTION__, lua_tostring(L, -1));
lua_pop(L, 1);
return -1;
}
@@ -357,7 +358,7 @@
ictx = ts_lua_get_http_intercept_ctx(L);
if (ictx == NULL) {
- TSError("[ts_lua] missing ictx");
+ TSError("[ts_lua][%s] missing ictx", __FUNCTION__);
return 0;
}
@@ -379,7 +380,7 @@
ictx = ts_lua_get_http_intercept_ctx(L);
if (ictx == NULL) {
- TSError("[ts_lua] missing ictx");
+ TSError("[ts_lua][%s] missing ictx", __FUNCTION__);
return 0;
}
diff --git a/plugins/lua/ts_lua_http_txn_info.c b/plugins/lua/ts_lua_http_txn_info.c
new file mode 100644
index 0000000..3f8bd80
--- /dev/null
+++ b/plugins/lua/ts_lua_http_txn_info.c
@@ -0,0 +1,76 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#include "ts_lua_util.h"
+
+typedef enum {
+ TS_LUA_TXN_INFO_CACHE_HIT_RAM = TS_TXN_INFO_CACHE_HIT_RAM,
+ TS_LUA_TXN_INFO_CACHE_COMPRESSED_IN_RAM = TS_TXN_INFO_CACHE_COMPRESSED_IN_RAM,
+ TS_LUA_TXN_INFO_CACHE_HIT_RWW = TS_TXN_INFO_CACHE_HIT_RWW,
+ TS_LUA_TXN_INFO_CACHE_OPEN_READ_TRIES = TS_TXN_INFO_CACHE_OPEN_READ_TRIES,
+ TS_LUA_TXN_INFO_CACHE_OPEN_WRITE_TRIES = TS_TXN_INFO_CACHE_OPEN_WRITE_TRIES,
+ TS_LUA_TXN_INFO_CACHE_VOLUME = TS_TXN_INFO_CACHE_VOLUME
+} TSLuaTxnInfoType;
+
+ts_lua_var_item ts_lua_txn_info_type_vars[] = {
+ TS_LUA_MAKE_VAR_ITEM(TS_LUA_TXN_INFO_CACHE_HIT_RAM), TS_LUA_MAKE_VAR_ITEM(TS_LUA_TXN_INFO_CACHE_COMPRESSED_IN_RAM),
+ TS_LUA_MAKE_VAR_ITEM(TS_LUA_TXN_INFO_CACHE_HIT_RWW), TS_LUA_MAKE_VAR_ITEM(TS_LUA_TXN_INFO_CACHE_OPEN_READ_TRIES),
+ TS_LUA_MAKE_VAR_ITEM(TS_LUA_TXN_INFO_CACHE_OPEN_WRITE_TRIES), TS_LUA_MAKE_VAR_ITEM(TS_LUA_TXN_INFO_CACHE_VOLUME)};
+
+static void ts_lua_inject_txn_info_variables(lua_State *L);
+
+static int ts_lua_txn_info_get(lua_State *L);
+
+void
+ts_lua_inject_txn_info_api(lua_State *L)
+{
+ ts_lua_inject_txn_info_variables(L);
+
+ lua_pushcfunction(L, ts_lua_txn_info_get);
+ lua_setfield(L, -2, "txn_info_get");
+}
+
+static void
+ts_lua_inject_txn_info_variables(lua_State *L)
+{
+ size_t i;
+
+ for (i = 0; i < sizeof(ts_lua_txn_info_type_vars) / sizeof(ts_lua_var_item); i++) {
+ lua_pushinteger(L, ts_lua_txn_info_type_vars[i].nvar);
+ lua_setglobal(L, ts_lua_txn_info_type_vars[i].svar);
+ }
+}
+
+static int
+ts_lua_txn_info_get(lua_State *L)
+{
+ TSHttpTxnInfoKey type;
+ TSMgmtInt value;
+ ts_lua_http_ctx *http_ctx;
+
+ GET_HTTP_CONTEXT(http_ctx, L);
+
+ type = luaL_checkinteger(L, 1);
+
+ if (TS_SUCCESS == TSHttpTxnInfoIntGet(http_ctx->txnp, type, &value)) {
+ lua_pushnumber(L, value);
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/plugins/lua/ts_lua_http_txn_info.h b/plugins/lua/ts_lua_http_txn_info.h
new file mode 100644
index 0000000..3d8ed13
--- /dev/null
+++ b/plugins/lua/ts_lua_http_txn_info.h
@@ -0,0 +1,23 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#pragma once
+
+#include "ts_lua_common.h"
+
+void ts_lua_inject_txn_info_api(lua_State *L);
diff --git a/plugins/lua/ts_lua_log.c b/plugins/lua/ts_lua_log.c
index 72a48d2..f2db53a 100644
--- a/plugins/lua/ts_lua_log.c
+++ b/plugins/lua/ts_lua_log.c
@@ -58,7 +58,7 @@
log_name = luaL_checklstring(L, -2, &name_len);
if (lua_isnil(L, 3)) {
- TSError("[ts_lua] No log name!!");
+ TSError("[ts_lua][%s] No log name!!", __FUNCTION__);
return -1;
} else {
log_mode = luaL_checknumber(L, 3);
@@ -67,7 +67,7 @@
error = TSTextLogObjectCreate(log_name, log_mode, &log);
if (!log || error == TS_ERROR) {
- TSError("[ts_lua] Unable to create log <%s>", log_name);
+ TSError("[ts_lua][%s] Unable to create log <%s>", __FUNCTION__, log_name);
return -1;
}
return 0;
diff --git a/plugins/lua/ts_lua_misc.c b/plugins/lua/ts_lua_misc.c
index e12e5a1..53d68a3 100644
--- a/plugins/lua/ts_lua_misc.c
+++ b/plugins/lua/ts_lua_misc.c
@@ -24,6 +24,8 @@
static int ts_lua_get_now_time(lua_State *L);
static int ts_lua_debug(lua_State *L);
static int ts_lua_error(lua_State *L);
+static int ts_lua_emergency(lua_State *L);
+static int ts_lua_fatal(lua_State *L);
static int ts_lua_sleep(lua_State *L);
static int ts_lua_host_lookup(lua_State *L);
static int ts_lua_schedule(lua_State *L);
@@ -64,6 +66,14 @@
lua_pushcfunction(L, ts_lua_error);
lua_setfield(L, -2, "error");
+ /* ts.emergency(...) */
+ lua_pushcfunction(L, ts_lua_emergency);
+ lua_setfield(L, -2, "emergency");
+
+ /* ts.fatal(...) */
+ lua_pushcfunction(L, ts_lua_fatal);
+ lua_setfield(L, -2, "fatal");
+
/* ts.sleep(...) */
lua_pushcfunction(L, ts_lua_sleep);
lua_setfield(L, -2, "sleep");
@@ -164,6 +174,28 @@
}
static int
+ts_lua_emergency(lua_State *L)
+{
+ const char *msg;
+ size_t len = 0;
+
+ msg = luaL_checklstring(L, 1, &len);
+ TSEmergency("%.*s", (int)len, msg);
+ return 0;
+}
+
+static int
+ts_lua_fatal(lua_State *L)
+{
+ const char *msg;
+ size_t len = 0;
+
+ msg = luaL_checklstring(L, 1, &len);
+ TSFatal("%.*s", (int)len, msg);
+ return 0;
+}
+
+static int
ts_lua_schedule(lua_State *L)
{
int sec;
@@ -197,7 +229,7 @@
n = lua_gettop(L);
if (n < 3) {
- TSError("[ts_lua] ts.schedule need at least three parameters");
+ TSError("[ts_lua][%s] ts.schedule need at least three parameters", __FUNCTION__);
return 0;
}
@@ -256,7 +288,7 @@
}
if (ret != 0) {
- TSError("[ts_lua] lua_resume failed: %s", lua_tostring(L, -1));
+ TSError("[ts_lua][%s] lua_resume failed: %s", __FUNCTION__, lua_tostring(L, -1));
}
lua_pop(L, lua_gettop(L));
@@ -342,7 +374,7 @@
}
if (lua_gettop(L) != 1) {
- TSError("[ts_lua] ts.host_lookup need at least one parameter");
+ TSError("[ts_lua][%s] ts.host_lookup need at least one parameter", __FUNCTION__);
return 0;
}
@@ -376,7 +408,7 @@
ts_lua_host_lookup_cleanup(ai);
if (event != TS_EVENT_HOST_LOOKUP) {
- TSError("[ts_lua] ts.host_lookup receives unknown event");
+ TSError("[ts_lua][%s] ts.host_lookup receives unknown event", __FUNCTION__);
lua_pushnil(L);
} else if (!edata) {
lua_pushnil(L);
diff --git a/plugins/lua/ts_lua_package.c b/plugins/lua/ts_lua_package.c
index 6b97832..33ff3f1 100644
--- a/plugins/lua/ts_lua_package.c
+++ b/plugins/lua/ts_lua_package.c
@@ -182,7 +182,7 @@
for (i = 0; i < n; i++) {
if (new_path_len + pp[i].len + 1 >= sizeof(new_path)) {
- TSError("[ts_lua] Extended package.path is too long");
+ TSError("[ts_lua][%s] Extended package.path is too long", __FUNCTION__);
return -1;
}
@@ -328,7 +328,7 @@
for (i = 0; i < n; i++) {
if (new_path_len + pp[i].len + 1 >= sizeof(new_path)) {
- TSError("[ts_lua] Extended package.cpath is too long");
+ TSError("[ts_lua][%s] Extended package.cpath is too long", __FUNCTION__);
return -1;
}
diff --git a/plugins/lua/ts_lua_server_request.c b/plugins/lua/ts_lua_server_request.c
index 8e65fe3..157f12b 100644
--- a/plugins/lua/ts_lua_server_request.c
+++ b/plugins/lua/ts_lua_server_request.c
@@ -699,7 +699,7 @@
{
const char *version;
size_t len;
- int major, minor;
+ unsigned int major, minor;
ts_lua_http_ctx *http_ctx;
diff --git a/plugins/lua/ts_lua_server_response.c b/plugins/lua/ts_lua_server_response.c
index f2c78d4..d99935b 100644
--- a/plugins/lua/ts_lua_server_response.c
+++ b/plugins/lua/ts_lua_server_response.c
@@ -344,7 +344,7 @@
{
const char *version;
size_t len;
- int major, minor;
+ unsigned int major, minor;
ts_lua_http_ctx *http_ctx;
diff --git a/plugins/lua/ts_lua_transform.c b/plugins/lua/ts_lua_transform.c
index 57da47d..5e8d75b 100644
--- a/plugins/lua/ts_lua_transform.c
+++ b/plugins/lua/ts_lua_transform.c
@@ -137,9 +137,10 @@
eos = 0;
}
} else {
- input_avail = 0;
- toread = 0;
- eos = 1;
+ input_avail = 0;
+ upstream_done = 0;
+ toread = 0;
+ eos = 1;
}
if (input_avail > 0) {
@@ -224,7 +225,7 @@
break;
default: // coroutine failed
- TSError("[ts_lua] lua_resume failed: %s", lua_tostring(L, -1));
+ TSError("[ts_lua][%s] lua_resume failed: %s", __FUNCTION__, lua_tostring(L, -1));
ret = 1;
res = NULL;
res_len = 0;
diff --git a/plugins/lua/ts_lua_util.c b/plugins/lua/ts_lua_util.c
index 34d2b1e..22b7575 100644
--- a/plugins/lua/ts_lua_util.c
+++ b/plugins/lua/ts_lua_util.c
@@ -856,6 +856,7 @@
// to allow API(s) to fetch the pointers again when it re-enters the hook
if (http_ctx->client_response_hdrp != NULL) {
TSHandleMLocRelease(http_ctx->client_response_bufp, TS_NULL_MLOC, http_ctx->client_response_hdrp);
+ http_ctx->client_response_bufp = NULL;
http_ctx->client_response_hdrp = NULL;
}
@@ -865,6 +866,12 @@
ret = lua_resume(L, 0);
}
+ if (http_ctx->client_response_hdrp != NULL) {
+ TSHandleMLocRelease(http_ctx->client_response_bufp, TS_NULL_MLOC, http_ctx->client_response_hdrp);
+ http_ctx->client_response_bufp = NULL;
+ http_ctx->client_response_hdrp = NULL;
+ }
+
break;
case TS_EVENT_HTTP_READ_REQUEST_HDR:
@@ -916,7 +923,7 @@
lua_getglobal(L, TS_LUA_FUNCTION_TXN_CLOSE);
if (lua_type(L, -1) == LUA_TFUNCTION) {
if (lua_pcall(L, 0, 1, 0)) {
- TSError("[ts_lua] lua_pcall failed: %s", lua_tostring(L, -1));
+ TSError("[ts_lua][%s] lua_pcall failed: %s", __FUNCTION__, lua_tostring(L, -1));
}
}
@@ -945,7 +952,7 @@
break;
default: // coroutine failed
- TSError("[ts_lua] lua_resume failed: %s", lua_tostring(L, -1));
+ TSError("[ts_lua][%s] lua_resume failed: %s", __FUNCTION__, lua_tostring(L, -1));
rc = -1;
lua_pop(L, 1);
break;