-
Notifications
You must be signed in to change notification settings - Fork 4.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
hcm: bugfix - request hangs where 1st filter adds body, and 2nd filte…
…r waits for it (#11248) Fix a bug where a request without a body hangs where a filter adds a body, and a subsequent filter stops the iteration until decodeData. Signed-off-by: Yuval Kohavi <yuval.kohavi@gmail.com>
- Loading branch information
Showing
8 changed files
with
267 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
#include <string> | ||
|
||
#include "envoy/http/filter.h" | ||
#include "envoy/registry/registry.h" | ||
#include "envoy/server/filter_config.h" | ||
|
||
#include "common/buffer/buffer_impl.h" | ||
|
||
#include "extensions/filters/http/common/pass_through_filter.h" | ||
|
||
#include "test/extensions/filters/http/common/empty_http_filter_config.h" | ||
#include "test/integration/filters/common.h" | ||
|
||
namespace Envoy { | ||
|
||
// A test filter that inserts body to a header only request/response. | ||
class AddBodyStreamFilter : public Http::PassThroughFilter { | ||
public: | ||
constexpr static char name[] = "add-body-filter"; | ||
|
||
Http::FilterHeadersStatus decodeHeaders(Http::RequestHeaderMap& headers, | ||
bool end_stream) override { | ||
if (end_stream) { | ||
Buffer::OwnedImpl body("body"); | ||
headers.setContentLength(body.length()); | ||
decoder_callbacks_->addDecodedData(body, false); | ||
} | ||
|
||
return Http::FilterHeadersStatus::Continue; | ||
} | ||
|
||
Http::FilterHeadersStatus encodeHeaders(Http::ResponseHeaderMap& headers, | ||
bool end_stream) override { | ||
if (end_stream) { | ||
Buffer::OwnedImpl body("body"); | ||
headers.setContentLength(body.length()); | ||
encoder_callbacks_->addEncodedData(body, false); | ||
} | ||
|
||
return Http::FilterHeadersStatus::Continue; | ||
} | ||
}; | ||
|
||
constexpr char AddBodyStreamFilter::name[]; | ||
|
||
static Registry::RegisterFactory<SimpleFilterConfig<AddBodyStreamFilter>, | ||
Server::Configuration::NamedHttpFilterConfigFactory> | ||
encoder_register_; | ||
} // namespace Envoy |
52 changes: 52 additions & 0 deletions
52
test/integration/filters/wait_for_whole_request_and_response.cc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
#include <string> | ||
|
||
#include "envoy/http/filter.h" | ||
#include "envoy/registry/registry.h" | ||
#include "envoy/server/filter_config.h" | ||
|
||
#include "extensions/filters/http/common/pass_through_filter.h" | ||
|
||
#include "test/extensions/filters/http/common/empty_http_filter_config.h" | ||
#include "test/integration/filters/common.h" | ||
|
||
namespace Envoy { | ||
|
||
// A test filter that waits for the request/response to finish before continuing. | ||
class WaitForWholeRequestAndResponseStreamFilter : public Http::PassThroughFilter { | ||
public: | ||
constexpr static char name[] = "wait-for-whole-request-and-response-filter"; | ||
|
||
Http::FilterHeadersStatus decodeHeaders(Http::RequestHeaderMap&, bool end_stream) override { | ||
if (end_stream) { | ||
return Http::FilterHeadersStatus::Continue; | ||
} | ||
return Http::FilterHeadersStatus::StopIteration; | ||
} | ||
Http::FilterDataStatus decodeData(Buffer::Instance&, bool end_stream) override { | ||
if (end_stream) { | ||
return Http::FilterDataStatus::Continue; | ||
} | ||
return Http::FilterDataStatus::StopIterationAndBuffer; | ||
} | ||
|
||
Http::FilterHeadersStatus encodeHeaders(Http::ResponseHeaderMap&, bool end_stream) override { | ||
if (end_stream) { | ||
return Http::FilterHeadersStatus::Continue; | ||
} | ||
return Http::FilterHeadersStatus::StopIteration; | ||
} | ||
|
||
Http::FilterDataStatus encodeData(Buffer::Instance&, bool end_stream) override { | ||
if (end_stream) { | ||
return Http::FilterDataStatus::Continue; | ||
} | ||
return Http::FilterDataStatus::StopIterationAndBuffer; | ||
} | ||
}; | ||
|
||
constexpr char WaitForWholeRequestAndResponseStreamFilter::name[]; | ||
|
||
static Registry::RegisterFactory<SimpleFilterConfig<WaitForWholeRequestAndResponseStreamFilter>, | ||
Server::Configuration::NamedHttpFilterConfigFactory> | ||
encoder_register_; | ||
} // namespace Envoy |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters