1 // Copyright 2024 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "quiche/quic/core/http/metadata_decoder.h"
6
7 #include "absl/strings/escaping.h"
8 #include "quiche/quic/core/qpack/qpack_encoder.h"
9 #include "quiche/quic/platform/api/quic_test.h"
10 #include "quiche/quic/test_tools/quic_test_utils.h"
11
12 namespace quic {
13 namespace test {
14 namespace {
15
16 class MetadataDecoderTest : public QuicTest {
17 protected:
EncodeHeaders(spdy::Http2HeaderBlock & headers)18 std::string EncodeHeaders(spdy::Http2HeaderBlock& headers) {
19 quic::NoopDecoderStreamErrorDelegate delegate;
20 quic::QpackEncoder encoder(&delegate, quic::HuffmanEncoding::kDisabled);
21 return encoder.EncodeHeaderList(id_, headers,
22 /*encoder_stream_sent_byte_count=*/nullptr);
23 }
24
25 size_t max_header_list_size = 1 << 20; // 1 MB
26 const QuicStreamId id_ = 1;
27 };
28
TEST_F(MetadataDecoderTest,Initialize)29 TEST_F(MetadataDecoderTest, Initialize) {
30 const size_t frame_header_len = 4;
31 const size_t payload_len = 123;
32 MetadataDecoder decoder(id_, max_header_list_size, frame_header_len,
33 payload_len);
34 EXPECT_EQ(frame_header_len + payload_len, decoder.frame_len());
35 EXPECT_EQ("", decoder.error_message());
36 EXPECT_TRUE(decoder.headers().empty());
37 }
38
TEST_F(MetadataDecoderTest,Decode)39 TEST_F(MetadataDecoderTest, Decode) {
40 spdy::Http2HeaderBlock headers;
41 headers["key1"] = "val1";
42 headers["key2"] = "val2";
43 headers["key3"] = "val3";
44 std::string data = EncodeHeaders(headers);
45
46 const size_t frame_header_len = 4;
47 MetadataDecoder decoder(id_, max_header_list_size, frame_header_len,
48 data.length());
49 EXPECT_TRUE(decoder.Decode(data));
50 EXPECT_TRUE(decoder.EndHeaderBlock());
51 EXPECT_EQ(quic::test::AsHeaderList(headers), decoder.headers());
52 }
53
TEST_F(MetadataDecoderTest,DecodeInvalidHeaders)54 TEST_F(MetadataDecoderTest, DecodeInvalidHeaders) {
55 std::string data = "aaaaaaaaaa";
56
57 const size_t frame_header_len = 4;
58 MetadataDecoder decoder(id_, max_header_list_size, frame_header_len,
59 data.length());
60 EXPECT_FALSE(decoder.Decode(data));
61 EXPECT_EQ("Error decoding metadata: Error decoding Required Insert Count.",
62 decoder.error_message());
63 }
64
TEST_F(MetadataDecoderTest,TooLarge)65 TEST_F(MetadataDecoderTest, TooLarge) {
66 spdy::Http2HeaderBlock headers;
67 for (int i = 0; i < 1024; ++i) {
68 headers.AppendValueOrAddHeader(absl::StrCat(i), std::string(1024, 'a'));
69 }
70 std::string data = EncodeHeaders(headers);
71
72 EXPECT_GT(data.length(), 1 << 20);
73 const size_t frame_header_len = 4;
74 MetadataDecoder decoder(id_, max_header_list_size, frame_header_len,
75 data.length());
76 EXPECT_TRUE(decoder.Decode(data));
77 EXPECT_FALSE(decoder.EndHeaderBlock());
78 EXPECT_TRUE(decoder.error_message().empty());
79 }
80
81 } // namespace
82 } // namespace test
83 } // namespace quic
84