Removes ListenerAdapter::decoded_block_ and all accessors.

Also updates ListenerAdapter to verify that the passed-in headers handler is non-nullptr.

Protected by refactoring, no functional change.

PiperOrigin-RevId: 596013967
diff --git a/quiche/spdy/core/hpack/hpack_decoder_adapter.cc b/quiche/spdy/core/hpack/hpack_decoder_adapter.cc
index 31b606f..0a9b5a4 100644
--- a/quiche/spdy/core/hpack/hpack_decoder_adapter.cc
+++ b/quiche/spdy/core/hpack/hpack_decoder_adapter.cc
@@ -104,10 +104,6 @@
   return true;
 }
 
-const Http2HeaderBlock& HpackDecoderAdapter::decoded_block() const {
-  return listener_adapter_.decoded_block();
-}
-
 void HpackDecoderAdapter::set_max_decode_buffer_size_bytes(
     size_t max_decode_buffer_size_bytes) {
   QUICHE_DVLOG(2) << "HpackDecoderAdapter::set_max_decode_buffer_size_bytes";
@@ -120,11 +116,13 @@
   max_header_block_bytes_ = max_header_block_bytes;
 }
 
-HpackDecoderAdapter::ListenerAdapter::ListenerAdapter() : handler_(nullptr) {}
+HpackDecoderAdapter::ListenerAdapter::ListenerAdapter()
+    : no_op_handler_(nullptr), handler_(&no_op_handler_) {}
 HpackDecoderAdapter::ListenerAdapter::~ListenerAdapter() = default;
 
 void HpackDecoderAdapter::ListenerAdapter::set_handler(
     SpdyHeadersHandlerInterface* handler) {
+  QUICHE_CHECK_NE(handler, nullptr);
   handler_ = handler;
 }
 
@@ -132,10 +130,7 @@
   QUICHE_DVLOG(2) << "HpackDecoderAdapter::ListenerAdapter::OnHeaderListStart";
   total_hpack_bytes_ = 0;
   total_uncompressed_bytes_ = 0;
-  decoded_block_.clear();
-  if (handler_ != nullptr) {
-    handler_->OnHeaderBlockStart();
-  }
+  handler_->OnHeaderBlockStart();
 }
 
 void HpackDecoderAdapter::ListenerAdapter::OnHeader(const std::string& name,
@@ -143,23 +138,13 @@
   QUICHE_DVLOG(2) << "HpackDecoderAdapter::ListenerAdapter::OnHeader:\n name: "
                   << name << "\n value: " << value;
   total_uncompressed_bytes_ += name.size() + value.size();
-  if (handler_ == nullptr) {
-    QUICHE_DVLOG(3) << "Adding to decoded_block";
-    decoded_block_.AppendValueOrAddHeader(name, value);
-  } else {
-    QUICHE_DVLOG(3) << "Passing to handler";
-    handler_->OnHeader(name, value);
-  }
+  handler_->OnHeader(name, value);
 }
 
 void HpackDecoderAdapter::ListenerAdapter::OnHeaderListEnd() {
   QUICHE_DVLOG(2) << "HpackDecoderAdapter::ListenerAdapter::OnHeaderListEnd";
-  // We don't clear the Http2HeaderBlock here to allow access to it until the
-  // next HPACK block is decoded.
-  if (handler_ != nullptr) {
-    handler_->OnHeaderBlockEnd(total_uncompressed_bytes_, total_hpack_bytes_);
-    handler_ = nullptr;
-  }
+  handler_->OnHeaderBlockEnd(total_uncompressed_bytes_, total_hpack_bytes_);
+  handler_ = &no_op_handler_;
 }
 
 void HpackDecoderAdapter::ListenerAdapter::OnHeaderErrorDetected(
diff --git a/quiche/spdy/core/hpack/hpack_decoder_adapter.h b/quiche/spdy/core/hpack/hpack_decoder_adapter.h
index ed11568..ce0f251 100644
--- a/quiche/spdy/core/hpack/hpack_decoder_adapter.h
+++ b/quiche/spdy/core/hpack/hpack_decoder_adapter.h
@@ -18,6 +18,7 @@
 #include "quiche/http2/hpack/decoder/hpack_decoding_error.h"
 #include "quiche/common/platform/api/quiche_export.h"
 #include "quiche/spdy/core/http2_header_block.h"
+#include "quiche/spdy/core/no_op_headers_handler.h"
 #include "quiche/spdy/core/spdy_headers_handler_interface.h"
 
 namespace spdy {
@@ -39,10 +40,10 @@
   // Returns the most recently applied value of SETTINGS_HEADER_TABLE_SIZE.
   size_t GetCurrentHeaderTableSizeSetting() const;
 
-  // If a SpdyHeadersHandlerInterface is provided, the decoder will emit
-  // headers to it rather than accumulating them in a Http2HeaderBlock.
+  // The decoder will emit headers to the provided SpdyHeadersHandlerInterface.
   // Does not take ownership of the handler, but does use the pointer until
   // the current HPACK block is completely decoded.
+  // `handler` must not be nullptr.
   void HandleControlFrameHeadersStart(SpdyHeadersHandlerInterface* handler);
 
   // Called as HPACK block fragments arrive. Returns false if an error occurred
@@ -58,12 +59,6 @@
   // Discards the handler supplied at the start of decoding the block.
   bool HandleControlFrameHeadersComplete();
 
-  // Accessor for the most recently decoded headers block. Valid until the next
-  // call to HandleControlFrameHeadersData().
-  // TODO(birenroy): Remove this method when all users of HpackDecoder specify
-  // a SpdyHeadersHandlerInterface.
-  const Http2HeaderBlock& decoded_block() const;
-
   // Returns the current dynamic table size, including the 32 bytes per entry
   // overhead mentioned in RFC 7541 section 4.1.
   size_t GetDynamicTableSize() const {
@@ -93,14 +88,13 @@
     ListenerAdapter();
     ~ListenerAdapter() override;
 
-    // If a SpdyHeadersHandlerInterface is provided, the decoder will emit
-    // headers to it rather than accumulating them in a Http2HeaderBlock.
+    // Sets the SpdyHeadersHandlerInterface to which headers are emitted.
     // Does not take ownership of the handler, but does use the pointer until
     // the current HPACK block is completely decoded.
+    // `handler` must not be nullptr.
     void set_handler(SpdyHeadersHandlerInterface* handler);
-    const Http2HeaderBlock& decoded_block() const { return decoded_block_; }
 
-    // Override the HpackDecoderListener methods:
+    // From HpackDecoderListener
     void OnHeaderListStart() override;
     void OnHeader(const std::string& name, const std::string& value) override;
     void OnHeaderListEnd() override;
@@ -110,11 +104,9 @@
     size_t total_hpack_bytes() const { return total_hpack_bytes_; }
 
    private:
-    // If the caller doesn't provide a handler, the header list is stored in
-    // this Http2HeaderBlock.
-    Http2HeaderBlock decoded_block_;
+    NoOpHeadersHandler no_op_handler_;
 
-    // If non-NULL, handles decoded headers. Not owned.
+    // Handles decoded headers.
     SpdyHeadersHandlerInterface* handler_;
 
     // Total bytes that have been received as input (i.e. HPACK encoded)