diff --git a/source/extensions/filters/http/kill_request/kill_request_filter.cc b/source/extensions/filters/http/kill_request/kill_request_filter.cc index 7cf10a23bc1b2..b278fabe235ca 100644 --- a/source/extensions/filters/http/kill_request/kill_request_filter.cc +++ b/source/extensions/filters/http/kill_request/kill_request_filter.cc @@ -61,8 +61,9 @@ Http::FilterHeadersStatus KillRequestFilter::decodeHeaders(Http::RequestHeaderMa if (per_route_kill_settings) { is_correct_direction = per_route_kill_settings->getDirection() == KillRequest::REQUEST; - envoy::type::v3::FractionalPercent probability = per_route_kill_settings->getProbability(); - kill_request_.set_allocated_probability(&probability); + // Allocate the probability into kill_request in case the lifetime of + // per_route_kill_settings does not match that of kill_request_ + kill_request_.mutable_probability()->CopyFrom(per_route_kill_settings->getProbability()); } } diff --git a/test/extensions/filters/http/kill_request/kill_request_filter_test.cc b/test/extensions/filters/http/kill_request/kill_request_filter_test.cc index 581bfa0d34864..2b9483bdc0256 100644 --- a/test/extensions/filters/http/kill_request/kill_request_filter_test.cc +++ b/test/extensions/filters/http/kill_request/kill_request_filter_test.cc @@ -209,6 +209,24 @@ TEST_F(KillRequestFilterTest, KillsBasedOnDirection) { "KillRequestFilter is crashing Envoy!!!"); } +TEST_F(KillRequestFilterTest, PerRouteKillSettingFound) { + envoy::extensions::filters::http::kill_request::v3::KillRequest kill_request; + setUpTest(kill_request); + request_headers_.addCopy("x-envoy-kill-request", "true"); + + envoy::extensions::filters::http::kill_request::v3::KillRequest route_level_kill_request; + // Set probability to zero to make isKillRequestEnabled return false + route_level_kill_request.mutable_probability()->set_numerator(0); + route_level_kill_request.set_kill_request_header("x-custom-kill-request"); + + // Return valid kill setting on the REQUEST direction + const KillSettings kill_settings(route_level_kill_request); + ON_CALL(decoder_filter_callbacks_.route_->route_entry_, + perFilterConfig(Extensions::HttpFilters::HttpFilterNames::get().KillRequest)) + .WillByDefault(Return(&kill_settings)); + ASSERT_EQ(filter_->decodeHeaders(request_headers_, false), Http::FilterHeadersStatus::Continue); +} + } // namespace } // namespace KillRequest } // namespace HttpFilters