From 50df5dc5bf9179a03d444a48c4d6748e7ecbcb23 Mon Sep 17 00:00:00 2001 From: Lihao Luo Date: Thu, 10 Sep 2020 21:01:55 -0700 Subject: [PATCH 1/2] Support binary data in lua base64 encoding Signed-off-by: Lihao Luo --- .../extensions/filters/http/lua/lua_filter.cc | 6 +++--- .../filters/http/lua/lua_filter_test.cc | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/source/extensions/filters/http/lua/lua_filter.cc b/source/extensions/filters/http/lua/lua_filter.cc index 99d9618b13a0..439766b82580 100644 --- a/source/extensions/filters/http/lua/lua_filter.cc +++ b/source/extensions/filters/http/lua/lua_filter.cc @@ -618,9 +618,9 @@ int StreamHandleWrapper::luaImportPublicKey(lua_State* state) { } int StreamHandleWrapper::luaBase64Escape(lua_State* state) { - // Get input string. - absl::string_view input = luaL_checkstring(state, 2); - auto output = absl::Base64Escape(input); + size_t input_size; + const char* input = luaL_checklstring(state, 2, &input_size); + auto output = absl::Base64Escape(absl::string_view(input, input_size)); lua_pushlstring(state, output.data(), output.length()); return 1; diff --git a/test/extensions/filters/http/lua/lua_filter_test.cc b/test/extensions/filters/http/lua/lua_filter_test.cc index 13455f81e8d4..f06aed6be5c6 100644 --- a/test/extensions/filters/http/lua/lua_filter_test.cc +++ b/test/extensions/filters/http/lua/lua_filter_test.cc @@ -2202,8 +2202,10 @@ TEST_F(LuaHttpFilterTest, LuaFilterBase64Escape) { end function envoy_on_response(response_handle) - local base64Encoded = response_handle:base64Escape("barfoo") - response_handle:logTrace(base64Encoded) + local resp_body_buf = response_handle:body() + local resp_body = resp_body_buf:getBytes(0, resp_body_buf:length()) + local b64_resp_body = response_handle:base64Escape(resp_body) + response_handle:logTrace(b64_resp_body) end )EOF"}; @@ -2216,9 +2218,16 @@ TEST_F(LuaHttpFilterTest, LuaFilterBase64Escape) { EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter_->decodeHeaders(request_headers, true)); Http::TestResponseHeaderMapImpl response_headers{{":status", "200"}}; + EXPECT_EQ(Http::FilterHeadersStatus::StopIteration, + filter_->encodeHeaders(response_headers, false)); - EXPECT_CALL(*filter_, scriptLog(spdlog::level::trace, StrEq("YmFyZm9v"))); - EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter_->encodeHeaders(response_headers, true)); + // base64 encoding should also work for binary data + uint8_t buffer[34] = {31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 202, 72, 205, 201, 201, 47, 207, + 47, 202, 73, 1, 4, 0, 0, 255, 255, 173, 32, 235, 249, 10, 0, 0, 0}; + Buffer::OwnedImpl response_body(buffer, 34); + EXPECT_CALL(*filter_, scriptLog(spdlog::level::trace, + StrEq("H4sIAAAAAAAA/8pIzcnJL88vykkBBAAA//+tIOv5CgAAAA=="))); + EXPECT_EQ(Http::FilterDataStatus::Continue, filter_->encodeData(response_body, true)); } } // namespace From 962affd72b43309c29a0c61e35069d7b0bc4cd15 Mon Sep 17 00:00:00 2001 From: Lihao Luo Date: Fri, 11 Sep 2020 10:58:35 -0700 Subject: [PATCH 2/2] Address comments Signed-off-by: Lihao Luo --- test/extensions/filters/http/lua/lua_filter_test.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/extensions/filters/http/lua/lua_filter_test.cc b/test/extensions/filters/http/lua/lua_filter_test.cc index f06aed6be5c6..6e460d882dff 100644 --- a/test/extensions/filters/http/lua/lua_filter_test.cc +++ b/test/extensions/filters/http/lua/lua_filter_test.cc @@ -2202,6 +2202,9 @@ TEST_F(LuaHttpFilterTest, LuaFilterBase64Escape) { end function envoy_on_response(response_handle) + local base64Encoded = response_handle:base64Escape("barfoo") + response_handle:logTrace(base64Encoded) + local resp_body_buf = response_handle:body() local resp_body = resp_body_buf:getBytes(0, resp_body_buf:length()) local b64_resp_body = response_handle:base64Escape(resp_body) @@ -2218,10 +2221,11 @@ TEST_F(LuaHttpFilterTest, LuaFilterBase64Escape) { EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter_->decodeHeaders(request_headers, true)); Http::TestResponseHeaderMapImpl response_headers{{":status", "200"}}; + EXPECT_CALL(*filter_, scriptLog(spdlog::level::trace, StrEq("YmFyZm9v"))); EXPECT_EQ(Http::FilterHeadersStatus::StopIteration, filter_->encodeHeaders(response_headers, false)); - // base64 encoding should also work for binary data + // Base64 encoding should also work for binary data. uint8_t buffer[34] = {31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 202, 72, 205, 201, 201, 47, 207, 47, 202, 73, 1, 4, 0, 0, 255, 255, 173, 32, 235, 249, 10, 0, 0, 0}; Buffer::OwnedImpl response_body(buffer, 34);