• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef QUICHE_SPDY_CORE_HTTP2_HEADER_BLOCK_HPACK_LISTENER_H_
2 #define QUICHE_SPDY_CORE_HTTP2_HEADER_BLOCK_HPACK_LISTENER_H_
3 
4 #include "absl/strings/string_view.h"
5 #include "quiche/http2/hpack/decoder/hpack_decoder_listener.h"
6 #include "quiche/common/platform/api/quiche_export.h"
7 #include "quiche/common/platform/api/quiche_logging.h"
8 #include "quiche/spdy/core/http2_header_block.h"
9 
10 namespace spdy {
11 
12 // This class simply gathers the key-value pairs emitted by an HpackDecoder in
13 // a Http2HeaderBlock.
14 class QUICHE_EXPORT Http2HeaderBlockHpackListener
15     : public http2::HpackDecoderListener {
16  public:
Http2HeaderBlockHpackListener()17   Http2HeaderBlockHpackListener() {}
18 
OnHeaderListStart()19   void OnHeaderListStart() override {
20     header_block_.clear();
21     hpack_error_ = false;
22   }
23 
OnHeader(const std::string & name,const std::string & value)24   void OnHeader(const std::string& name, const std::string& value) override {
25     header_block_.AppendValueOrAddHeader(name, value);
26   }
27 
OnHeaderListEnd()28   void OnHeaderListEnd() override {}
29 
OnHeaderErrorDetected(absl::string_view error_message)30   void OnHeaderErrorDetected(absl::string_view error_message) override {
31     QUICHE_VLOG(1) << error_message;
32     hpack_error_ = true;
33   }
34 
release_header_block()35   Http2HeaderBlock release_header_block() {
36     Http2HeaderBlock block = std::move(header_block_);
37     header_block_ = {};
38     return block;
39   }
hpack_error()40   bool hpack_error() const { return hpack_error_; }
41 
42  private:
43   Http2HeaderBlock header_block_;
44   bool hpack_error_ = false;
45 };
46 
47 }  // namespace spdy
48 
49 #endif  // QUICHE_SPDY_CORE_HTTP2_HEADER_BLOCK_HPACK_LISTENER_H_
50