diff --git a/source/common/http/http1/codec_impl.cc b/source/common/http/http1/codec_impl.cc index e5db3fc530d0..3db47c9b4381 100644 --- a/source/common/http/http1/codec_impl.cc +++ b/source/common/http/http1/codec_impl.cc @@ -579,8 +579,8 @@ int ConnectionImpl::onHeadersCompleteBase() { absl::string_view encoding = current_headers.TransferEncoding()->value().getStringView(); if (Runtime::runtimeFeatureEnabled( "envoy.reloadable_features.reject_unsupported_transfer_encodings") && - encoding != Headers::get().TransferEncodingValues.Identity && - encoding != Headers::get().TransferEncodingValues.Chunked) { + !absl::EqualsIgnoreCase(encoding, Headers::get().TransferEncodingValues.Identity) && + !absl::EqualsIgnoreCase(encoding, Headers::get().TransferEncodingValues.Chunked)) { error_code_ = Http::Code::NotImplemented; sendProtocolError(); throw CodecProtocolException("http/1.1 protocol error: unsupported transfer encoding"); diff --git a/test/common/http/http1/codec_impl_test.cc b/test/common/http/http1/codec_impl_test.cc index 98214a6de3b4..6539cfbad17a 100644 --- a/test/common/http/http1/codec_impl_test.cc +++ b/test/common/http/http1/codec_impl_test.cc @@ -315,6 +315,30 @@ TEST_F(Http1ServerConnectionImplTest, ChunkedBody) { EXPECT_EQ(0U, buffer.length()); } +TEST_F(Http1ServerConnectionImplTest, ChunkedBodyCase) { + initialize(); + + InSequence sequence; + + MockRequestDecoder decoder; + EXPECT_CALL(callbacks_, newStream(_, _)).WillOnce(ReturnRef(decoder)); + + TestHeaderMapImpl expected_headers{ + {":path", "/"}, + {":method", "POST"}, + {"transfer-encoding", "Chunked"}, + }; + EXPECT_CALL(decoder, decodeHeaders_(HeaderMapEqual(&expected_headers), false)).Times(1); + Buffer::OwnedImpl expected_data("Hello World"); + EXPECT_CALL(decoder, decodeData(BufferEqual(&expected_data), false)).Times(1); + EXPECT_CALL(decoder, decodeData(_, true)).Times(1); + + Buffer::OwnedImpl buffer( + "POST / HTTP/1.1\r\ntransfer-encoding: Chunked\r\n\r\nb\r\nHello World\r\n0\r\n\r\n"); + codec_->dispatch(buffer); + EXPECT_EQ(0U, buffer.length()); +} + // Currently http_parser does not support chained transfer encodings. TEST_F(Http1ServerConnectionImplTest, IdentityAndChunkedBody) { initialize();