| OLD | NEW |
| (Empty) |
| 1 // Copyright 2016 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 #ifndef NET_HTTP2_HPACK_TOOLS_HPACK_BLOCK_BUILDER_H_ | |
| 6 #define NET_HTTP2_HPACK_TOOLS_HPACK_BLOCK_BUILDER_H_ | |
| 7 | |
| 8 // HpackBlockBuilder builds wire-format HPACK blocks (or fragments thereof) | |
| 9 // from components. | |
| 10 | |
| 11 // Supports very large varints to enable tests to create HPACK blocks with | |
| 12 // values that the decoder should reject. For now, this is only intended for | |
| 13 // use in tests, and thus has EXPECT* in the code. If desired to use it in an | |
| 14 // encoder, it will need optimization work, especially w.r.t memory mgmt, and | |
| 15 // the EXPECT* will need to be removed or replaced with DCHECKs. And of course | |
| 16 // the support for very large varints will not be needed in production code. | |
| 17 | |
| 18 #include <stddef.h> | |
| 19 #include <string> | |
| 20 | |
| 21 #include "base/strings/string_piece.h" | |
| 22 #include "net/http2/hpack/http2_hpack_constants.h" | |
| 23 #include "testing/gtest/include/gtest/gtest.h" | |
| 24 | |
| 25 namespace net { | |
| 26 namespace test { | |
| 27 | |
| 28 class HpackBlockBuilder { | |
| 29 public: | |
| 30 explicit HpackBlockBuilder(base::StringPiece initial_contents) { | |
| 31 initial_contents.AppendToString(&buffer_); | |
| 32 } | |
| 33 HpackBlockBuilder() {} | |
| 34 ~HpackBlockBuilder() {} | |
| 35 | |
| 36 size_t size() const { return buffer_.size(); } | |
| 37 const std::string& buffer() const { return buffer_; } | |
| 38 | |
| 39 //---------------------------------------------------------------------------- | |
| 40 // Methods for appending a valid HPACK entry. | |
| 41 | |
| 42 void AppendIndexedHeader(uint64_t index) { | |
| 43 AppendEntryTypeAndVarint(HpackEntryType::kIndexedHeader, index); | |
| 44 } | |
| 45 | |
| 46 void AppendDynamicTableSizeUpdate(uint64_t size) { | |
| 47 AppendEntryTypeAndVarint(HpackEntryType::kDynamicTableSizeUpdate, size); | |
| 48 } | |
| 49 | |
| 50 void AppendNameIndexAndLiteralValue(HpackEntryType entry_type, | |
| 51 uint64_t name_index, | |
| 52 bool value_is_huffman_encoded, | |
| 53 base::StringPiece value) { | |
| 54 // name_index==0 would indicate that the entry includes a literal name. | |
| 55 // Call AppendLiteralNameAndValue in that case. | |
| 56 EXPECT_NE(0u, name_index); | |
| 57 AppendEntryTypeAndVarint(entry_type, name_index); | |
| 58 AppendString(value_is_huffman_encoded, value); | |
| 59 } | |
| 60 | |
| 61 void AppendLiteralNameAndValue(HpackEntryType entry_type, | |
| 62 bool name_is_huffman_encoded, | |
| 63 base::StringPiece name, | |
| 64 bool value_is_huffman_encoded, | |
| 65 base::StringPiece value) { | |
| 66 AppendEntryTypeAndVarint(entry_type, 0); | |
| 67 AppendString(name_is_huffman_encoded, name); | |
| 68 AppendString(value_is_huffman_encoded, value); | |
| 69 } | |
| 70 | |
| 71 //---------------------------------------------------------------------------- | |
| 72 // Primitive methods that are not guaranteed to write a valid HPACK entry. | |
| 73 | |
| 74 // Appends a varint, with the specified high_bits above the prefix of the | |
| 75 // varint. | |
| 76 void AppendHighBitsAndVarint(uint8_t high_bits, | |
| 77 uint8_t prefix_length, | |
| 78 uint64_t varint); | |
| 79 | |
| 80 // Append the start of an HPACK entry for the specified type, with the | |
| 81 // specified varint. | |
| 82 void AppendEntryTypeAndVarint(HpackEntryType entry_type, uint64_t varint); | |
| 83 | |
| 84 // Append a header string (i.e. a header name or value) in HPACK format. | |
| 85 // Does NOT perform Huffman encoding. | |
| 86 void AppendString(bool is_huffman_encoded, base::StringPiece str); | |
| 87 | |
| 88 private: | |
| 89 std::string buffer_; | |
| 90 }; | |
| 91 | |
| 92 } // namespace test | |
| 93 } // namespace net | |
| 94 | |
| 95 #endif // NET_HTTP2_HPACK_TOOLS_HPACK_BLOCK_BUILDER_H_ | |
| OLD | NEW |