15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/spdy/hpack_decoder.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <map> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/logging.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_piece.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/spdy/hpack_encoder.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/spdy/hpack_input_stream.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/spdy/hpack_output_stream.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/spdy/spdy_test_utils.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace net { 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace test { 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using base::StringPiece; 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using std::string; 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class HpackDecoderPeer { 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit HpackDecoderPeer(HpackDecoder* decoder) 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : decoder_(decoder) {} 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void HandleHeaderRepresentation(StringPiece name, StringPiece value) { 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_->HandleHeaderRepresentation(name, value); 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool DecodeNextName(HpackInputStream* in, StringPiece* out) { 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return decoder_->DecodeNextName(in, out); 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HpackHeaderTable* header_table() { 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return &decoder_->header_table_; 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_cookie_value(string value) { 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_->cookie_value_ = value; 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string cookie_value() { 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return decoder_->cookie_value_; 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::map<string, string>& decoded_block() const { 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return decoder_->decoded_block_; 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const string& headers_block_buffer() const { 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return decoder_->headers_block_buffer_; 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HpackDecoder* decoder_; 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace test 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::StringPiece; 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using std::string; 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using test::a2b_hex; 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using testing::ElementsAre; 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using testing::Pair; 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const size_t kLiteralBound = 1024; 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class HpackDecoderTest : public ::testing::Test { 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HpackDecoderTest() 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : decoder_(ObtainHpackHuffmanTable()), 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu decoder_peer_(&decoder_) {} 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool DecodeHeaderBlock(StringPiece str) { 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return decoder_.HandleControlFrameHeadersData(0, str.data(), str.size()) && 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_.HandleControlFrameHeadersComplete(0); 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::map<string, string>& decoded_block() const { 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(jgraettinger): HpackDecoderTest should implement 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // SpdyHeadersHandlerInterface, and collect headers for examination. 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return decoder_peer_.decoded_block(); 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::map<string, string>& DecodeBlockExpectingSuccess(StringPiece str) { 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(DecodeHeaderBlock(str)); 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return decoded_block(); 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void expectEntry(size_t index, size_t size, const string& name, 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const string& value) { 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const HpackEntry* entry = decoder_peer_.header_table()->GetByIndex(index); 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(name, entry->name()) << "index " << index; 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(value, entry->value()); 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(size, entry->Size()); 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(index, decoder_peer_.header_table()->IndexOf(entry)); 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HpackDecoder decoder_; 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) test::HpackDecoderPeer decoder_peer_; 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HpackDecoderTest, HandleControlFrameHeadersData) { 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Strings under threshold are concatenated in the buffer. 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(decoder_.HandleControlFrameHeadersData( 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, "small string one", 16)); 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(decoder_.HandleControlFrameHeadersData( 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, "small string two", 16)); 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // A string which would push the buffer over the threshold is refused. 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(decoder_.HandleControlFrameHeadersData( 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 0, "fails", kMaxDecodeBufferSize - 32 + 1)); 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(decoder_peer_.headers_block_buffer(), 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "small string onesmall string two"); 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HpackDecoderTest, HandleControlFrameHeadersComplete) { 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_peer_.set_cookie_value("foobar=baz"); 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Incremental cookie buffer should be emitted and cleared. 12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) decoder_.HandleControlFrameHeadersData(0, "\x82\x85", 2); 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_.HandleControlFrameHeadersComplete(0); 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_THAT(decoded_block(), ElementsAre( 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":method", "GET"), 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":path", "/index.html"), 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Pair("cookie", "foobar=baz"))); 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(decoder_peer_.cookie_value(), ""); 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HpackDecoderTest, HandleHeaderRepresentation) { 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // All cookie crumbs are joined. 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) decoder_peer_.HandleHeaderRepresentation("cookie", " part 1"); 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_peer_.HandleHeaderRepresentation("cookie", "part 2 "); 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_peer_.HandleHeaderRepresentation("cookie", "part3"); 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Already-delimited headers are passed through. 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_peer_.HandleHeaderRepresentation("passed-through", 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string("foo\0baz", 7)); 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Other headers are joined on \0. Case matters. 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_peer_.HandleHeaderRepresentation("joined", "not joined"); 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_peer_.HandleHeaderRepresentation("joineD", "value 1"); 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_peer_.HandleHeaderRepresentation("joineD", "value 2"); 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Empty headers remain empty. 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_peer_.HandleHeaderRepresentation("empty", ""); 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Joined empty headers work as expected. 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_peer_.HandleHeaderRepresentation("empty-joined", ""); 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_peer_.HandleHeaderRepresentation("empty-joined", "foo"); 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_peer_.HandleHeaderRepresentation("empty-joined", ""); 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_peer_.HandleHeaderRepresentation("empty-joined", ""); 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Non-contiguous cookie crumb. 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) decoder_peer_.HandleHeaderRepresentation("cookie", " fin!"); 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Finish and emit all headers. 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_.HandleControlFrameHeadersComplete(0); 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_THAT(decoded_block(), ElementsAre( 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Pair("cookie", " part 1; part 2 ; part3; fin!"), 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("empty", ""), 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("empty-joined", string("\0foo\0\0", 6)), 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("joineD", string("value 1\0value 2", 15)), 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("joined", "not joined"), 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("passed-through", string("foo\0baz", 7)))); 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Decoding an encoded name with a valid string literal should work. 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HpackDecoderTest, DecodeNextNameLiteral) { 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HpackInputStream input_stream(kLiteralBound, StringPiece("\x00\x04name", 6)); 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringPiece string_piece; 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(decoder_peer_.DecodeNextName(&input_stream, &string_piece)); 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("name", string_piece); 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(input_stream.HasMoreData()); 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HpackDecoderTest, DecodeNextNameLiteralWithHuffmanEncoding) { 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch string input = a2b_hex("008825a849e95ba97d7f"); 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HpackInputStream input_stream(kLiteralBound, input); 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) StringPiece string_piece; 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(decoder_peer_.DecodeNextName(&input_stream, &string_piece)); 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ("custom-key", string_piece); 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(input_stream.HasMoreData()); 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Decoding an encoded name with a valid index should work. 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HpackDecoderTest, DecodeNextNameIndexed) { 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) HpackInputStream input_stream(kLiteralBound, "\x01"); 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringPiece string_piece; 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(decoder_peer_.DecodeNextName(&input_stream, &string_piece)); 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(":authority", string_piece); 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(input_stream.HasMoreData()); 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Decoding an encoded name with an invalid index should fail. 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HpackDecoderTest, DecodeNextNameInvalidIndex) { 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // One more than the number of static table entries. 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HpackInputStream input_stream(kLiteralBound, "\x3e"); 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringPiece string_piece; 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(decoder_peer_.DecodeNextName(&input_stream, &string_piece)); 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Decoding indexed static table field should work. 21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(HpackDecoderTest, IndexedHeaderStatic) { 21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Reference static table entries #2 and #5. 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<string, string> header_set1 = 21603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DecodeBlockExpectingSuccess("\x82\x85"); 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<string, string> expected_header_set1; 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_header_set1[":method"] = "GET"; 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_header_set1[":path"] = "/index.html"; 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_header_set1, header_set1); 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 22203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Reference static table entry #2. 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<string, string> header_set2 = 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DecodeBlockExpectingSuccess("\x82"); 22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::map<string, string> expected_header_set2; 22603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expected_header_set2[":method"] = "GET"; 22703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_header_set2, header_set2); 22803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 22903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 23003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(HpackDecoderTest, IndexedHeaderDynamic) { 23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // First header block: add an entry to header table. 23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::map<string, string> header_set1 = 23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DecodeBlockExpectingSuccess("\x40\x03" "foo" "\x03" "bar"); 23403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::map<string, string> expected_header_set1; 23503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expected_header_set1["foo"] = "bar"; 23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_header_set1, header_set1); 23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Second header block: add another entry to header table. 23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::map<string, string> header_set2 = 24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DecodeBlockExpectingSuccess("\xbe\x40\x04" "spam" "\x04" "eggs"); 24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::map<string, string> expected_header_set2; 24203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expected_header_set2["foo"] = "bar"; 24303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expected_header_set2["spam"] = "eggs"; 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_header_set2, header_set2); 24503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Third header block: refer to most recently added entry. 24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::map<string, string> header_set3 = 24803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DecodeBlockExpectingSuccess("\xbe"); 24903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) std::map<string, string> expected_header_set3; 25003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expected_header_set3["spam"] = "eggs"; 25103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(expected_header_set3, header_set3); 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test a too-large indexed header. 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HpackDecoderTest, InvalidIndexedHeader) { 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // High-bit set, and a prefix of one more than the number of static entries. 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(DecodeHeaderBlock(StringPiece("\xbe", 1))); 258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test that a header block with a pseudo-header field following a regular one 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// is treated as malformed. (HTTP2 draft-14 8.1.2.1., HPACK draft-09 3.1.) 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(HpackDecoderTest, InvalidPseudoHeaderPositionStatic) { 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Okay: ":path" (static entry 4) followed by "allow" (static entry 20). 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(DecodeHeaderBlock(a2b_hex("8494"))); 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Malformed: "allow" (static entry 20) followed by ":path" (static entry 4). 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(DecodeHeaderBlock(a2b_hex("9484"))); 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(HpackDecoderTest, InvalidPseudoHeaderPositionLiteral) { 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Okay: literal ":bar" followed by literal "foo". 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(DecodeHeaderBlock(a2b_hex("40043a626172004003666f6f00"))); 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Malformed: literal "foo" followed by literal ":bar". 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(DecodeHeaderBlock(a2b_hex("4003666f6f0040043a62617200"))); 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HpackDecoderTest, ContextUpdateMaximumSize) { 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(kDefaultHeaderTableSizeSetting, 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) decoder_peer_.header_table()->max_size()); 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) string input; 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) { 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Maximum-size update with size 126. Succeeds. 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HpackOutputStream output_stream; 28403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) output_stream.AppendPrefix(kHeaderTableSizeUpdateOpcode); 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) output_stream.AppendUint32(126); 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) output_stream.TakeString(&input); 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(DecodeHeaderBlock(StringPiece(input))); 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(126u, decoder_peer_.header_table()->max_size()); 290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) { 292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Maximum-size update with kDefaultHeaderTableSizeSetting. Succeeds. 2935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackOutputStream output_stream; 29403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) output_stream.AppendPrefix(kHeaderTableSizeUpdateOpcode); 2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu output_stream.AppendUint32(kDefaultHeaderTableSizeSetting); 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) output_stream.TakeString(&input); 298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(DecodeHeaderBlock(StringPiece(input))); 299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(kDefaultHeaderTableSizeSetting, 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) decoder_peer_.header_table()->max_size()); 301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) { 303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Maximum-size update with kDefaultHeaderTableSizeSetting + 1. Fails. 3045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackOutputStream output_stream; 30503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) output_stream.AppendPrefix(kHeaderTableSizeUpdateOpcode); 3065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu output_stream.AppendUint32(kDefaultHeaderTableSizeSetting + 1); 307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) output_stream.TakeString(&input); 309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_FALSE(DecodeHeaderBlock(StringPiece(input))); 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(kDefaultHeaderTableSizeSetting, 311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) decoder_peer_.header_table()->max_size()); 312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Decoding two valid encoded literal headers with no indexing should 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// work. 317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HpackDecoderTest, LiteralHeaderNoIndexing) { 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // First header with indexed name, second header with string literal 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // name. 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const char input[] = "\x04\x0c/sample/path\x00\x06:path2\x0e/sample/path/2"; 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<string, string> header_set = 322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DecodeBlockExpectingSuccess(StringPiece(input, arraysize(input) - 1)); 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<string, string> expected_header_set; 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_header_set[":path"] = "/sample/path"; 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_header_set[":path2"] = "/sample/path/2"; 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_header_set, header_set); 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Decoding two valid encoded literal headers with incremental 33103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// indexing and string literal names should work. 332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HpackDecoderTest, LiteralHeaderIncrementalIndexing) { 333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const char input[] = "\x44\x0c/sample/path\x40\x06:path2\x0e/sample/path/2"; 334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::map<string, string> header_set = 335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DecodeBlockExpectingSuccess(StringPiece(input, arraysize(input) - 1)); 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<string, string> expected_header_set; 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_header_set[":path"] = "/sample/path"; 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_header_set[":path2"] = "/sample/path/2"; 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(expected_header_set, header_set); 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(HpackDecoderTest, LiteralHeaderWithIndexingInvalidNameIndex) { 344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) decoder_.ApplyHeaderTableSizeSetting(0); 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Name is the last static index. Works. 347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(DecodeHeaderBlock(StringPiece("\x7d\x03ooo"))); 348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Name is one beyond the last static index. Fails. 349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(DecodeHeaderBlock(StringPiece("\x7e\x03ooo"))); 350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(HpackDecoderTest, LiteralHeaderNoIndexingInvalidNameIndex) { 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Name is the last static index. Works. 354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(DecodeHeaderBlock(StringPiece("\x0f\x2e\x03ooo"))); 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Name is one beyond the last static index. Fails. 356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(DecodeHeaderBlock(StringPiece("\x0f\x2f\x03ooo"))); 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(HpackDecoderTest, LiteralHeaderNeverIndexedInvalidNameIndex) { 360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Name is the last static index. Works. 361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(DecodeHeaderBlock(StringPiece("\x1f\x2e\x03ooo"))); 362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Name is one beyond the last static index. Fails. 363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(DecodeHeaderBlock(StringPiece("\x1f\x2f\x03ooo"))); 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Round-tripping the header set from E.2.1 should work. 367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(HpackDecoderTest, BasicE21) { 3685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackEncoder encoder(ObtainHpackHuffmanTable()); 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<string, string> expected_header_set; 3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_header_set[":method"] = "GET"; 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_header_set[":scheme"] = "http"; 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_header_set[":path"] = "/"; 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_header_set[":authority"] = "www.example.com"; 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string encoded_header_set; 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(encoder.EncodeHeaderSet( 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) expected_header_set, &encoded_header_set)); 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(DecodeHeaderBlock(encoded_header_set)); 381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(expected_header_set, decoded_block()); 382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 38403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(HpackDecoderTest, SectionD4RequestHuffmanExamples) { 385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::map<string, string> header_set; 386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 82 | == Indexed - Add == 388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | idx = 2 389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> :method: GET 390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 86 | == Indexed - Add == 391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | idx = 6 39203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | -> :scheme: http 39303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 84 | == Indexed - Add == 39403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 4 395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> :path: / 39603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 41 | == Literal indexed == 39703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | Indexed name (idx = 1) 398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | :authority 399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // 8c | Literal value (len = 15) 400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Huffman encoded: 401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // f1e3 c2e5 f23a 6ba0 ab90 f4ff | .....:k..... 402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Decoded: 403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | www.example.com 404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> :authority: www.example.com 40503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) string first = a2b_hex("828684418cf1e3c2e5f23a6ba0ab90f4" 406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "ff"); 407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) header_set = DecodeBlockExpectingSuccess(first); 408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_THAT(header_set, ElementsAre( 410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":authority", "www.example.com"), 411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":method", "GET"), 412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":path", "/"), 413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":scheme", "http"))); 414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 41503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(62, 57, ":authority", "www.example.com"); 41603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(57u, decoder_peer_.header_table()->size()); 417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 41803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 82 | == Indexed - Add == 41903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 2 42003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | -> :method: GET 42103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 86 | == Indexed - Add == 42203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 6 42303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | -> :scheme: http 42403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 84 | == Indexed - Add == 42503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 4 42603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | -> :path: / 42703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // be | == Indexed - Add == 42803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 62 42903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | -> :authority: www.example.com 43003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 58 | == Literal indexed == 43103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | Indexed name (idx = 24) 432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | cache-control 433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 86 | Literal value (len = 8) 434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Huffman encoded: 435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // a8eb 1064 9cbf | ...d.. 436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Decoded: 437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | no-cache 438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> cache-control: no-cache 43903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 44003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) string second = a2b_hex("828684be5886a8eb10649cbf"); 441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) header_set = DecodeBlockExpectingSuccess(second); 442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_THAT(header_set, ElementsAre( 444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":authority", "www.example.com"), 445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":method", "GET"), 446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":path", "/"), 447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":scheme", "http"), 448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("cache-control", "no-cache"))); 449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 45003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(62, 53, "cache-control", "no-cache"); 45103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(63, 57, ":authority", "www.example.com"); 45203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(110u, decoder_peer_.header_table()->size()); 45303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 45403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 82 | == Indexed - Add == 45503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 2 456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> :method: GET 45703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 87 | == Indexed - Add == 45803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 7 459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> :scheme: https 46003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 85 | == Indexed - Add == 46103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 5 462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> :path: /index.html 46303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // bf | == Indexed - Add == 46403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 63 465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> :authority: www.example.com 466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // 40 | == Literal indexed == 467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 88 | Literal name (len = 10) 468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Huffman encoded: 469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 25a8 49e9 5ba9 7d7f | %.I.[.}. 470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Decoded: 471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | custom-key 472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 89 | Literal value (len = 12) 473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Huffman encoded: 474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 25a8 49e9 5bb8 e8b4 bf | %.I.[.... 475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Decoded: 476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | custom-value 477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> custom-key: custom-value 47803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) string third = a2b_hex("828785bf408825a849e95ba97d7f89" 479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "25a849e95bb8e8b4bf"); 480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) header_set = DecodeBlockExpectingSuccess(third); 481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_THAT(header_set, ElementsAre( 483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":authority", "www.example.com"), 484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":method", "GET"), 485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":path", "/index.html"), 486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":scheme", "https"), 487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("custom-key", "custom-value"))); 488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 48903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(62, 54, "custom-key", "custom-value"); 49003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(63, 53, "cache-control", "no-cache"); 49103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(64, 57, ":authority", "www.example.com"); 49203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(164u, decoder_peer_.header_table()->size()); 493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 49503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(HpackDecoderTest, SectionD6ResponseHuffmanExamples) { 496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::map<string, string> header_set; 497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_.ApplyHeaderTableSizeSetting(256); 498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // 48 | == Literal indexed == 500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Indexed name (idx = 8) 501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | :status 502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 82 | Literal value (len = 3) 503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Huffman encoded: 504116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 6402 | d. 505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Decoded: 506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | 302 507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> :status: 302 50803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 58 | == Literal indexed == 50903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | Indexed name (idx = 24) 510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | cache-control 511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 85 | Literal value (len = 7) 512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Huffman encoded: 513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // aec3 771a 4b | ..w.K 514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Decoded: 515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | private 516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> cache-control: private 51703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 61 | == Literal indexed == 51803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | Indexed name (idx = 33) 519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | date 520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 96 | Literal value (len = 29) 521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Huffman encoded: 522116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // d07a be94 1054 d444 a820 0595 040b 8166 | .z...T.D. .....f 523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // e082 a62d 1bff | ...-.. 524a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Decoded: 525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Mon, 21 Oct 2013 20:13:21 526a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | GMT 527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> date: Mon, 21 Oct 2013 528a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | 20:13:21 GMT 52903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 6e | == Literal indexed == 53003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | Indexed name (idx = 46) 531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | location 532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // 91 | Literal value (len = 23) 533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Huffman encoded: 534116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 9d29 ad17 1863 c78f 0b97 c8e9 ae82 ae43 | .)...c.........C 535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // d3 | . 536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Decoded: 537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | https://www.example.com 538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> location: https://www.e 539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | xample.com 54003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 54103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) string first = a2b_hex("488264025885aec3771a4b6196d07abe" 542116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "941054d444a8200595040b8166e082a6" 54303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "2d1bff6e919d29ad171863c78f0b97c8" 544116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "e9ae82ae43d3"); 545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) header_set = DecodeBlockExpectingSuccess(first); 546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_THAT(header_set, ElementsAre( 548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":status", "302"), 549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("cache-control", "private"), 550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), 551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("location", "https://www.example.com"))); 552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 55303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(62, 63, "location", "https://www.example.com"); 55403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(63, 65, "date", "Mon, 21 Oct 2013 20:13:21 GMT"); 55503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(64, 52, "cache-control", "private"); 55603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(65, 42, ":status", "302"); 557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(222u, decoder_peer_.header_table()->size()); 558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 55903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 48 | == Literal indexed == 56003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | Indexed name (idx = 8) 56103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | :status 56203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 83 | Literal value (len = 3) 56303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | Huffman encoded: 56403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 640e ff | d.. 56503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | Decoded: 56603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | 307 567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | - evict: :status: 302 56803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | -> :status: 307 56903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // c1 | == Indexed - Add == 57003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 65 57103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | -> cache-control: private 57203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // c0 | == Indexed - Add == 57303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 64 57403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | -> date: Mon, 21 Oct 2013 57503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | 20:13:21 GMT 57603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // bf | == Indexed - Add == 57703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 63 57803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | -> location: 57903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | https://www.example.com 58003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) string second = a2b_hex("4883640effc1c0bf"); 581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) header_set = DecodeBlockExpectingSuccess(second); 582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_THAT(header_set, ElementsAre( 58403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Pair(":status", "307"), 585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("cache-control", "private"), 586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), 587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("location", "https://www.example.com"))); 588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 58903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(62, 42, ":status", "307"); 59003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(63, 63, "location", "https://www.example.com"); 59103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(64, 65, "date", "Mon, 21 Oct 2013 20:13:21 GMT"); 59203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(65, 52, "cache-control", "private"); 593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(222u, decoder_peer_.header_table()->size()); 594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 59503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 88 | == Indexed - Add == 59603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 8 59703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | -> :status: 200 59803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // c1 | == Indexed - Add == 59903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 65 600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> cache-control: private 60103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 61 | == Literal indexed == 60203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | Indexed name (idx = 33) 603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | date 60403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 96 | Literal value (len = 22) 605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Huffman encoded: 606116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // d07a be94 1054 d444 a820 0595 040b 8166 | .z...T.D. .....f 607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // e084 a62d 1bff | ...-.. 608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Decoded: 609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Mon, 21 Oct 2013 20:13:22 610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | GMT 61103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | - evict: cache-control: 61203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | private 613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> date: Mon, 21 Oct 2013 614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | 20:13:22 GMT 61503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // c0 | == Indexed - Add == 61603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | idx = 64 61703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | -> location: 61803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | https://www.example.com 61903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 5a | == Literal indexed == 62003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | Indexed name (idx = 26) 621a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | content-encoding 62203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 83 | Literal value (len = 3) 623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Huffman encoded: 624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 9bd9 ab | ... 625a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Decoded: 626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | gzip 627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | - evict: date: Mon, 21 Oct 628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | 2013 20:13:21 GMT 629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> content-encoding: gzip 63003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // 77 | == Literal indexed == 63103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | Indexed name (idx = 55) 632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | set-cookie 63303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // ad | Literal value (len = 45) 634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Huffman encoded: 635116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 | .........5...[9` 636116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 | ..'..6r..'..)... 637116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 3160 65c0 03ed 4ee5 b106 3d50 07 | 1`e...N...=P. 638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | Decoded: 639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | foo=ASDJKHQKBZXOQWEOPIUAXQ 640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | WEOIU; max-age=3600; versi 641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | on=1 64203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | - evict: location: 64303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | https://www.example.com 64403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | - evict: :status: 307 645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // | -> set-cookie: foo=ASDJKHQ 64603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | KBZXOQWEOPIUAXQWEOIU; 64703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // | max-age=3600; version=1 64803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) string third = a2b_hex("88c16196d07abe941054d444a8200595" 64903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "040b8166e084a62d1bffc05a839bd9ab" 65003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "77ad94e7821dd7f2e6c7b335dfdfcd5b" 65103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "3960d5af27087f3672c1ab270fb5291f" 65203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) "9587316065c003ed4ee5b1063d5007"); 653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) header_set = DecodeBlockExpectingSuccess(third); 654a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 655a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_THAT(header_set, ElementsAre( 656a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair(":status", "200"), 657a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("cache-control", "private"), 658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("content-encoding", "gzip"), 659a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), 660a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("location", "https://www.example.com"), 661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU;" 662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) " max-age=3600; version=1"))); 663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 66403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(62, 98, "set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU;" 665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " max-age=3600; version=1"); 66603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(63, 52, "content-encoding", "gzip"); 66703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) expectEntry(64, 65, "date", "Mon, 21 Oct 2013 20:13:22 GMT"); 668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(215u, decoder_peer_.header_table()->size()); 6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace net 674