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