Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
6c82da4
cluster: fix req/resp body/hdrs sizes tracking
Apr 9, 2021
1b06299
Wait until route has been cached to lookup cluster info
Apr 9, 2021
dfbd515
Fix tests
Apr 9, 2021
defbc71
DRY up the code a bit
Apr 10, 2021
c4e301a
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 10, 2021
f62ae63
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 12, 2021
de9d812
Add comment noting how rq headers size calculation happens
Apr 12, 2021
4b4216e
auto type deduction fixes
Apr 13, 2021
5dc6418
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 13, 2021
00b31d1
Add integration test
Apr 13, 2021
aab0a19
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 14, 2021
b90ee63
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 14, 2021
40d3e50
Snow's feedback
Apr 15, 2021
d9359c4
Move accounting into the router filter
Apr 15, 2021
28b2e4f
Add unit test plus ...
Apr 15, 2021
89c8008
No need for extra checks of body presence
Apr 15, 2021
f57757f
Test req/resp with trailers
Apr 15, 2021
e6984c0
Accidental newline
Apr 15, 2021
54768a4
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 15, 2021
f07c7df
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 15, 2021
7eaa391
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 16, 2021
8434c88
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 16, 2021
9700510
Fix clang-tidy
Apr 16, 2021
aae8c27
Add changelog entry for the bugfix
Apr 16, 2021
c05e9c9
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 20, 2021
f3f6628
Move accounting into UpstreamRequest
Apr 20, 2021
d267c1f
DRY things up a bit more
Apr 20, 2021
67c1b04
Fix changelog
Apr 20, 2021
52ad169
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 20, 2021
b38cabb
Fix tests.
Apr 20, 2021
b9ff5b3
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 23, 2021
ce177e4
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 26, 2021
cd35f10
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 27, 2021
dd7c8df
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 27, 2021
dd6f038
Merge remote-tracking branch 'upstream/main' into issue-15879
Apr 27, 2021
cb71154
Merge remote-tracking branch 'upstream/main' into issue-15879
May 3, 2021
f1d4073
Merge remote-tracking branch 'upstream/main' into issue-15879
May 10, 2021
37b1c03
Merge remote-tracking branch 'upstream/main' into issue-15879
May 12, 2021
3e2c2e7
Partial review comments
May 12, 2021
0e38f39
Merge remote-tracking branch 'upstream/main' into issue-15879
May 12, 2021
3c87ad4
Merge remote-tracking branch 'upstream/main' into issue-15879
May 14, 2021
fb67e2d
Merge remote-tracking branch 'upstream/main' into issue-15879
May 17, 2021
b930118
Merge remote-tracking branch 'upstream/main' into issue-15879
Jun 2, 2021
ded3f64
Fix docs
Jun 2, 2021
411bc33
Merge remote-tracking branch 'upstream/main' into issue-15879
Jun 9, 2021
d643593
Test multiple upstreams when hedging.
Jun 9, 2021
ee227c3
Fold integration test into protocol_integration_test.cc
Jun 9, 2021
809318a
Merge remote-tracking branch 'upstream/main' into issue-15879
Jun 9, 2021
503687b
Add 100 continue headers
Jun 9, 2021
3839d3a
Try and see if ASSERT_NE(..., nullptr) makes the linter happy
Jun 9, 2021
1ed0fe1
Revert "Try and see if ASSERT_NE(..., nullptr) makes the linter happy"
Jun 9, 2021
b182477
More linter workarounds
Jun 9, 2021
d9eb1ee
Merge remote-tracking branch 'upstream/main' into issue-15879
Jun 10, 2021
30de437
Enable & checks histograms for Retry integration test
Jun 10, 2021
c294b37
Merge remote-tracking branch 'upstream/main' into issue-15879
Jun 10, 2021
4c3e1b2
Fix embarrassing bug 😱
Jun 10, 2021
251d22e
Add empty bodies and bodies of size 0 back
Jun 10, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/root/version_history/current.rst
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ Bug Fixes
*Changes expected to improve the state of the world and are unlikely to have negative effects*

* aws_lambda: if `payload_passthrough` is set to ``false``, the downstream response content-type header will now be set from the content-type entry in the JSON response's headers map, if present.
* cluster: fixed the :ref:`cluster stats <config_cluster_manager_cluster_stats_request_response_sizes>` histograms by moving the accounting into the router
filter. This means that we now properly compute the number of bytes sent as well as handling retries which were previously ignored.
* hot_restart: fix double counting of `server.seconds_until_first_ocsp_response_expiring` and `server.days_until_first_cert_expiring` during hot-restart. This stat was only incorrect until the parent process terminated.
* http: port stripping now works for CONNECT requests, though the port will be restored if the CONNECT request is sent upstream. This behavior can be temporarily reverted by setting ``envoy.reloadable_features.strip_port_from_connect`` to false.
* http: raise max configurable max_request_headers_kb limit to 8192 KiB (8MiB) from 96 KiB in http connection manager.
Expand Down
35 changes: 0 additions & 35 deletions source/common/http/conn_manager_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -694,19 +694,6 @@ ConnectionManagerImpl::ActiveStream::ActiveStream(ConnectionManagerImpl& connect

void ConnectionManagerImpl::ActiveStream::completeRequest() {
filter_manager_.streamInfo().onRequestComplete();
Upstream::HostDescriptionConstSharedPtr upstream_host =
connection_manager_.read_callbacks_->upstreamHost();

if (upstream_host != nullptr) {
Upstream::ClusterRequestResponseSizeStatsOptRef req_resp_stats =
upstream_host->cluster().requestResponseSizeStats();
if (req_resp_stats.has_value()) {
req_resp_stats->get().upstream_rq_body_size_.recordValue(
filter_manager_.streamInfo().bytesReceived());
req_resp_stats->get().upstream_rs_body_size_.recordValue(
filter_manager_.streamInfo().bytesSent());
}
}

if (connection_manager_.remote_close_) {
filter_manager_.streamInfo().setResponseCodeDetails(
Expand Down Expand Up @@ -794,17 +781,6 @@ void ConnectionManagerImpl::ActiveStream::chargeStats(const ResponseHeaderMap& h
return;
}

Upstream::HostDescriptionConstSharedPtr upstream_host =
connection_manager_.read_callbacks_->upstreamHost();

if (upstream_host != nullptr) {
Upstream::ClusterRequestResponseSizeStatsOptRef req_resp_stats =
upstream_host->cluster().requestResponseSizeStats();
if (req_resp_stats.has_value()) {
req_resp_stats->get().upstream_rs_headers_size_.recordValue(headers.byteSize());
}
}

// No response is sent back downstream for internal redirects, so don't charge downstream stats.
const absl::optional<std::string>& response_code_details =
filter_manager_.streamInfo().responseCodeDetails();
Expand Down Expand Up @@ -866,17 +842,6 @@ void ConnectionManagerImpl::ActiveStream::decodeHeaders(RequestHeaderMapPtr&& he
request_header_timer_.reset();
}

Upstream::HostDescriptionConstSharedPtr upstream_host =
connection_manager_.read_callbacks_->upstreamHost();

if (upstream_host != nullptr) {
Upstream::ClusterRequestResponseSizeStatsOptRef req_resp_stats =
upstream_host->cluster().requestResponseSizeStats();
if (req_resp_stats.has_value()) {
req_resp_stats->get().upstream_rq_headers_size_.recordValue(request_headers_->byteSize());
}
}

// Both saw_connection_close_ and is_head_request_ affect local replies: set
// them as early as possible.
const Protocol protocol = connection_manager_.codec_->protocol();
Expand Down
17 changes: 17 additions & 0 deletions source/common/router/upstream_request.cc
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,20 @@ UpstreamRequest::~UpstreamRequest() {
FilterUtility::percentageOfTimeout(response_time, parent_.timeout().per_try_timeout_));
}

// Ditto for request/response size histograms.
Upstream::ClusterRequestResponseSizeStatsOptRef req_resp_stats_opt =
parent_.cluster()->requestResponseSizeStats();
if (req_resp_stats_opt.has_value()) {
auto& req_resp_stats = req_resp_stats_opt->get();
req_resp_stats.upstream_rq_headers_size_.recordValue(parent_.downstreamHeaders()->byteSize());
req_resp_stats.upstream_rq_body_size_.recordValue(stream_info_.bytesSent());

if (response_headers_size_.has_value()) {
req_resp_stats.upstream_rs_headers_size_.recordValue(response_headers_size_.value());
req_resp_stats.upstream_rs_body_size_.recordValue(stream_info_.bytesReceived());
}
}

stream_info_.setUpstreamTiming(upstream_timing_);
stream_info_.onRequestComplete();
for (const auto& upstream_log : parent_.config().upstream_logs_) {
Expand All @@ -110,12 +124,15 @@ void UpstreamRequest::decode100ContinueHeaders(Http::ResponseHeaderMapPtr&& head
ScopeTrackerScopeState scope(&parent_.callbacks()->scope(), parent_.callbacks()->dispatcher());

ASSERT(100 == Http::Utility::getResponseStatus(*headers));
addResponseHeadersSize(headers->byteSize());
parent_.onUpstream100ContinueHeaders(std::move(headers), *this);
}

void UpstreamRequest::decodeHeaders(Http::ResponseHeaderMapPtr&& headers, bool end_stream) {
ScopeTrackerScopeState scope(&parent_.callbacks()->scope(), parent_.callbacks()->dispatcher());

addResponseHeadersSize(headers->byteSize());

// We drop 1xx other than 101 on the floor; 101 upgrade headers need to be passed to the client as
// part of the final response. 100-continue headers are handled in onUpstream100ContinueHeaders.
//
Expand Down
6 changes: 6 additions & 0 deletions source/common/router/upstream_request.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,9 @@ class UpstreamRequest : public Logger::Loggable<Logger::Id::router>,
return encode_complete_ && !buffered_request_body_ && !encode_trailers_ &&
downstream_metadata_map_vector_.empty();
}
void addResponseHeadersSize(uint64_t size) {
response_headers_size_ = response_headers_size_.value_or(0) + size;
}

RouterFilterInterface& parent_;
std::unique_ptr<GenericConnPool> conn_pool_;
Expand All @@ -141,6 +144,9 @@ class UpstreamRequest : public Logger::Loggable<Logger::Id::router>,
StreamInfo::StreamInfoImpl stream_info_;
StreamInfo::UpstreamTiming upstream_timing_;
const MonotonicTime start_time_;
// This is wrapped in an optional, since we want to avoid computing zero size headers when in
// reality we just didn't get a response back.
absl::optional<uint64_t> response_headers_size_{};
// Copies of upstream headers/trailers. These are only set if upstream
// access logging is configured.
Http::ResponseHeaderMapPtr upstream_headers_;
Expand Down
14 changes: 5 additions & 9 deletions test/common/http/async_client_impl_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ class AsyncClientImplTest : public testing::Test {
ON_CALL(*cm_.thread_local_cluster_.conn_pool_.host_, locality())
.WillByDefault(ReturnRef(envoy::config::core::v3::Locality().default_instance()));
cm_.initializeThreadLocalClusters({"fake_cluster"});
HttpTestUtility::addDefaultHeaders(headers_);
}

virtual void expectSuccess(AsyncClient::Request* sent_request, uint64_t code) {
Expand All @@ -75,6 +76,7 @@ class AsyncClientImplTest : public testing::Test {
}));
}

TestRequestHeaderMapImpl headers_{};
RequestMessagePtr message_{new RequestMessageImpl()};
Stats::MockIsolatedStatsStore stats_store_;
MockAsyncClientCallbacks callbacks_;
Expand Down Expand Up @@ -1488,10 +1490,8 @@ TEST_F(AsyncClientImplTest, MultipleDataStream) {
}

TEST_F(AsyncClientImplTest, WatermarkCallbacks) {
TestRequestHeaderMapImpl headers;
HttpTestUtility::addDefaultHeaders(headers);
AsyncClient::Stream* stream = client_.start(stream_callbacks_, AsyncClient::StreamOptions());
stream->sendHeaders(headers, false);
stream->sendHeaders(headers_, false);
Http::StreamDecoderFilterCallbacks* filter_callbacks =
static_cast<Http::AsyncStreamImpl*>(stream);
filter_callbacks->onDecoderFilterAboveWriteBufferHighWatermark();
Expand All @@ -1506,10 +1506,8 @@ TEST_F(AsyncClientImplTest, WatermarkCallbacks) {
}

TEST_F(AsyncClientImplTest, RdsGettersTest) {
TestRequestHeaderMapImpl headers;
HttpTestUtility::addDefaultHeaders(headers);
AsyncClient::Stream* stream = client_.start(stream_callbacks_, AsyncClient::StreamOptions());
stream->sendHeaders(headers, false);
stream->sendHeaders(headers_, false);
Http::StreamDecoderFilterCallbacks* filter_callbacks =
static_cast<Http::AsyncStreamImpl*>(stream);
auto route = filter_callbacks->route();
Expand All @@ -1522,16 +1520,14 @@ TEST_F(AsyncClientImplTest, RdsGettersTest) {
const auto& route_config = route_entry->virtualHost().routeConfig();
EXPECT_EQ("", route_config.name());
EXPECT_EQ(0, route_config.internalOnlyHeaders().size());
EXPECT_EQ(nullptr, route_config.route(headers, stream_info_, 0));
EXPECT_EQ(nullptr, route_config.route(headers_, stream_info_, 0));
auto cluster_info = filter_callbacks->clusterInfo();
ASSERT_NE(nullptr, cluster_info);
EXPECT_EQ(cm_.thread_local_cluster_.cluster_.info_, cluster_info);
EXPECT_CALL(stream_callbacks_, onReset());
}

TEST_F(AsyncClientImplTest, DumpState) {
TestRequestHeaderMapImpl headers;
HttpTestUtility::addDefaultHeaders(headers);
AsyncClient::Stream* stream = client_.start(stream_callbacks_, AsyncClient::StreamOptions());
Http::StreamDecoderFilterCallbacks* filter_callbacks =
static_cast<Http::AsyncStreamImpl*>(stream);
Expand Down
190 changes: 0 additions & 190 deletions test/common/http/conn_manager_impl_test_2.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2630,196 +2630,6 @@ TEST_F(HttpConnectionManagerImplTest, NewConnection) {
EXPECT_EQ(1U, stats_.named_.downstream_cx_http3_active_.value());
}

TEST_F(HttpConnectionManagerImplTest, TestUpstreamRequestHeadersSize) {
// Test with Headers only request, No Data, No response.
setup(false, "");
EXPECT_CALL(*codec_, dispatch(_)).WillOnce(Invoke([&](Buffer::Instance&) -> Http::Status {
decoder_ = &conn_manager_->newStream(response_encoder_);
RequestHeaderMapPtr headers{
new TestRequestHeaderMapImpl{{":authority", "host"}, {":path", "/"}, {":method", "GET"}}};
decoder_->decodeHeaders(std::move(headers), true);
return Http::okStatus();
}));

setupFilterChain(1, 0);

EXPECT_CALL(*decoder_filters_[0], decodeHeaders(_, true))
.WillOnce(Return(FilterHeadersStatus::StopIteration));
EXPECT_CALL(*decoder_filters_[0], decodeComplete());

std::shared_ptr<NiceMock<Upstream::MockHostDescription>> host_{
new NiceMock<Upstream::MockHostDescription>()};
filter_callbacks_.upstreamHost(host_);

EXPECT_CALL(
host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rq_headers_size"), 30));
EXPECT_CALL(host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rq_body_size"), 0));
EXPECT_CALL(host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rs_body_size"), 0));

Buffer::OwnedImpl fake_input("1234");
conn_manager_->onData(fake_input, false);

expectOnDestroy();
filter_callbacks_.connection_.raiseEvent(Network::ConnectionEvent::RemoteClose);
}

TEST_F(HttpConnectionManagerImplTest, TestUpstreamRequestBodySize) {
// Test Request with Headers and Data, No response.
setup(false, "");
EXPECT_CALL(*codec_, dispatch(_)).WillOnce(Invoke([&](Buffer::Instance&) -> Http::Status {
decoder_ = &conn_manager_->newStream(response_encoder_);
RequestHeaderMapPtr headers{
new TestRequestHeaderMapImpl{{":authority", "host"}, {":path", "/"}, {":method", "GET"}}};
decoder_->decodeHeaders(std::move(headers), false);

Buffer::OwnedImpl fake_data("12345");
decoder_->decodeData(fake_data, true);
return Http::okStatus();
}));

setupFilterChain(1, 0);

EXPECT_CALL(*decoder_filters_[0], decodeHeaders(_, false))
.WillOnce(Return(FilterHeadersStatus::StopIteration));
EXPECT_CALL(*decoder_filters_[0], decodeData(_, true))
.WillOnce(Return(FilterDataStatus::StopIterationNoBuffer));

EXPECT_CALL(*decoder_filters_[0], decodeComplete());

std::shared_ptr<NiceMock<Upstream::MockHostDescription>> host_{
new NiceMock<Upstream::MockHostDescription>()};
filter_callbacks_.upstreamHost(host_);

EXPECT_CALL(
host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rq_headers_size"), 30));
EXPECT_CALL(host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rq_body_size"), 5));
EXPECT_CALL(host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rs_body_size"), 0));

Buffer::OwnedImpl fake_input("1234");
conn_manager_->onData(fake_input, false);

expectOnDestroy();
filter_callbacks_.connection_.raiseEvent(Network::ConnectionEvent::RemoteClose);
}

TEST_F(HttpConnectionManagerImplTest, TestUpstreamResponseHeadersSize) {
// Test with Header only response.
setup(false, "");

EXPECT_CALL(*codec_, dispatch(_)).WillOnce(Invoke([&](Buffer::Instance&) -> Http::Status {
decoder_ = &conn_manager_->newStream(response_encoder_);
RequestHeaderMapPtr headers{
new TestRequestHeaderMapImpl{{":authority", "host"}, {":path", "/"}, {":method", "GET"}}};
decoder_->decodeHeaders(std::move(headers), false);

Buffer::OwnedImpl fake_data("1234");
decoder_->decodeData(fake_data, true);

return Http::okStatus();
}));

setupFilterChain(1, 0);

EXPECT_CALL(*decoder_filters_[0], decodeHeaders(_, false))
.WillOnce(Return(FilterHeadersStatus::StopIteration));
EXPECT_CALL(*decoder_filters_[0], decodeData(_, true))
.WillOnce(Return(FilterDataStatus::StopIterationNoBuffer));

EXPECT_CALL(*decoder_filters_[0], decodeComplete());

std::shared_ptr<NiceMock<Upstream::MockHostDescription>> host_{
new NiceMock<Upstream::MockHostDescription>()};
filter_callbacks_.upstreamHost(host_);

EXPECT_CALL(
host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rq_headers_size"), 30));

// Response headers are internally mutated and we record final response headers.
// for example in the below test case, response headers are modified as
// {':status', '200' 'date', 'Mon, 06 Jul 2020 06:08:55 GMT' 'server', ''}
// whose size is 49 instead of original response headers size 10({":status", "200"}).
EXPECT_CALL(
host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rs_headers_size"), 49));
EXPECT_CALL(host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rq_body_size"), 4));
EXPECT_CALL(host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rs_body_size"), 0));

Buffer::OwnedImpl fake_input("1234");
conn_manager_->onData(fake_input, false);

EXPECT_CALL(response_encoder_, encodeHeaders(_, true));
expectOnDestroy();

decoder_filters_[0]->callbacks_->streamInfo().setResponseCodeDetails("");
decoder_filters_[0]->callbacks_->encodeHeaders(
ResponseHeaderMapPtr{new TestResponseHeaderMapImpl{{":status", "200"}}}, true, "details");
}

TEST_F(HttpConnectionManagerImplTest, TestUpstreamResponseBodySize) {
// Test with response headers and body.
setup(false, "");

EXPECT_CALL(*codec_, dispatch(_)).WillOnce(Invoke([&](Buffer::Instance&) -> Http::Status {
decoder_ = &conn_manager_->newStream(response_encoder_);
RequestHeaderMapPtr headers{
new TestRequestHeaderMapImpl{{":authority", "host"}, {":path", "/"}, {":method", "GET"}}};
decoder_->decodeHeaders(std::move(headers), false);

Buffer::OwnedImpl fake_data("1234");
decoder_->decodeData(fake_data, true);

return Http::okStatus();
}));

setupFilterChain(1, 0);

EXPECT_CALL(*decoder_filters_[0], decodeHeaders(_, false))
.WillOnce(Return(FilterHeadersStatus::StopIteration));
EXPECT_CALL(*decoder_filters_[0], decodeData(_, true))
.WillOnce(Return(FilterDataStatus::StopIterationNoBuffer));

EXPECT_CALL(*decoder_filters_[0], decodeComplete());

std::shared_ptr<NiceMock<Upstream::MockHostDescription>> host_{
new NiceMock<Upstream::MockHostDescription>()};
filter_callbacks_.upstreamHost(host_);

EXPECT_CALL(
host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rq_headers_size"), 30));
EXPECT_CALL(
host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rs_headers_size"), 49));
EXPECT_CALL(host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rq_body_size"), 4));
EXPECT_CALL(host_->cluster_.request_response_size_stats_store_,
deliverHistogramToSinks(Property(&Stats::Metric::name, "upstream_rs_body_size"), 11));

Buffer::OwnedImpl fake_input("1234");
conn_manager_->onData(fake_input, false);

EXPECT_CALL(response_encoder_, encodeHeaders(_, false));

decoder_filters_[0]->callbacks_->streamInfo().setResponseCodeDetails("");
decoder_filters_[0]->callbacks_->encodeHeaders(
ResponseHeaderMapPtr{new TestResponseHeaderMapImpl{{":status", "200"}}}, false, "details");

EXPECT_CALL(response_encoder_, encodeData(_, true));
expectOnDestroy();

Buffer::OwnedImpl fake_response("hello-world");
decoder_filters_[0]->callbacks_->encodeData(fake_response, true);
}

TEST_F(HttpConnectionManagerImplTest, HeaderOnlyRequestAndResponseUsingHttp3) {
setup(false, "envoy-custom-server", false);

Expand Down
Loading