Refactor out http2::InvalidHeaderSet to share with QUIC. No behavior change.

PiperOrigin-RevId: 404078600
diff --git a/common/quiche_text_utils.h b/common/quiche_text_utils.h
index c99d9e2..ccfcdab 100644
--- a/common/quiche_text_utils.h
+++ b/common/quiche_text_utils.h
@@ -7,16 +7,32 @@
 
 #include <string>
 
+#include "absl/hash/hash.h"
 #include "absl/strings/ascii.h"
 #include "absl/strings/escaping.h"
+#include "absl/strings/match.h"
 #include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
 #include "common/platform/api/quiche_export.h"
 
 namespace quiche {
 
+QUICHE_EXPORT_PRIVATE struct StringPieceCaseHash {
+  size_t operator()(absl::string_view data) const {
+    std::string lower = absl::AsciiStrToLower(data);
+    absl::Hash<absl::string_view> hasher;
+    return hasher(lower);
+  }
+};
+
+QUICHE_EXPORT_PRIVATE struct StringPieceCaseEqual {
+  bool operator()(absl::string_view piece1, absl::string_view piece2) const {
+    return absl::EqualsIgnoreCase(piece1, piece2);
+  }
+};
+
 // Various utilities for manipulating text.
-class QUICHE_EXPORT QuicheTextUtils {
+class QUICHE_EXPORT_PRIVATE QuicheTextUtils {
  public:
   // Returns a new string in which |data| has been converted to lower case.
   static std::string ToLower(absl::string_view data) {
diff --git a/http2/http2_constants.cc b/http2/http2_constants.cc
index 43d89bc..7ffdb04 100644
--- a/http2/http2_constants.cc
+++ b/http2/http2_constants.cc
@@ -150,4 +150,18 @@
   return Http2SettingsParameterToString(static_cast<uint32_t>(v));
 }
 
+// Invalid HTTP/2 header names according to
+// https://datatracker.ietf.org/doc/html/rfc7540#section-8.1.2.2.
+// TODO(birenroy): Consider adding "upgrade" to this set.
+constexpr char const* kHttp2InvalidHeaderNames[] = {
+    "connection", "host", "keep-alive", "proxy-connection", "transfer-encoding",
+};
+
+const InvalidHeaderSet& GetInvalidHttp2HeaderSet() {
+  static const auto* invalid_header_set =
+      new InvalidHeaderSet(std::begin(http2::kHttp2InvalidHeaderNames),
+                           std::end(http2::kHttp2InvalidHeaderNames));
+  return *invalid_header_set;
+}
+
 }  // namespace http2
diff --git a/http2/http2_constants.h b/http2/http2_constants.h
index 65e55db..8d8f442 100644
--- a/http2/http2_constants.h
+++ b/http2/http2_constants.h
@@ -14,6 +14,7 @@
 
 #include "http2/platform/api/http2_flags.h"
 #include "common/platform/api/quiche_export.h"
+#include "common/quiche_text_utils.h"
 
 namespace http2 {
 
@@ -234,7 +235,7 @@
 
 // Information about the initial, minimum and maximum value of settings (not
 // applicable to all settings parameters).
-class Http2SettingsInfo {
+QUICHE_EXPORT_PRIVATE class Http2SettingsInfo {
  public:
   // Default value for HEADER_TABLE_SIZE.
   static constexpr uint32_t DefaultHeaderTableSize() { return 4096; }
@@ -259,6 +260,15 @@
   static constexpr uint32_t MaximumMaxFrameSize() { return (1 << 24) - 1; }
 };
 
+// Http3 early fails upper case request headers, but Http2 still needs case
+// insensitive comparison.
+using InvalidHeaderSet =
+    absl::flat_hash_set<absl::string_view, quiche::StringPieceCaseHash,
+                        quiche::StringPieceCaseEqual>;
+
+// Returns all disallowed HTTP/2 headers.
+QUICHE_EXPORT_PRIVATE const InvalidHeaderSet& GetInvalidHttp2HeaderSet();
+
 }  // namespace http2
 
 #endif  // QUICHE_HTTP2_HTTP2_CONSTANTS_H_
diff --git a/spdy/core/spdy_header_block.h b/spdy/core/spdy_header_block.h
index c3c5bad..d409427 100644
--- a/spdy/core/spdy_header_block.h
+++ b/spdy/core/spdy_header_block.h
@@ -14,13 +14,10 @@
 #include <vector>
 
 #include "absl/base/attributes.h"
-#include "absl/hash/hash.h"
-#include "absl/strings/ascii.h"
-#include "absl/strings/match.h"
-#include "absl/strings/string_view.h"
 #include "common/platform/api/quiche_export.h"
 #include "common/platform/api/quiche_logging.h"
 #include "common/quiche_linked_hash_map.h"
+#include "common/quiche_text_utils.h"
 #include "spdy/core/spdy_header_storage.h"
 
 namespace spdy {
@@ -94,24 +91,9 @@
     size_t separator_size_ = 0;
   };
 
-  struct StringPieceCaseHash {
-    size_t operator()(absl::string_view data) const {
-      std::string lower = absl::AsciiStrToLower(data);
-      absl::Hash<absl::string_view> hasher;
-      return hasher(lower);
-    }
-  };
-
-  struct StringPieceCaseEqual {
-    bool operator()(absl::string_view piece1, absl::string_view piece2) const {
-      return absl::EqualsIgnoreCase(piece1, piece2);
-    }
-  };
-
-  typedef quiche::QuicheLinkedHashMap<absl::string_view,
-                                      HeaderValue,
-                                      StringPieceCaseHash,
-                                      StringPieceCaseEqual>
+  typedef quiche::QuicheLinkedHashMap<absl::string_view, HeaderValue,
+                                      quiche::StringPieceCaseHash,
+                                      quiche::StringPieceCaseEqual>
       MapType;
 
  public: