diff --git a/source/extensions/filters/http/ext_authz/ext_authz.cc b/source/extensions/filters/http/ext_authz/ext_authz.cc index c7b4bb98779a7..cd366c8f0de32 100644 --- a/source/extensions/filters/http/ext_authz/ext_authz.cc +++ b/source/extensions/filters/http/ext_authz/ext_authz.cc @@ -31,6 +31,10 @@ void FilterConfigPerRoute::merge(const FilterConfigPerRoute& other) { } void Filter::initiateCall(const Http::HeaderMap& headers) { + if (filter_return_ == FilterReturn::StopDecoding) { + return; + } + Router::RouteConstSharedPtr route = callbacks_->route(); if (route == nullptr || route->routeEntry() == nullptr) { return; @@ -96,8 +100,10 @@ Http::FilterHeadersStatus Filter::decodeHeaders(Http::HeaderMap& headers, bool e Http::FilterDataStatus Filter::decodeData(Buffer::Instance&, bool end_stream) { if (buffer_data_) { - if (end_stream || isBufferFull()) { - ENVOY_STREAM_LOG(debug, "ext_authz filter finished buffering the request", *callbacks_); + const bool buffer_is_full = isBufferFull(); + if (end_stream || buffer_is_full) { + ENVOY_STREAM_LOG(debug, "ext_authz filter finished buffering the request since {}", + *callbacks_, buffer_is_full ? "buffer is full" : "stream is ended"); initiateCall(*request_headers_); return filter_return_ == FilterReturn::StopDecoding ? Http::FilterDataStatus::StopIterationAndWatermark diff --git a/test/extensions/filters/http/ext_authz/ext_authz_test.cc b/test/extensions/filters/http/ext_authz/ext_authz_test.cc index e011340c5a16b..df2af91180eef 100644 --- a/test/extensions/filters/http/ext_authz/ext_authz_test.cc +++ b/test/extensions/filters/http/ext_authz/ext_authz_test.cc @@ -328,7 +328,11 @@ TEST_F(HttpFilterTest, RequestDataWithPartialMessage) { EXPECT_EQ(Http::FilterDataStatus::StopIterationAndBuffer, filter_->decodeData(data_, false)); data_.add("barfoo"); + EXPECT_EQ(Http::FilterDataStatus::StopIterationAndWatermark, filter_->decodeData(data_, false)); + + data_.add("more data after watermark is set is possible"); EXPECT_EQ(Http::FilterDataStatus::StopIterationAndWatermark, filter_->decodeData(data_, true)); + EXPECT_EQ(Http::FilterTrailersStatus::StopIteration, filter_->decodeTrailers(request_headers_)); }