From 0a05ba53c827d9a2a347c28cbf87437978f22930 Mon Sep 17 00:00:00 2001 From: Dhi Aurrahman Date: Mon, 21 Sep 2020 10:59:29 +0000 Subject: [PATCH 1/3] lua: Make httpCall to return raw data This patch lets httpCall to return raw data, hence full response body can be accessed from Lua script. Signed-off-by: Dhi Aurrahman --- source/extensions/filters/http/lua/lua_filter.cc | 3 ++- test/extensions/filters/http/lua/lua_filter_test.cc | 11 +++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/source/extensions/filters/http/lua/lua_filter.cc b/source/extensions/filters/http/lua/lua_filter.cc index ff9b1ce85a29a..11a5f83476320 100644 --- a/source/extensions/filters/http/lua/lua_filter.cc +++ b/source/extensions/filters/http/lua/lua_filter.cc @@ -349,7 +349,8 @@ void StreamHandleWrapper::onSuccess(const Http::AsyncClient::Request&, // TODO(mattklein123): Avoid double copy here. if (response->body() != nullptr) { - lua_pushstring(coroutine_.luaState(), response->bodyAsString().c_str()); + lua_pushlstring(coroutine_.luaState(), response->bodyAsString().data(), + response->body()->length()); } else { lua_pushnil(coroutine_.luaState()); } diff --git a/test/extensions/filters/http/lua/lua_filter_test.cc b/test/extensions/filters/http/lua/lua_filter_test.cc index 6ba8d3df902ee..75599aea62fb1 100644 --- a/test/extensions/filters/http/lua/lua_filter_test.cc +++ b/test/extensions/filters/http/lua/lua_filter_test.cc @@ -790,7 +790,10 @@ TEST_F(LuaHttpFilterTest, HttpCall) { for key, value in pairs(headers) do request_handle:logTrace(key .. " " .. value) end + request_handle:logTrace(string.len(body)) request_handle:logTrace(body) + request_handle:logTrace(string.byte(body, 5)) + request_handle:logTrace(string.sub(body, 6, 8)) end )EOF"}; @@ -828,9 +831,13 @@ TEST_F(LuaHttpFilterTest, HttpCall) { Http::ResponseMessagePtr response_message(new Http::ResponseMessageImpl( Http::ResponseHeaderMapPtr{new Http::TestResponseHeaderMapImpl{{":status", "200"}}})); - response_message->body() = std::make_unique("response"); + const char response[8] = {'r', 'e', 's', 'p', '\0', 'n', 's', 'e'}; + response_message->body() = std::make_unique(response, 8); EXPECT_CALL(*filter_, scriptLog(spdlog::level::trace, StrEq(":status 200"))); - EXPECT_CALL(*filter_, scriptLog(spdlog::level::trace, StrEq("response"))); + EXPECT_CALL(*filter_, scriptLog(spdlog::level::trace, StrEq("8"))); + EXPECT_CALL(*filter_, scriptLog(spdlog::level::trace, StrEq("resp"))); + EXPECT_CALL(*filter_, scriptLog(spdlog::level::trace, StrEq("0"))); + EXPECT_CALL(*filter_, scriptLog(spdlog::level::trace, StrEq("nse"))); EXPECT_CALL(decoder_callbacks_, continueDecoding()); callbacks->onBeforeFinalizeUpstreamSpan(child_span_, &response_message->headers()); callbacks->onSuccess(request, std::move(response_message)); From 962e2fb6da5c75fe9741b5a2967b330620937349 Mon Sep 17 00:00:00 2001 From: Dhi Aurrahman Date: Mon, 21 Sep 2020 16:29:51 +0000 Subject: [PATCH 2/3] Add release note Signed-off-by: Dhi Aurrahman --- docs/root/version_history/current.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/root/version_history/current.rst b/docs/root/version_history/current.rst index 89659d92e12e9..f74074e65095b 100644 --- a/docs/root/version_history/current.rst +++ b/docs/root/version_history/current.rst @@ -35,6 +35,7 @@ Minor Behavior Changes * logging: changed default log format to `"[%Y-%m-%d %T.%e][%t][%l][%n] [%g:%#] %v"` and default value of :option:`--log-format-prefix-with-location` to `0`. * logging: nghttp2 log messages no longer appear at trace level unless `ENVOY_NGHTTP2_TRACE` is set in the environment. +* lua: changed the response body returned by `httpCall()` API to raw data. Previously, the returned data is always string. * router: added transport failure reason to response body when upstream reset happens. After this change, the response body will be of the form `upstream connect error or disconnect/reset before headers. reset reason:{}, transport failure reason:{}`.This behavior may be reverted by setting runtime feature `envoy.reloadable_features.http_transport_failure_reason_in_body` to false. * router: now consumes all retry related headers to prevent them from being propagated to the upstream. This behavior may be reverted by setting runtime feature `envoy.reloadable_features.consume_all_retry_headers` to false. * thrift_proxy: special characters {'\0', '\r', '\n'} will be stripped from thrift headers. From 98a222ee454528468661c3f61e66004fadb845a4 Mon Sep 17 00:00:00 2001 From: Dhi Aurrahman Date: Mon, 21 Sep 2020 16:31:15 +0000 Subject: [PATCH 3/3] Fix Signed-off-by: Dhi Aurrahman --- docs/root/version_history/current.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/root/version_history/current.rst b/docs/root/version_history/current.rst index f74074e65095b..3f66f69e40ed1 100644 --- a/docs/root/version_history/current.rst +++ b/docs/root/version_history/current.rst @@ -35,7 +35,7 @@ Minor Behavior Changes * logging: changed default log format to `"[%Y-%m-%d %T.%e][%t][%l][%n] [%g:%#] %v"` and default value of :option:`--log-format-prefix-with-location` to `0`. * logging: nghttp2 log messages no longer appear at trace level unless `ENVOY_NGHTTP2_TRACE` is set in the environment. -* lua: changed the response body returned by `httpCall()` API to raw data. Previously, the returned data is always string. +* lua: changed the response body returned by `httpCall()` API to raw data. Previously, the returned data was string. * router: added transport failure reason to response body when upstream reset happens. After this change, the response body will be of the form `upstream connect error or disconnect/reset before headers. reset reason:{}, transport failure reason:{}`.This behavior may be reverted by setting runtime feature `envoy.reloadable_features.http_transport_failure_reason_in_body` to false. * router: now consumes all retry related headers to prevent them from being propagated to the upstream. This behavior may be reverted by setting runtime feature `envoy.reloadable_features.consume_all_retry_headers` to false. * thrift_proxy: special characters {'\0', '\r', '\n'} will be stripped from thrift headers.