| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2017 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_SPDY_HPACK_HPACK_DECODER3_H_ |
| 6 #define NET_SPDY_HPACK_HPACK_DECODER3_H_ |
| 7 |
| 8 // HpackDecoder3 implements HpackDecoderInterface, using Http2HpackDecoder to |
| 9 // decode HPACK blocks into HTTP/2 header lists as outlined in |
| 10 // http://tools.ietf.org/html/rfc7541. |
| 11 |
| 12 #include <stddef.h> |
| 13 |
| 14 #include <memory> |
| 15 |
| 16 #include "base/macros.h" |
| 17 #include "base/strings/string_piece.h" |
| 18 #include "net/base/net_export.h" |
| 19 #include "net/http2/hpack/decoder/hpack_decoder_listener.h" |
| 20 #include "net/http2/hpack/decoder/http2_hpack_decoder.h" |
| 21 #include "net/http2/hpack/hpack_string.h" |
| 22 #include "net/http2/hpack/http2_hpack_constants.h" |
| 23 #include "net/spdy/hpack/hpack_decoder_interface.h" |
| 24 #include "net/spdy/hpack/hpack_header_table.h" |
| 25 #include "net/spdy/spdy_header_block.h" |
| 26 #include "net/spdy/spdy_headers_handler_interface.h" |
| 27 |
| 28 namespace net { |
| 29 namespace test { |
| 30 class HpackDecoder3Peer; |
| 31 } // namespace test |
| 32 |
| 33 class NET_EXPORT_PRIVATE HpackDecoder3 : public HpackDecoderInterface { |
| 34 public: |
| 35 friend test::HpackDecoder3Peer; |
| 36 HpackDecoder3(); |
| 37 ~HpackDecoder3() override; |
| 38 |
| 39 // Override the HpackDecoderInterface methods: |
| 40 |
| 41 void ApplyHeaderTableSizeSetting(size_t size_setting) override; |
| 42 void HandleControlFrameHeadersStart( |
| 43 SpdyHeadersHandlerInterface* handler) override; |
| 44 bool HandleControlFrameHeadersData(const char* headers_data, |
| 45 size_t headers_data_length) override; |
| 46 bool HandleControlFrameHeadersComplete(size_t* compressed_len) override; |
| 47 const SpdyHeaderBlock& decoded_block() const override; |
| 48 void SetHeaderTableDebugVisitor( |
| 49 std::unique_ptr<HpackHeaderTable::DebugVisitorInterface> visitor) |
| 50 override; |
| 51 void set_max_decode_buffer_size_bytes( |
| 52 size_t max_decode_buffer_size_bytes) override; |
| 53 |
| 54 private: |
| 55 class NET_EXPORT_PRIVATE ListenerAdapter : public HpackDecoderListener { |
| 56 public: |
| 57 ListenerAdapter(); |
| 58 ~ListenerAdapter() override; |
| 59 |
| 60 // If a SpdyHeadersHandlerInterface is provided, the decoder will emit |
| 61 // headers to it rather than accumulating them in a SpdyHeaderBlock. |
| 62 // Does not take ownership of the handler, but does use the pointer until |
| 63 // the current HPACK block is completely decoded. |
| 64 void set_handler(SpdyHeadersHandlerInterface* handler); |
| 65 const SpdyHeaderBlock& decoded_block() const { return decoded_block_; } |
| 66 |
| 67 // Override the HpackDecoderListener methods: |
| 68 |
| 69 void OnHeaderListStart() override; |
| 70 void OnHeader(HpackEntryType entry_type, |
| 71 const HpackString& name, |
| 72 const HpackString& value) override; |
| 73 void OnHeaderListEnd() override; |
| 74 void OnHeaderErrorDetected(base::StringPiece error_message) override; |
| 75 |
| 76 private: |
| 77 // If the caller doesn't provide a handler, the header list is stored in |
| 78 // this SpdyHeaderBlock. |
| 79 SpdyHeaderBlock decoded_block_; |
| 80 |
| 81 // If non-NULL, handles decoded headers. Not owned. |
| 82 SpdyHeadersHandlerInterface* handler_; |
| 83 |
| 84 // Total bytes of the name and value strings in the current HPACK block. |
| 85 size_t total_uncompressed_bytes_; |
| 86 }; |
| 87 |
| 88 // Converts calls to HpackDecoderListener into calls to |
| 89 // SpdyHeadersHandlerInterface. |
| 90 ListenerAdapter listener_adapter_; |
| 91 |
| 92 // The actual decoder. |
| 93 Http2HpackDecoder hpack_decoder_; |
| 94 |
| 95 // Total bytes that have been received as input (i.e. HPACK encoded) |
| 96 // in the current HPACK block. |
| 97 size_t total_hpack_bytes_; |
| 98 |
| 99 // How much encoded data this decoder is willing to buffer. |
| 100 size_t max_decode_buffer_size_bytes_; |
| 101 |
| 102 // Flag to keep track of having seen the header block start. Needed at the |
| 103 // moment because HandleControlFrameHeadersStart won't be called if a handler |
| 104 // is not being provided by the caller. |
| 105 bool header_block_started_; |
| 106 |
| 107 DISALLOW_COPY_AND_ASSIGN(HpackDecoder3); |
| 108 }; |
| 109 |
| 110 } // namespace net |
| 111 |
| 112 #endif // NET_SPDY_HPACK_HPACK_DECODER3_H_ |
| OLD | NEW |