Extract NoOpHeadersHandler and HeaderByteListenerInterface into separate header files.

This CL extracts NoOpHeadersHandler and HeaderByteListenerInterface from
gfe/gfe2/http2/http2_headers_handler.h to //third_party/spdy, which will enable
reuse of NoOpHeadersHandler in //third_party/http2 (specifically
OgHttp2Session, to ignore header events on closed streams).

PiperOrigin-RevId: 410127287
diff --git a/spdy/core/header_byte_listener_interface.h b/spdy/core/header_byte_listener_interface.h
new file mode 100644
index 0000000..e2ae4f9
--- /dev/null
+++ b/spdy/core/header_byte_listener_interface.h
@@ -0,0 +1,22 @@
+#ifndef QUICHE_SPDY_CORE_HEADER_BYTE_LISTENER_INTERFACE_H_
+#define QUICHE_SPDY_CORE_HEADER_BYTE_LISTENER_INTERFACE_H_
+
+#include <stddef.h>
+
+#include "common/platform/api/quiche_export.h"
+
+namespace spdy {
+
+// Listens for the receipt of uncompressed header bytes.
+class QUICHE_EXPORT_PRIVATE HeaderByteListenerInterface {
+ public:
+  virtual ~HeaderByteListenerInterface() {}
+
+  // Called when a header block has been parsed, with the number of uncompressed
+  // header bytes parsed from the header block.
+  virtual void OnHeaderBytesReceived(size_t uncompressed_header_bytes) = 0;
+};
+
+}  // namespace spdy
+
+#endif  // QUICHE_SPDY_CORE_HEADER_BYTE_LISTENER_INTERFACE_H_
diff --git a/spdy/core/no_op_headers_handler.h b/spdy/core/no_op_headers_handler.h
new file mode 100644
index 0000000..8c99459
--- /dev/null
+++ b/spdy/core/no_op_headers_handler.h
@@ -0,0 +1,39 @@
+#ifndef QUICHE_SPDY_CORE_NO_OP_HEADERS_HANDLER_H_
+#define QUICHE_SPDY_CORE_NO_OP_HEADERS_HANDLER_H_
+
+#include "common/platform/api/quiche_export.h"
+#include "spdy/core/header_byte_listener_interface.h"
+#include "spdy/core/spdy_headers_handler_interface.h"
+
+namespace spdy {
+
+// Drops all header data, but passes information about header bytes parsed to
+// a listener.
+class QUICHE_EXPORT_PRIVATE NoOpHeadersHandler
+    : public SpdyHeadersHandlerInterface {
+ public:
+  // Does not take ownership of listener.
+  explicit NoOpHeadersHandler(HeaderByteListenerInterface* listener)
+      : listener_(listener) {}
+  NoOpHeadersHandler(const NoOpHeadersHandler&) = delete;
+  NoOpHeadersHandler& operator=(const NoOpHeadersHandler&) = delete;
+  ~NoOpHeadersHandler() override {}
+
+  // From SpdyHeadersHandlerInterface
+  void OnHeaderBlockStart() override {}
+  void OnHeader(absl::string_view /*key*/,
+                absl::string_view /*value*/) override {}
+  void OnHeaderBlockEnd(size_t uncompressed_header_bytes,
+                        size_t /* compressed_header_bytes */) override {
+    if (listener_ != nullptr) {
+      listener_->OnHeaderBytesReceived(uncompressed_header_bytes);
+    }
+  }
+
+ private:
+  HeaderByteListenerInterface* listener_;
+};
+
+}  // namespace spdy
+
+#endif  // QUICHE_SPDY_CORE_NO_OP_HEADERS_HANDLER_H_