-
Notifications
You must be signed in to change notification settings - Fork 4.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
http: allow decoding/encoding a header only request/response #4885
Changes from 1 commit
ed6b15d
259cde2
7ea1664
c8fb131
0122b27
5eb4cd9
1575210
3f4d517
c104aaa
cd98729
4a82d5a
1ed28a7
d5d98c7
63b1847
ad59360
b893e80
f18361e
fd5f701
0c92e8b
24f2fec
82d0c44
6c0ea6b
e36e993
5f3ff84
15d0c71
ec72f47
d0a771b
ddce29e
36c1f08
7c14b69
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -720,9 +720,11 @@ void ConnectionManagerImpl::ActiveStream::decodeHeaders(ActiveStreamDecoderFilte | |
for (; entry != decoder_filters_.end(); entry++) { | ||
ASSERT(!(state_.filter_call_state_ & FilterCallState::DecodeHeaders)); | ||
state_.filter_call_state_ |= FilterCallState::DecodeHeaders; | ||
FilterHeadersStatus status = (*entry)->decodeHeaders( | ||
headers, | ||
decoding_headers_only_ || (end_stream && continue_data_entry == decoder_filters_.end())); | ||
const auto current_filter_end_stream = | ||
decoding_headers_only_ || (end_stream && continue_data_entry == decoder_filters_.end()); | ||
FilterHeadersStatus status = (*entry)->decodeHeaders(headers, current_filter_end_stream); | ||
|
||
ASSERT(!(status == FilterHeadersStatus::ContinueAndEndStream && current_filter_end_stream)); | ||
state_.filter_call_state_ &= ~FilterCallState::DecodeHeaders; | ||
ENVOY_STREAM_LOG(trace, "decode headers called: filter={} status={}", *this, | ||
static_cast<const void*>((*entry).get()), static_cast<uint64_t>(status)); | ||
|
@@ -1393,7 +1395,7 @@ bool ConnectionManagerImpl::ActiveStreamFilterBase::commonHandleAfterHeadersCall | |
if (status == FilterHeadersStatus::StopIteration) { | ||
stopped_ = true; | ||
return false; | ||
} else if (status == FilterHeadersStatus::ContinueHeadersOnly) { | ||
} else if (status == FilterHeadersStatus::ContinueAndEndStream) { | ||
// Set headers_only to true so we know to end early if necessary, | ||
// but continue filter iteration so we actually write the headers/run the cleanup code. | ||
headers_only = true; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consider a debug log here - we're pretty consistent about logging headers/body/trailers so logging that we'll be swallowing them is probably helpful for debugging |
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2701,22 +2701,22 @@ TEST_F(HttpConnectionManagerImplTest, FilterHeadReply) { | |
conn_manager_->onData(fake_input, false); | ||
} | ||
|
||
TEST_F(HttpConnectionManagerImplTest, FilterContinueHeadersOnlyHeaders) { | ||
TEST_F(HttpConnectionManagerImplTest, FilterContinueAndEndStreamHeaders) { | ||
InSequence s; | ||
setup(false, ""); | ||
|
||
EXPECT_CALL(*codec_, dispatch(_)).WillOnce(Invoke([&](Buffer::Instance&) -> void { | ||
StreamDecoder* decoder = &conn_manager_->newStream(response_encoder_); | ||
HeaderMapPtr headers{ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. make_unique wherever possible |
||
new TestHeaderMapImpl{{":authority", "host"}, {":path", "/"}, {":method", "GET"}}}; | ||
decoder->decodeHeaders(std::move(headers), true); | ||
decoder->decodeHeaders(std::move(headers), false); | ||
})); | ||
|
||
setupFilterChain(2, 2); | ||
|
||
EXPECT_CALL(*decoder_filters_[0], decodeHeaders(_, true)) | ||
EXPECT_CALL(*decoder_filters_[0], decodeHeaders(_, false)) | ||
.WillOnce(InvokeWithoutArgs( | ||
[&]() -> FilterHeadersStatus { return FilterHeadersStatus::ContinueHeadersOnly; })); | ||
[&]() -> FilterHeadersStatus { return FilterHeadersStatus::ContinueAndEndStream; })); | ||
EXPECT_CALL(*decoder_filters_[1], decodeHeaders(_, true)) | ||
.WillOnce(Return(FilterHeadersStatus::Continue)); | ||
|
||
|
@@ -2725,7 +2725,7 @@ TEST_F(HttpConnectionManagerImplTest, FilterContinueHeadersOnlyHeaders) { | |
conn_manager_->onData(fake_input, true); | ||
|
||
EXPECT_CALL(*encoder_filters_[1], encodeHeaders(_, true)) | ||
.WillOnce(Return(FilterHeadersStatus::ContinueHeadersOnly)); | ||
.WillOnce(Return(FilterHeadersStatus::ContinueAndEndStream)); | ||
EXPECT_CALL(*encoder_filters_[0], encodeHeaders(_, true)) | ||
.WillOnce(Return(FilterHeadersStatus::Continue)); | ||
EXPECT_CALL(response_encoder_, encodeHeaders(_, true)); | ||
|
@@ -2739,7 +2739,7 @@ TEST_F(HttpConnectionManagerImplTest, FilterContinueHeadersOnlyHeaders) { | |
decoder_filters_[1]->callbacks_->encodeData(response_body, true); | ||
} | ||
|
||
TEST_F(HttpConnectionManagerImplTest, FilterContinueHeadersOnlyData) { | ||
TEST_F(HttpConnectionManagerImplTest, FilterContinueAndEndStreamData) { | ||
InSequence s; | ||
setup(false, ""); | ||
|
||
|
@@ -2757,7 +2757,7 @@ TEST_F(HttpConnectionManagerImplTest, FilterContinueHeadersOnlyData) { | |
|
||
EXPECT_CALL(*decoder_filters_[0], decodeHeaders(_, false)) | ||
.WillOnce(InvokeWithoutArgs( | ||
[&]() -> FilterHeadersStatus { return FilterHeadersStatus::ContinueHeadersOnly; })); | ||
[&]() -> FilterHeadersStatus { return FilterHeadersStatus::ContinueAndEndStream; })); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
EXPECT_CALL(*decoder_filters_[1], decodeHeaders(_, true)) | ||
.WillOnce(Return(FilterHeadersStatus::Continue)); | ||
|
||
|
@@ -2766,7 +2766,7 @@ TEST_F(HttpConnectionManagerImplTest, FilterContinueHeadersOnlyData) { | |
conn_manager_->onData(fake_input, false); | ||
|
||
EXPECT_CALL(*encoder_filters_[1], encodeHeaders(_, false)) | ||
.WillOnce(Return(FilterHeadersStatus::ContinueHeadersOnly)); | ||
.WillOnce(Return(FilterHeadersStatus::ContinueAndEndStream)); | ||
EXPECT_CALL(*encoder_filters_[0], encodeHeaders(_, true)) | ||
.WillOnce(Return(FilterHeadersStatus::Continue)); | ||
EXPECT_CALL(response_encoder_, encodeHeaders(_, true)); | ||
|
@@ -2780,7 +2780,7 @@ TEST_F(HttpConnectionManagerImplTest, FilterContinueHeadersOnlyData) { | |
decoder_filters_[1]->callbacks_->encodeData(response_body, true); | ||
} | ||
|
||
TEST_F(HttpConnectionManagerImplTest, FilterContinueHeadersOnlyTrailers) { | ||
TEST_F(HttpConnectionManagerImplTest, FilterContinueAndEndStreamTrailers) { | ||
InSequence s; | ||
setup(false, ""); | ||
|
||
|
@@ -2801,7 +2801,7 @@ TEST_F(HttpConnectionManagerImplTest, FilterContinueHeadersOnlyTrailers) { | |
|
||
EXPECT_CALL(*decoder_filters_[0], decodeHeaders(_, false)) | ||
.WillOnce(InvokeWithoutArgs( | ||
[&]() -> FilterHeadersStatus { return FilterHeadersStatus::ContinueHeadersOnly; })); | ||
[&]() -> FilterHeadersStatus { return FilterHeadersStatus::ContinueAndEndStream; })); | ||
EXPECT_CALL(*decoder_filters_[1], decodeHeaders(_, true)) | ||
.WillOnce(Return(FilterHeadersStatus::Continue)); | ||
|
||
|
@@ -2810,7 +2810,7 @@ TEST_F(HttpConnectionManagerImplTest, FilterContinueHeadersOnlyTrailers) { | |
conn_manager_->onData(fake_input, false); | ||
|
||
EXPECT_CALL(*encoder_filters_[1], encodeHeaders(_, false)) | ||
.WillOnce(Return(FilterHeadersStatus::ContinueHeadersOnly)); | ||
.WillOnce(Return(FilterHeadersStatus::ContinueAndEndStream)); | ||
EXPECT_CALL(*encoder_filters_[0], encodeHeaders(_, true)) | ||
.WillOnce(Return(FilterHeadersStatus::Continue)); | ||
EXPECT_CALL(response_encoder_, encodeHeaders(_, true)); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
s/and/any