diff --git a/include/envoy/stream_info/filter_state.h b/include/envoy/stream_info/filter_state.h index 486d268b2e7f0..0e41d967cf19f 100644 --- a/include/envoy/stream_info/filter_state.h +++ b/include/envoy/stream_info/filter_state.h @@ -150,5 +150,7 @@ class FilterState { virtual Object* getDataMutableGeneric(absl::string_view data_name) PURE; }; +using FilterStateSharedPtr = std::shared_ptr; + } // namespace StreamInfo } // namespace Envoy diff --git a/include/envoy/stream_info/stream_info.h b/include/envoy/stream_info/stream_info.h index b5ffe8613f9df..1307edaa133ac 100644 --- a/include/envoy/stream_info/stream_info.h +++ b/include/envoy/stream_info/stream_info.h @@ -479,7 +479,7 @@ class StreamInfo { * filters (append only). Both object types can be consumed by multiple filters. * @return the filter state associated with this request. */ - virtual FilterState& filterState() PURE; + virtual const FilterStateSharedPtr& filterState() PURE; virtual const FilterState& filterState() const PURE; /** diff --git a/source/common/router/router.cc b/source/common/router/router.cc index 3c4e29470a065..7823c3c2fcecd 100644 --- a/source/common/router/router.cc +++ b/source/common/router/router.cc @@ -386,10 +386,10 @@ Http::FilterHeadersStatus Filter::decodeHeaders(Http::HeaderMap& headers, bool e // Extract debug configuration from filter state. This is used further along to determine whether // we should append cluster and host headers to the response, and whether to forward the request // upstream. - const StreamInfo::FilterState& filter_state = callbacks_->streamInfo().filterState(); + const StreamInfo::FilterStateSharedPtr& filter_state = callbacks_->streamInfo().filterState(); const DebugConfig* debug_config = - filter_state.hasData(DebugConfig::key()) - ? &(filter_state.getDataReadOnly(DebugConfig::key())) + filter_state->hasData(DebugConfig::key()) + ? &(filter_state->getDataReadOnly(DebugConfig::key())) : nullptr; // TODO: Maybe add a filter API for this. @@ -527,7 +527,7 @@ Http::FilterHeadersStatus Filter::decodeHeaders(Http::HeaderMap& headers, bool e // TODO: Add SAN verification here and use it from dynamic_forward_proxy // Update filter state with the host/authority to use for setting SNI in the transport // socket options. This is referenced during the getConnPool() call below. - callbacks_->streamInfo().filterState().setData( + callbacks_->streamInfo().filterState()->setData( Network::UpstreamServerName::key(), std::make_unique(parsed_authority.host_), StreamInfo::FilterState::StateType::Mutable); @@ -627,7 +627,7 @@ Http::ConnectionPool::Instance* Filter::getConnPool() { // Note: Cluster may downgrade HTTP2 to HTTP1 based on runtime configuration. Http::Protocol protocol = cluster_->upstreamHttpProtocol(callbacks_->streamInfo().protocol()); transport_socket_options_ = Network::TransportSocketOptionsUtility::fromFilterState( - callbacks_->streamInfo().filterState()); + *callbacks_->streamInfo().filterState()); return config_.cm_.httpConnPoolForCluster(route_entry_->clusterName(), route_entry_->priority(), protocol, this); @@ -1370,13 +1370,13 @@ bool Filter::setupRedirect(const Http::HeaderMap& headers, UpstreamRequest& upst attempting_internal_redirect_with_complete_stream_ = upstream_request.upstream_timing_.last_upstream_rx_byte_received_ && downstream_end_stream_; - StreamInfo::FilterState& filter_state = callbacks_->streamInfo().filterState(); + const StreamInfo::FilterStateSharedPtr& filter_state = callbacks_->streamInfo().filterState(); // As with setupRetry, redirects are not supported for streaming requests yet. if (downstream_end_stream_ && !callbacks_->decodingBuffer() && // Redirects with body not yet supported. location != nullptr && - convertRequestHeadersForInternalRedirect(*downstream_headers_, filter_state, + convertRequestHeadersForInternalRedirect(*downstream_headers_, *filter_state, route_entry_->maxInternalRedirects(), *location, *callbacks_->connection()) && callbacks_->recreateStream()) { diff --git a/source/common/stream_info/stream_info_impl.h b/source/common/stream_info/stream_info_impl.h index 6111a1918e4a4..54ad67662d01f 100644 --- a/source/common/stream_info/stream_info_impl.h +++ b/source/common/stream_info/stream_info_impl.h @@ -216,7 +216,7 @@ struct StreamInfoImpl : public StreamInfo { (*metadata_.mutable_filter_metadata())[name].MergeFrom(value); }; - FilterState& filterState() override { return *filter_state_; } + const FilterStateSharedPtr& filterState() override { return filter_state_; } const FilterState& filterState() const override { return *filter_state_; } void setRequestedServerName(absl::string_view requested_server_name) override { @@ -261,7 +261,7 @@ struct StreamInfoImpl : public StreamInfo { bool health_check_request_{}; const Router::RouteEntry* route_entry_{}; envoy::config::core::v3::Metadata metadata_{}; - std::shared_ptr filter_state_; + FilterStateSharedPtr filter_state_; std::string route_name_; private: diff --git a/source/common/tcp_proxy/tcp_proxy.cc b/source/common/tcp_proxy/tcp_proxy.cc index 78bb3375620a6..406eeca599a49 100644 --- a/source/common/tcp_proxy/tcp_proxy.cc +++ b/source/common/tcp_proxy/tcp_proxy.cc @@ -168,10 +168,10 @@ Config::Config(const envoy::extensions::filters::network::tcp_proxy::v3::TcpProx RouteConstSharedPtr Config::getRegularRouteFromEntries(Network::Connection& connection) { // First check if the per-connection state to see if we need to route to a pre-selected cluster - if (connection.streamInfo().filterState().hasData( + if (connection.streamInfo().filterState()->hasData( PerConnectionCluster::key())) { const PerConnectionCluster& per_connection_cluster = - connection.streamInfo().filterState().getDataReadOnly( + connection.streamInfo().filterState()->getDataReadOnly( PerConnectionCluster::key()); envoy::extensions::filters::network::tcp_proxy::v3::TcpProxy::DeprecatedV1::TCPRoute diff --git a/source/extensions/filters/http/grpc_stats/grpc_stats_filter.cc b/source/extensions/filters/http/grpc_stats/grpc_stats_filter.cc index a9668fc6a3e45..49bf996862417 100644 --- a/source/extensions/filters/http/grpc_stats/grpc_stats_filter.cc +++ b/source/extensions/filters/http/grpc_stats/grpc_stats_filter.cc @@ -81,7 +81,7 @@ class GrpcStatsFilter : public Http::PassThroughFilter { if (filter_object_ == nullptr) { auto state = std::make_unique(); filter_object_ = state.get(); - decoder_callbacks_->streamInfo().filterState().setData( + decoder_callbacks_->streamInfo().filterState()->setData( HttpFilterNames::get().GrpcStats, std::move(state), StreamInfo::FilterState::StateType::Mutable, StreamInfo::FilterState::LifeSpan::FilterChain); diff --git a/source/extensions/filters/http/jwt_authn/filter.cc b/source/extensions/filters/http/jwt_authn/filter.cc index 08bf82fb3c65c..117a8c62c2bba 100644 --- a/source/extensions/filters/http/jwt_authn/filter.cc +++ b/source/extensions/filters/http/jwt_authn/filter.cc @@ -59,7 +59,7 @@ Http::FilterHeadersStatus Filter::decodeHeaders(Http::HeaderMap& headers, bool) // Verify the JWT token, onComplete() will be called when completed. const auto* verifier = - config_->findVerifier(headers, decoder_callbacks_->streamInfo().filterState()); + config_->findVerifier(headers, *decoder_callbacks_->streamInfo().filterState()); if (!verifier) { onComplete(Status::Ok); } else { diff --git a/source/extensions/filters/network/sni_cluster/sni_cluster.cc b/source/extensions/filters/network/sni_cluster/sni_cluster.cc index b0962fb198816..eb1694647b75c 100644 --- a/source/extensions/filters/network/sni_cluster/sni_cluster.cc +++ b/source/extensions/filters/network/sni_cluster/sni_cluster.cc @@ -18,7 +18,7 @@ Network::FilterStatus SniClusterFilter::onNewConnection() { if (!sni.empty()) { // Set the tcp_proxy cluster to the same value as SNI. The data is mutable to allow // other filters to change it. - read_callbacks_->connection().streamInfo().filterState().setData( + read_callbacks_->connection().streamInfo().filterState()->setData( TcpProxy::PerConnectionCluster::key(), std::make_unique(sni), StreamInfo::FilterState::StateType::Mutable, diff --git a/test/common/access_log/access_log_formatter_test.cc b/test/common/access_log/access_log_formatter_test.cc index 0529c63a63b67..cdc46732edc5d 100644 --- a/test/common/access_log/access_log_formatter_test.cc +++ b/test/common/access_log/access_log_formatter_test.cc @@ -1027,16 +1027,16 @@ TEST(AccessLogFormatterTest, DynamicMetadataFormatter) { TEST(AccessLogFormatterTest, FilterStateFormatter) { Http::TestHeaderMapImpl header; StreamInfo::MockStreamInfo stream_info; - stream_info.filter_state_.setData("key", - std::make_unique("test_value"), - StreamInfo::FilterState::StateType::ReadOnly); - stream_info.filter_state_.setData("key-struct", - std::make_unique(), - StreamInfo::FilterState::StateType::ReadOnly); - stream_info.filter_state_.setData("key-no-serialization", - std::make_unique(), - StreamInfo::FilterState::StateType::ReadOnly); - stream_info.filter_state_.setData( + stream_info.filter_state_->setData("key", + std::make_unique("test_value"), + StreamInfo::FilterState::StateType::ReadOnly); + stream_info.filter_state_->setData("key-struct", + std::make_unique(), + StreamInfo::FilterState::StateType::ReadOnly); + stream_info.filter_state_->setData("key-no-serialization", + std::make_unique(), + StreamInfo::FilterState::StateType::ReadOnly); + stream_info.filter_state_->setData( "key-serialization-error", std::make_unique(std::chrono::seconds(-281474976710656)), StreamInfo::FilterState::StateType::ReadOnly); @@ -1299,11 +1299,12 @@ TEST(AccessLogFormatterTest, JsonFormatterTypedDynamicMetadataTest) { TEST(AccessLogFormatterTets, JsonFormatterFilterStateTest) { Http::TestHeaderMapImpl header; StreamInfo::MockStreamInfo stream_info; - stream_info.filter_state_.setData("test_key", - std::make_unique("test_value"), - StreamInfo::FilterState::StateType::ReadOnly); - stream_info.filter_state_.setData("test_obj", std::make_unique(), - StreamInfo::FilterState::StateType::ReadOnly); + stream_info.filter_state_->setData("test_key", + std::make_unique("test_value"), + StreamInfo::FilterState::StateType::ReadOnly); + stream_info.filter_state_->setData("test_obj", + std::make_unique(), + StreamInfo::FilterState::StateType::ReadOnly); EXPECT_CALL(Const(stream_info), filterState()).Times(testing::AtLeast(1)); std::unordered_map expected_json_map = { @@ -1320,11 +1321,12 @@ TEST(AccessLogFormatterTets, JsonFormatterFilterStateTest) { TEST(AccessLogFormatterTets, JsonFormatterTypedFilterStateTest) { Http::TestHeaderMapImpl header; StreamInfo::MockStreamInfo stream_info; - stream_info.filter_state_.setData("test_key", - std::make_unique("test_value"), - StreamInfo::FilterState::StateType::ReadOnly); - stream_info.filter_state_.setData("test_obj", std::make_unique(), - StreamInfo::FilterState::StateType::ReadOnly); + stream_info.filter_state_->setData("test_key", + std::make_unique("test_value"), + StreamInfo::FilterState::StateType::ReadOnly); + stream_info.filter_state_->setData("test_obj", + std::make_unique(), + StreamInfo::FilterState::StateType::ReadOnly); EXPECT_CALL(Const(stream_info), filterState()).Times(testing::AtLeast(1)); std::unordered_map key_mapping = { @@ -1414,9 +1416,9 @@ TEST(AccessLogFormatterTest, JsonFormatterTypedTest) { ProtobufWkt::Struct s; (*s.mutable_fields())["list"] = list; - stream_info.filter_state_.setData("test_obj", - std::make_unique(s), - StreamInfo::FilterState::StateType::ReadOnly); + stream_info.filter_state_->setData("test_obj", + std::make_unique(s), + StreamInfo::FilterState::StateType::ReadOnly); EXPECT_CALL(Const(stream_info), filterState()).Times(testing::AtLeast(1)); std::unordered_map key_mapping = { @@ -1491,14 +1493,14 @@ TEST(AccessLogFormatterTest, CompositeFormatterSuccess) { { EXPECT_CALL(Const(stream_info), filterState()).Times(testing::AtLeast(1)); - stream_info.filter_state_.setData("testing", - std::make_unique("test_value"), - StreamInfo::FilterState::StateType::ReadOnly, - StreamInfo::FilterState::LifeSpan::FilterChain); - stream_info.filter_state_.setData("serialized", - std::make_unique(), - StreamInfo::FilterState::StateType::ReadOnly, - StreamInfo::FilterState::LifeSpan::FilterChain); + stream_info.filter_state_->setData("testing", + std::make_unique("test_value"), + StreamInfo::FilterState::StateType::ReadOnly, + StreamInfo::FilterState::LifeSpan::FilterChain); + stream_info.filter_state_->setData("serialized", + std::make_unique(), + StreamInfo::FilterState::StateType::ReadOnly, + StreamInfo::FilterState::LifeSpan::FilterChain); const std::string format = "%FILTER_STATE(testing)%|%FILTER_STATE(serialized)%|" "%FILTER_STATE(testing):8%|%FILTER_STATE(nonexisting)%"; FormatterImpl formatter(format); diff --git a/test/common/http/conn_manager_impl_test.cc b/test/common/http/conn_manager_impl_test.cc index 2d63ba04fc4bf..724779c73be27 100644 --- a/test/common/http/conn_manager_impl_test.cc +++ b/test/common/http/conn_manager_impl_test.cc @@ -5117,15 +5117,15 @@ TEST_F(HttpConnectionManagerImplTest, ConnectionFilterState) { InSequence s; EXPECT_CALL(*decoder_filters_[0], decodeHeaders(_, true)) .WillOnce(Invoke([this](HeaderMap&, bool) -> FilterHeadersStatus { - decoder_filters_[0]->callbacks_->streamInfo().filterState().setData( + decoder_filters_[0]->callbacks_->streamInfo().filterState()->setData( "per_filter_chain", std::make_unique(1), StreamInfo::FilterState::StateType::ReadOnly, StreamInfo::FilterState::LifeSpan::FilterChain); - decoder_filters_[0]->callbacks_->streamInfo().filterState().setData( + decoder_filters_[0]->callbacks_->streamInfo().filterState()->setData( "per_downstream_request", std::make_unique(2), StreamInfo::FilterState::StateType::ReadOnly, StreamInfo::FilterState::LifeSpan::DownstreamRequest); - decoder_filters_[0]->callbacks_->streamInfo().filterState().setData( + decoder_filters_[0]->callbacks_->streamInfo().filterState()->setData( "per_downstream_connection", std::make_unique(3), StreamInfo::FilterState::StateType::ReadOnly, StreamInfo::FilterState::LifeSpan::DownstreamConnection); @@ -5134,26 +5134,26 @@ TEST_F(HttpConnectionManagerImplTest, ConnectionFilterState) { EXPECT_CALL(*decoder_filters_[1], decodeHeaders(_, true)) .WillOnce(Invoke([this](HeaderMap&, bool) -> FilterHeadersStatus { EXPECT_FALSE( - decoder_filters_[1]->callbacks_->streamInfo().filterState().hasData( + decoder_filters_[1]->callbacks_->streamInfo().filterState()->hasData( "per_filter_chain")); EXPECT_TRUE( - decoder_filters_[1]->callbacks_->streamInfo().filterState().hasData( + decoder_filters_[1]->callbacks_->streamInfo().filterState()->hasData( "per_downstream_request")); EXPECT_TRUE( - decoder_filters_[1]->callbacks_->streamInfo().filterState().hasData( + decoder_filters_[1]->callbacks_->streamInfo().filterState()->hasData( "per_downstream_connection")); return FilterHeadersStatus::StopIteration; })); EXPECT_CALL(*decoder_filters_[2], decodeHeaders(_, true)) .WillOnce(Invoke([this](HeaderMap&, bool) -> FilterHeadersStatus { EXPECT_FALSE( - decoder_filters_[2]->callbacks_->streamInfo().filterState().hasData( + decoder_filters_[2]->callbacks_->streamInfo().filterState()->hasData( "per_filter_chain")); EXPECT_FALSE( - decoder_filters_[2]->callbacks_->streamInfo().filterState().hasData( + decoder_filters_[2]->callbacks_->streamInfo().filterState()->hasData( "per_downstream_request")); EXPECT_TRUE( - decoder_filters_[2]->callbacks_->streamInfo().filterState().hasData( + decoder_filters_[2]->callbacks_->streamInfo().filterState()->hasData( "per_downstream_connection")); return FilterHeadersStatus::StopIteration; })); diff --git a/test/common/router/header_formatter_test.cc b/test/common/router/header_formatter_test.cc index 635e556545f55..f7d19351b2575 100644 --- a/test/common/router/header_formatter_test.cc +++ b/test/common/router/header_formatter_test.cc @@ -570,33 +570,35 @@ TEST_F(StreamInfoHeaderFormatterTest, TestFormatWithUpstreamMetadataVariableMiss } TEST_F(StreamInfoHeaderFormatterTest, TestFormatWithPerRequestStateVariable) { - Envoy::StreamInfo::FilterStateImpl filter_state( - Envoy::StreamInfo::FilterState::LifeSpan::FilterChain); - filter_state.setData("testing", std::make_unique("test_value"), - StreamInfo::FilterState::StateType::ReadOnly, - StreamInfo::FilterState::LifeSpan::FilterChain); - EXPECT_EQ("test_value", filter_state.getDataReadOnly("testing").asString()); + Envoy::StreamInfo::FilterStateSharedPtr filter_state( + std::make_shared( + Envoy::StreamInfo::FilterState::LifeSpan::FilterChain)); + filter_state->setData("testing", std::make_unique("test_value"), + StreamInfo::FilterState::StateType::ReadOnly, + StreamInfo::FilterState::LifeSpan::FilterChain); + EXPECT_EQ("test_value", filter_state->getDataReadOnly("testing").asString()); NiceMock stream_info; ON_CALL(stream_info, filterState()).WillByDefault(ReturnRef(filter_state)); - ON_CALL(Const(stream_info), filterState()).WillByDefault(ReturnRef(filter_state)); + ON_CALL(Const(stream_info), filterState()).WillByDefault(ReturnRef(*filter_state)); testFormatting(stream_info, "PER_REQUEST_STATE(testing)", "test_value"); testFormatting(stream_info, "PER_REQUEST_STATE(testing2)", ""); - EXPECT_EQ("test_value", filter_state.getDataReadOnly("testing").asString()); + EXPECT_EQ("test_value", filter_state->getDataReadOnly("testing").asString()); } TEST_F(StreamInfoHeaderFormatterTest, TestFormatWithNonStringPerRequestStateVariable) { - Envoy::StreamInfo::FilterStateImpl filter_state( - Envoy::StreamInfo::FilterState::LifeSpan::FilterChain); - filter_state.setData("testing", std::make_unique(1), - StreamInfo::FilterState::StateType::ReadOnly, - StreamInfo::FilterState::LifeSpan::FilterChain); - EXPECT_EQ(1, filter_state.getDataReadOnly("testing").access()); + Envoy::StreamInfo::FilterStateSharedPtr filter_state( + std::make_shared( + Envoy::StreamInfo::FilterState::LifeSpan::FilterChain)); + filter_state->setData("testing", std::make_unique(1), + StreamInfo::FilterState::StateType::ReadOnly, + StreamInfo::FilterState::LifeSpan::FilterChain); + EXPECT_EQ(1, filter_state->getDataReadOnly("testing").access()); NiceMock stream_info; ON_CALL(stream_info, filterState()).WillByDefault(ReturnRef(filter_state)); - ON_CALL(Const(stream_info), filterState()).WillByDefault(ReturnRef(filter_state)); + ON_CALL(Const(stream_info), filterState()).WillByDefault(ReturnRef(*filter_state)); testFormatting(stream_info, "PER_REQUEST_STATE(testing)", ""); } @@ -843,13 +845,14 @@ TEST(HeaderParserTest, TestParseInternal) { const SystemTime start_time(std::chrono::milliseconds(1522796769123)); ON_CALL(stream_info, startTime()).WillByDefault(Return(start_time)); - Envoy::StreamInfo::FilterStateImpl filter_state( - Envoy::StreamInfo::FilterState::LifeSpan::FilterChain); - filter_state.setData("testing", std::make_unique("test_value"), - StreamInfo::FilterState::StateType::ReadOnly, - StreamInfo::FilterState::LifeSpan::FilterChain); + Envoy::StreamInfo::FilterStateSharedPtr filter_state( + std::make_shared( + Envoy::StreamInfo::FilterState::LifeSpan::FilterChain)); + filter_state->setData("testing", std::make_unique("test_value"), + StreamInfo::FilterState::StateType::ReadOnly, + StreamInfo::FilterState::LifeSpan::FilterChain); ON_CALL(stream_info, filterState()).WillByDefault(ReturnRef(filter_state)); - ON_CALL(Const(stream_info), filterState()).WillByDefault(ReturnRef(filter_state)); + ON_CALL(Const(stream_info), filterState()).WillByDefault(ReturnRef(*filter_state)); for (const auto& test_case : test_cases) { Protobuf::RepeatedPtrField to_add; @@ -1013,13 +1016,14 @@ request_headers_to_remove: ["x-nope"] )EOF")); ON_CALL(*host, metadata()).WillByDefault(Return(metadata)); - Envoy::StreamInfo::FilterStateImpl filter_state( - Envoy::StreamInfo::FilterState::LifeSpan::FilterChain); - filter_state.setData("testing", std::make_unique("test_value"), - StreamInfo::FilterState::StateType::ReadOnly, - StreamInfo::FilterState::LifeSpan::FilterChain); + Envoy::StreamInfo::FilterStateSharedPtr filter_state( + std::make_shared( + Envoy::StreamInfo::FilterState::LifeSpan::FilterChain)); + filter_state->setData("testing", std::make_unique("test_value"), + StreamInfo::FilterState::StateType::ReadOnly, + StreamInfo::FilterState::LifeSpan::FilterChain); ON_CALL(stream_info, filterState()).WillByDefault(ReturnRef(filter_state)); - ON_CALL(Const(stream_info), filterState()).WillByDefault(ReturnRef(filter_state)); + ON_CALL(Const(stream_info), filterState()).WillByDefault(ReturnRef(*filter_state)); req_header_parser->evaluateHeaders(header_map, stream_info); diff --git a/test/common/router/router_test.cc b/test/common/router/router_test.cc index 85e36e4ccce21..7f90c3af15339 100644 --- a/test/common/router/router_test.cc +++ b/test/common/router/router_test.cc @@ -233,7 +233,7 @@ class RouterTestBase : public testing::Test { } void setNumPreviousRedirect(uint32_t num_previous_redirects) { - callbacks_.streamInfo().filterState().setData( + callbacks_.streamInfo().filterState()->setData( "num_internal_redirects", std::make_shared(num_previous_redirects), StreamInfo::FilterState::StateType::Mutable, @@ -305,9 +305,9 @@ TEST_F(RouterTest, UpdateFilterState) { ON_CALL(callbacks_.stream_info_, filterState()) .WillByDefault(ReturnRef(stream_info.filterState())); EXPECT_CALL(cm_.conn_pool_, newStream(_, _)).WillOnce(Return(&cancellable_)); - stream_info.filterState().setData(Network::UpstreamServerName::key(), - std::make_unique("dummy"), - StreamInfo::FilterState::StateType::Mutable); + stream_info.filterState()->setData(Network::UpstreamServerName::key(), + std::make_unique("dummy"), + StreamInfo::FilterState::StateType::Mutable); expectResponseTimerCreate(); Http::TestHeaderMapImpl headers; @@ -316,7 +316,7 @@ TEST_F(RouterTest, UpdateFilterState) { router_.decodeHeaders(headers, true); EXPECT_EQ("host", stream_info.filterState() - .getDataReadOnly(Network::UpstreamServerName::key()) + ->getDataReadOnly(Network::UpstreamServerName::key()) .value()); EXPECT_CALL(cancellable_, cancel()); router_.onDestroy(); @@ -840,9 +840,9 @@ void RouterTestBase::testAppendCluster(absl::optional clu /* host_address_header */ absl::nullopt, /* do_not_forward */ false, /* not_forwarded_header */ absl::nullopt); - callbacks_.streamInfo().filterState().setData(DebugConfig::key(), std::move(debug_config), - StreamInfo::FilterState::StateType::ReadOnly, - StreamInfo::FilterState::LifeSpan::FilterChain); + callbacks_.streamInfo().filterState()->setData(DebugConfig::key(), std::move(debug_config), + StreamInfo::FilterState::StateType::ReadOnly, + StreamInfo::FilterState::LifeSpan::FilterChain); NiceMock encoder; Http::StreamDecoder* response_decoder = nullptr; @@ -892,9 +892,9 @@ void RouterTestBase::testAppendUpstreamHost( /* host_address_header */ host_address_header_name, /* do_not_forward */ false, /* not_forwarded_header */ absl::nullopt); - callbacks_.streamInfo().filterState().setData(DebugConfig::key(), std::move(debug_config), - StreamInfo::FilterState::StateType::ReadOnly, - StreamInfo::FilterState::LifeSpan::FilterChain); + callbacks_.streamInfo().filterState()->setData(DebugConfig::key(), std::move(debug_config), + StreamInfo::FilterState::StateType::ReadOnly, + StreamInfo::FilterState::LifeSpan::FilterChain); cm_.conn_pool_.host_->hostname_ = "scooby.doo"; NiceMock encoder; @@ -964,9 +964,9 @@ void RouterTestBase::testDoNotForward( /* host_address_header */ absl::nullopt, /* do_not_forward */ true, /* not_forwarded_header */ not_forwarded_header_name); - callbacks_.streamInfo().filterState().setData(DebugConfig::key(), std::move(debug_config), - StreamInfo::FilterState::StateType::ReadOnly, - StreamInfo::FilterState::LifeSpan::FilterChain); + callbacks_.streamInfo().filterState()->setData(DebugConfig::key(), std::move(debug_config), + StreamInfo::FilterState::StateType::ReadOnly, + StreamInfo::FilterState::LifeSpan::FilterChain); Http::TestHeaderMapImpl response_headers{ {":status", "204"}, @@ -997,9 +997,9 @@ TEST_F(RouterTest, AllDebugConfig) { /* host_address_header */ absl::nullopt, /* do_not_forward */ true, /* not_forwarded_header */ absl::nullopt); - callbacks_.streamInfo().filterState().setData(DebugConfig::key(), std::move(debug_config), - StreamInfo::FilterState::StateType::ReadOnly, - StreamInfo::FilterState::LifeSpan::FilterChain); + callbacks_.streamInfo().filterState()->setData(DebugConfig::key(), std::move(debug_config), + StreamInfo::FilterState::StateType::ReadOnly, + StreamInfo::FilterState::LifeSpan::FilterChain); cm_.conn_pool_.host_->hostname_ = "scooby.doo"; Http::TestHeaderMapImpl response_headers{{":status", "204"}, @@ -3411,7 +3411,7 @@ TEST_F(RouterTest, HttpInternalRedirectSucceeded) { router_.onDestroy(); EXPECT_EQ(3, callbacks_.streamInfo() .filterState() - .getDataMutable("num_internal_redirects") + ->getDataMutable("num_internal_redirects") .value()); } @@ -4528,7 +4528,7 @@ TEST_F(RouterTest, UpstreamSocketOptionsReturnedNonEmpty) { } TEST_F(RouterTest, ApplicationProtocols) { - callbacks_.streamInfo().filterState().setData( + callbacks_.streamInfo().filterState()->setData( Network::ApplicationProtocols::key(), std::make_unique(std::vector{"foo", "bar"}), StreamInfo::FilterState::StateType::ReadOnly, StreamInfo::FilterState::LifeSpan::FilterChain); diff --git a/test/common/stream_info/stream_info_impl_test.cc b/test/common/stream_info/stream_info_impl_test.cc index 37831316855b8..40e2ed7e37ebb 100644 --- a/test/common/stream_info/stream_info_impl_test.cc +++ b/test/common/stream_info/stream_info_impl_test.cc @@ -162,10 +162,10 @@ TEST_F(StreamInfoImplTest, MiscSettersAndGetters) { stream_info.route_entry_ = &route_entry; EXPECT_EQ(&route_entry, stream_info.routeEntry()); - stream_info.filterState().setData("test", std::make_unique(1), - FilterState::StateType::ReadOnly, - FilterState::LifeSpan::FilterChain); - EXPECT_EQ(1, stream_info.filterState().getDataReadOnly("test").access()); + stream_info.filterState()->setData("test", std::make_unique(1), + FilterState::StateType::ReadOnly, + FilterState::LifeSpan::FilterChain); + EXPECT_EQ(1, stream_info.filterState()->getDataReadOnly("test").access()); EXPECT_EQ("", stream_info.requestedServerName()); absl::string_view sni_name = "stubserver.org"; diff --git a/test/common/stream_info/test_util.h b/test/common/stream_info/test_util.h index 270fc0518c24e..6069b54e0d357 100644 --- a/test/common/stream_info/test_util.h +++ b/test/common/stream_info/test_util.h @@ -12,7 +12,9 @@ namespace Envoy { class TestStreamInfo : public StreamInfo::StreamInfo { public: - TestStreamInfo() : filter_state_(Envoy::StreamInfo::FilterState::LifeSpan::FilterChain) { + TestStreamInfo() + : filter_state_(std::make_shared( + Envoy::StreamInfo::FilterState::LifeSpan::FilterChain)) { // Use 1999-01-01 00:00:00 +0 time_t fake_time = 915148800; start_time_ = std::chrono::system_clock::from_time_t(fake_time); @@ -174,8 +176,8 @@ class TestStreamInfo : public StreamInfo::StreamInfo { (*metadata_.mutable_filter_metadata())[name].MergeFrom(value); }; - const Envoy::StreamInfo::FilterState& filterState() const override { return filter_state_; } - Envoy::StreamInfo::FilterState& filterState() override { return filter_state_; } + const Envoy::StreamInfo::FilterStateSharedPtr& filterState() override { return filter_state_; } + const Envoy::StreamInfo::FilterState& filterState() const override { return *filter_state_; } void setRequestedServerName(const absl::string_view requested_server_name) override { requested_server_name_ = std::string(requested_server_name); @@ -224,7 +226,9 @@ class TestStreamInfo : public StreamInfo::StreamInfo { Ssl::ConnectionInfoConstSharedPtr upstream_connection_info_; const Router::RouteEntry* route_entry_{}; envoy::config::core::v3::Metadata metadata_{}; - Envoy::StreamInfo::FilterStateImpl filter_state_; + Envoy::StreamInfo::FilterStateSharedPtr filter_state_{ + std::make_shared( + Envoy::StreamInfo::FilterState::LifeSpan::FilterChain)}; Envoy::StreamInfo::UpstreamTiming upstream_timing_; std::string requested_server_name_; std::string upstream_transport_failure_reason_; diff --git a/test/common/tcp_proxy/tcp_proxy_test.cc b/test/common/tcp_proxy/tcp_proxy_test.cc index 0f25e2b8d748b..006258812f7e7 100644 --- a/test/common/tcp_proxy/tcp_proxy_test.cc +++ b/test/common/tcp_proxy/tcp_proxy_test.cc @@ -750,7 +750,7 @@ TEST(ConfigTest, PerConnectionClusterWithTopLevelMetadataMatchConfig) { HashedValue hv1(v1), hv2(v2); NiceMock connection; - connection.stream_info_.filterState().setData( + connection.stream_info_.filterState()->setData( "envoy.tcp_proxy.cluster", std::make_unique("filter_state_cluster"), StreamInfo::FilterState::StateType::Mutable, StreamInfo::FilterState::LifeSpan::DownstreamConnection); @@ -1775,10 +1775,10 @@ TEST_F(TcpProxyRoutingTest, DEPRECATED_FEATURE_TEST(UseClusterFromPerConnectionC initializeFilter(); NiceMock stream_info; - stream_info.filterState().setData("envoy.tcp_proxy.cluster", - std::make_unique("filter_state_cluster"), - StreamInfo::FilterState::StateType::Mutable, - StreamInfo::FilterState::LifeSpan::DownstreamConnection); + stream_info.filterState()->setData("envoy.tcp_proxy.cluster", + std::make_unique("filter_state_cluster"), + StreamInfo::FilterState::StateType::Mutable, + StreamInfo::FilterState::LifeSpan::DownstreamConnection); ON_CALL(connection_, streamInfo()).WillByDefault(ReturnRef(stream_info)); EXPECT_CALL(Const(connection_), streamInfo()).WillRepeatedly(ReturnRef(stream_info)); @@ -1796,10 +1796,10 @@ TEST_F(TcpProxyRoutingTest, DEPRECATED_FEATURE_TEST(UpstreamServerName)) { initializeFilter(); NiceMock stream_info; - stream_info.filterState().setData("envoy.network.upstream_server_name", - std::make_unique("www.example.com"), - StreamInfo::FilterState::StateType::ReadOnly, - StreamInfo::FilterState::LifeSpan::DownstreamConnection); + stream_info.filterState()->setData("envoy.network.upstream_server_name", + std::make_unique("www.example.com"), + StreamInfo::FilterState::StateType::ReadOnly, + StreamInfo::FilterState::LifeSpan::DownstreamConnection); ON_CALL(connection_, streamInfo()).WillByDefault(ReturnRef(stream_info)); EXPECT_CALL(Const(connection_), streamInfo()).WillRepeatedly(ReturnRef(stream_info)); @@ -1831,7 +1831,7 @@ TEST_F(TcpProxyRoutingTest, DEPRECATED_FEATURE_TEST(ApplicationProtocols)) { initializeFilter(); NiceMock stream_info; - stream_info.filterState().setData( + stream_info.filterState()->setData( Network::ApplicationProtocols::key(), std::make_unique(std::vector{"foo", "bar"}), StreamInfo::FilterState::StateType::ReadOnly, diff --git a/test/extensions/access_loggers/grpc/http_grpc_access_log_impl_test.cc b/test/extensions/access_loggers/grpc/http_grpc_access_log_impl_test.cc index 19d83ca9c2024..2afcb68817d80 100644 --- a/test/extensions/access_loggers/grpc/http_grpc_access_log_impl_test.cc +++ b/test/extensions/access_loggers/grpc/http_grpc_access_log_impl_test.cc @@ -145,13 +145,13 @@ TEST_F(HttpGrpcAccessLogTest, Marshalling) { stream_info.last_downstream_tx_byte_sent_ = 2ms; stream_info.setDownstreamLocalAddress(std::make_shared("/foo")); (*stream_info.metadata_.mutable_filter_metadata())["foo"] = ProtobufWkt::Struct(); - stream_info.filter_state_.setData("string_accessor", - std::make_unique("test_value"), - StreamInfo::FilterState::StateType::ReadOnly, - StreamInfo::FilterState::LifeSpan::FilterChain); - stream_info.filter_state_.setData("serialized", std::make_unique(), - StreamInfo::FilterState::StateType::ReadOnly, - StreamInfo::FilterState::LifeSpan::FilterChain); + stream_info.filter_state_->setData("string_accessor", + std::make_unique("test_value"), + StreamInfo::FilterState::StateType::ReadOnly, + StreamInfo::FilterState::LifeSpan::FilterChain); + stream_info.filter_state_->setData("serialized", std::make_unique(), + StreamInfo::FilterState::StateType::ReadOnly, + StreamInfo::FilterState::LifeSpan::FilterChain); expectLog(R"EOF( common_properties: downstream_remote_address: diff --git a/test/extensions/filters/http/grpc_stats/config_test.cc b/test/extensions/filters/http/grpc_stats/config_test.cc index 15e39bd3e0487..34389c2c6e60a 100644 --- a/test/extensions/filters/http/grpc_stats/config_test.cc +++ b/test/extensions/filters/http/grpc_stats/config_test.cc @@ -66,7 +66,7 @@ TEST_F(GrpcStatsFilterConfigTest, StatsHttp2HeaderOnlyResponse) { ->statsScope() .counter("grpc.lyft.users.BadCompanions.GetBadCompanions.total") .value()); - EXPECT_FALSE(stream_info_.filterState().hasDataWithName(HttpFilterNames::get().GrpcStats)); + EXPECT_FALSE(stream_info_.filterState()->hasDataWithName(HttpFilterNames::get().GrpcStats)); } TEST_F(GrpcStatsFilterConfigTest, StatsHttp2NormalResponse) { @@ -90,7 +90,7 @@ TEST_F(GrpcStatsFilterConfigTest, StatsHttp2NormalResponse) { ->statsScope() .counter("grpc.lyft.users.BadCompanions.GetBadCompanions.total") .value()); - EXPECT_FALSE(stream_info_.filterState().hasDataWithName(HttpFilterNames::get().GrpcStats)); + EXPECT_FALSE(stream_info_.filterState()->hasDataWithName(HttpFilterNames::get().GrpcStats)); } TEST_F(GrpcStatsFilterConfigTest, StatsHttp2ContentTypeGrpcPlusProto) { @@ -112,7 +112,7 @@ TEST_F(GrpcStatsFilterConfigTest, StatsHttp2ContentTypeGrpcPlusProto) { ->statsScope() .counter("grpc.lyft.users.BadCompanions.GetBadCompanions.total") .value()); - EXPECT_FALSE(stream_info_.filterState().hasDataWithName(HttpFilterNames::get().GrpcStats)); + EXPECT_FALSE(stream_info_.filterState()->hasDataWithName(HttpFilterNames::get().GrpcStats)); } TEST_F(GrpcStatsFilterConfigTest, MessageCounts) { @@ -139,8 +139,8 @@ TEST_F(GrpcStatsFilterConfigTest, MessageCounts) { ->statsScope() .counter("grpc.lyft.users.BadCompanions.GetBadCompanions.response_message_count") .value()); - const auto& data = - stream_info_.filterState().getDataReadOnly(HttpFilterNames::get().GrpcStats); + const auto& data = stream_info_.filterState()->getDataReadOnly( + HttpFilterNames::get().GrpcStats); EXPECT_EQ(2U, data.request_message_count); EXPECT_EQ(0U, data.response_message_count); diff --git a/test/extensions/filters/http/jwt_authn/filter_integration_test.cc b/test/extensions/filters/http/jwt_authn/filter_integration_test.cc index 620b5d5c4d88f..36aeeabe484a1 100644 --- a/test/extensions/filters/http/jwt_authn/filter_integration_test.cc +++ b/test/extensions/filters/http/jwt_authn/filter_integration_test.cc @@ -32,7 +32,7 @@ class HeaderToFilterStateFilter : public Http::PassThroughDecoderFilter { Http::FilterHeadersStatus decodeHeaders(Http::HeaderMap& headers, bool) override { const Http::HeaderEntry* entry = headers.get(header_); if (entry) { - decoder_callbacks_->streamInfo().filterState().setData( + decoder_callbacks_->streamInfo().filterState()->setData( state_, std::make_unique(entry->value().getStringView()), StreamInfo::FilterState::StateType::ReadOnly, StreamInfo::FilterState::LifeSpan::FilterChain); diff --git a/test/extensions/filters/network/sni_cluster/sni_cluster_test.cc b/test/extensions/filters/network/sni_cluster/sni_cluster_test.cc index 2625e70db449c..a047869ee0544 100644 --- a/test/extensions/filters/network/sni_cluster/sni_cluster_test.cc +++ b/test/extensions/filters/network/sni_cluster/sni_cluster_test.cc @@ -49,7 +49,7 @@ TEST(SniCluster, SetTcpProxyClusterOnlyIfSniIsPresent) { .WillByDefault(Return(EMPTY_STRING)); filter.onNewConnection(); - EXPECT_FALSE(stream_info.filterState().hasData( + EXPECT_FALSE(stream_info.filterState()->hasData( TcpProxy::PerConnectionCluster::key())); } @@ -59,11 +59,11 @@ TEST(SniCluster, SetTcpProxyClusterOnlyIfSniIsPresent) { .WillByDefault(Return("filter_state_cluster")); filter.onNewConnection(); - EXPECT_TRUE(stream_info.filterState().hasData( + EXPECT_TRUE(stream_info.filterState()->hasData( TcpProxy::PerConnectionCluster::key())); auto per_connection_cluster = - stream_info.filterState().getDataReadOnly( + stream_info.filterState()->getDataReadOnly( TcpProxy::PerConnectionCluster::key()); EXPECT_EQ(per_connection_cluster.value(), "filter_state_cluster"); } diff --git a/test/mocks/stream_info/mocks.cc b/test/mocks/stream_info/mocks.cc index 57d2ea436ff9d..095394e1cce66 100644 --- a/test/mocks/stream_info/mocks.cc +++ b/test/mocks/stream_info/mocks.cc @@ -15,7 +15,7 @@ namespace Envoy { namespace StreamInfo { MockStreamInfo::MockStreamInfo() - : filter_state_(FilterState::LifeSpan::FilterChain), + : filter_state_(std::make_shared(FilterState::LifeSpan::FilterChain)), downstream_local_address_(new Network::Address::Ipv4Instance("127.0.0.2")), downstream_direct_remote_address_(new Network::Address::Ipv4Instance("127.0.0.1")), downstream_remote_address_(new Network::Address::Ipv4Instance("127.0.0.1")) { @@ -88,7 +88,7 @@ MockStreamInfo::MockStreamInfo() ON_CALL(*this, dynamicMetadata()).WillByDefault(ReturnRef(metadata_)); ON_CALL(Const(*this), dynamicMetadata()).WillByDefault(ReturnRef(metadata_)); ON_CALL(*this, filterState()).WillByDefault(ReturnRef(filter_state_)); - ON_CALL(Const(*this), filterState()).WillByDefault(ReturnRef(filter_state_)); + ON_CALL(Const(*this), filterState()).WillByDefault(ReturnRef(*filter_state_)); ON_CALL(*this, setRequestedServerName(_)) .WillByDefault(Invoke([this](const absl::string_view requested_server_name) { requested_server_name_ = std::string(requested_server_name); diff --git a/test/mocks/stream_info/mocks.h b/test/mocks/stream_info/mocks.h index 22d7d16990bdd..3c11ed353a6c8 100644 --- a/test/mocks/stream_info/mocks.h +++ b/test/mocks/stream_info/mocks.h @@ -78,7 +78,7 @@ class MockStreamInfo : public StreamInfo { MOCK_METHOD(void, setDynamicMetadata, (const std::string&, const ProtobufWkt::Struct&)); MOCK_METHOD(void, setDynamicMetadata, (const std::string&, const std::string&, const std::string&)); - MOCK_METHOD(FilterState&, filterState, ()); + MOCK_METHOD(const FilterStateSharedPtr&, filterState, ()); MOCK_METHOD(const FilterState&, filterState, (), (const)); MOCK_METHOD(void, setRequestedServerName, (const absl::string_view)); MOCK_METHOD(const std::string&, requestedServerName, (), (const)); @@ -103,7 +103,7 @@ class MockStreamInfo : public StreamInfo { absl::optional response_code_; absl::optional response_code_details_; envoy::config::core::v3::Metadata metadata_; - FilterStateImpl filter_state_; + FilterStateSharedPtr filter_state_; uint64_t bytes_received_{}; uint64_t bytes_sent_{}; Network::Address::InstanceConstSharedPtr upstream_local_address_;