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: