From 5b17655818ad7e9a027a24e2e33e5cf43e46e990 Mon Sep 17 00:00:00 2001 From: Sunjay Bhatia Date: Fri, 26 Feb 2021 15:06:10 -0500 Subject: [PATCH] lua http filter: Expose requestedServerName on streamInfo Fixes https://github.com/envoyproxy/envoy/issues/15142 Signed-off-by: Sunjay Bhatia --- .../http/http_filters/lua_filter.rst | 11 ++++++++++ .../extensions/filters/http/lua/wrappers.cc | 5 +++++ source/extensions/filters/http/lua/wrappers.h | 9 ++++++++- .../filters/http/lua/lua_filter_test.cc | 20 +++++++++++++++++++ .../filters/http/lua/lua_integration_test.cc | 7 +++++++ .../filters/http/lua/wrappers_test.cc | 19 ++++++++++++++++++ 6 files changed, 70 insertions(+), 1 deletion(-) diff --git a/docs/root/configuration/http/http_filters/lua_filter.rst b/docs/root/configuration/http/http_filters/lua_filter.rst index 126667737271..387c796cb86b 100644 --- a/docs/root/configuration/http/http_filters/lua_filter.rst +++ b/docs/root/configuration/http/http_filters/lua_filter.rst @@ -692,6 +692,17 @@ Returns a downstream :ref:`SSL connection info object ` +(e.g. SNI in TLS) for the current request if present. + Dynamic metadata object API --------------------------- diff --git a/source/extensions/filters/http/lua/wrappers.cc b/source/extensions/filters/http/lua/wrappers.cc index 68b7af66188d..04fa2842ea64 100644 --- a/source/extensions/filters/http/lua/wrappers.cc +++ b/source/extensions/filters/http/lua/wrappers.cc @@ -141,6 +141,11 @@ int StreamInfoWrapper::luaDownstreamDirectRemoteAddress(lua_State* state) { return 1; } +int StreamInfoWrapper::luaRequestedServerName(lua_State* state) { + lua_pushstring(state, stream_info_.requestedServerName().c_str()); + return 1; +} + DynamicMetadataMapIterator::DynamicMetadataMapIterator(DynamicMetadataMapWrapper& parent) : parent_{parent}, current_{parent_.streamInfo().dynamicMetadata().filter_metadata().begin()} {} diff --git a/source/extensions/filters/http/lua/wrappers.h b/source/extensions/filters/http/lua/wrappers.h index ba4170dbfaaa..3a1124c4c3cb 100644 --- a/source/extensions/filters/http/lua/wrappers.h +++ b/source/extensions/filters/http/lua/wrappers.h @@ -186,7 +186,8 @@ class StreamInfoWrapper : public Filters::Common::Lua::BaseLuaObjectdecodeHeaders(request_headers, true)); } +// Get the requested server name. +TEST_F(LuaHttpFilterTest, GetRequestedServerName) { + const std::string SCRIPT{R"EOF( + function envoy_on_request(request_handle) + request_handle:logTrace(request_handle:streamInfo():requestedServerName()) + end + )EOF"}; + + InSequence s; + setup(SCRIPT); + + EXPECT_CALL(decoder_callbacks_, streamInfo()).WillOnce(ReturnRef(stream_info_)); + std::string server_name = "foo.example.com"; + EXPECT_CALL(stream_info_, requestedServerName()).WillOnce(ReturnRef(server_name)); + + Http::TestRequestHeaderMapImpl request_headers{{":path", "/"}}; + EXPECT_CALL(*filter_, scriptLog(spdlog::level::trace, StrEq("foo.example.com"))); + EXPECT_EQ(Http::FilterHeadersStatus::Continue, filter_->decodeHeaders(request_headers, true)); +} + // Set and get stream info dynamic metadata. TEST_F(LuaHttpFilterTest, SetGetDynamicMetadata) { const std::string SCRIPT{R"EOF( diff --git a/test/extensions/filters/http/lua/lua_integration_test.cc b/test/extensions/filters/http/lua/lua_integration_test.cc index 342259997c13..c203579a05d4 100644 --- a/test/extensions/filters/http/lua/lua_integration_test.cc +++ b/test/extensions/filters/http/lua/lua_integration_test.cc @@ -291,6 +291,8 @@ name: lua request_handle:streamInfo():downstreamLocalAddress()) request_handle:headers():add("request_downstream_directremote_address_value", request_handle:streamInfo():downstreamDirectRemoteAddress()) + request_handle:headers():add("request_requested_server_name", + request_handle:streamInfo():requestedServerName()) end function envoy_on_response(response_handle) @@ -364,6 +366,11 @@ name: lua .getStringView(), GetParam() == Network::Address::IpVersion::v4 ? "127.0.0.1:" : "[::1]:")); + EXPECT_EQ("", upstream_request_->headers() + .get(Http::LowerCaseString("request_requested_server_name"))[0] + ->value() + .getStringView()); + Http::TestResponseHeaderMapImpl response_headers{{":status", "200"}, {"foo", "bar"}}; upstream_request_->encodeHeaders(response_headers, false); Buffer::OwnedImpl response_data1("good"); diff --git a/test/extensions/filters/http/lua/wrappers_test.cc b/test/extensions/filters/http/lua/wrappers_test.cc index 04f5deef048c..2097b2696452 100644 --- a/test/extensions/filters/http/lua/wrappers_test.cc +++ b/test/extensions/filters/http/lua/wrappers_test.cc @@ -300,6 +300,25 @@ TEST_F(LuaStreamInfoWrapperTest, ReturnCurrentDownstreamAddresses) { wrapper.reset(); } +TEST_F(LuaStreamInfoWrapperTest, ReturnRequestedServerName) { + const std::string SCRIPT{R"EOF( + function callMe(object) + testPrint(object:requestedServerName()) + end + )EOF"}; + + InSequence s; + setup(SCRIPT); + + NiceMock stream_info; + stream_info.requested_server_name_ = "some.sni.io"; + Filters::Common::Lua::LuaDeathRef wrapper( + StreamInfoWrapper::create(coroutine_->luaState(), stream_info), true); + EXPECT_CALL(printer_, testPrint("some.sni.io")); + start("callMe"); + wrapper.reset(); +} + // Set, get and iterate stream info dynamic metadata. TEST_F(LuaStreamInfoWrapperTest, SetGetAndIterateDynamicMetadata) { const std::string SCRIPT{R"EOF(