No public description PiperOrigin-RevId: 866558814
diff --git a/quiche/balsa/balsa_frame.cc b/quiche/balsa/balsa_frame.cc index c282212..65f63dc 100644 --- a/quiche/balsa/balsa_frame.cc +++ b/quiche/balsa/balsa_frame.cc
@@ -1568,6 +1568,7 @@ return false; } } + return true; }
diff --git a/quiche/balsa/balsa_frame_test.cc b/quiche/balsa/balsa_frame_test.cc index 1757947..648cf8e 100644 --- a/quiche/balsa/balsa_frame_test.cc +++ b/quiche/balsa/balsa_frame_test.cc
@@ -1921,6 +1921,43 @@ EXPECT_EQ(BalsaFrameEnums::BALSA_NO_ERROR, balsa_frame_.ErrorCode()); } +TEST_F(HTTPBalsaFrameTest, ChunkExtensionWithThreeExtensionsAndDquote) { + std::string headers = + "POST / HTTP/1.1\r\n" + "Transfer-Encoding: chunked\r\n" + "\r\n"; + + std::string chunks = + "8" // chunk-size + ";foo" // chunk-ext-name alone + ";bar=baz" // chunk-ext-name=token + ";baz=\"za\\\"quote-ception\\\"p\"" // chunk-ext-name=quoted-string + "\r\n" // done with extensions + "deadbeef\r\n" // chunk-data + "0\r\n" // last-chunk + "\r\n"; + + ASSERT_EQ(headers.size(), + balsa_frame_.ProcessInput(headers.data(), headers.size())); + + balsa_frame_.set_balsa_visitor(&visitor_mock_); + { + InSequence s1; + EXPECT_CALL(visitor_mock_, OnChunkLength(8)); + EXPECT_CALL( + visitor_mock_, + OnChunkExtensionInput(";foo;bar=baz;baz=\"za\\\"quote-ception\\\"p\"")); + EXPECT_CALL(visitor_mock_, OnBodyChunkInput("deadbeef")); + EXPECT_CALL(visitor_mock_, OnChunkLength(0)); + EXPECT_CALL(visitor_mock_, OnChunkExtensionInput("")); + } + + EXPECT_EQ(chunks.size(), + balsa_frame_.ProcessInput(chunks.data(), chunks.size())); + EXPECT_TRUE(balsa_frame_.MessageFullyRead()); + EXPECT_FALSE(balsa_frame_.Error()); +} + TEST_F(HTTPBalsaFrameTest, InvalidChunkExtensionWithCarriageReturn) { balsa_frame_.set_http_validation_policy( HttpValidationPolicy{.disallow_lone_cr_in_chunk_extension = true});