@@ -74,22 +74,11 @@ static constexpr size_t MAX_COMMON_HEADER_ID =
7474// and must be kept in sync with the ordinal values defined in http-over-capnp.capnp). Since
7575// it is extremely unlikely that those will change often, we hardcode them here for runtime
7676// efficiency.
77- #define V (Name ) Name,
78- static constexpr const char * COMMON_HEADER_NAMES[] = {nullptr , // 0: invalid
77+ #define V (Name ) Name##_kj ,
78+ static constexpr kj::StringPtr COMMON_HEADER_NAMES[] = {nullptr , // 0: invalid
7979 COMMON_HEADERS (V)};
8080#undef V
8181
82- constexpr size_t constexprStrlen (const char * str) {
83- return *str ? 1 + constexprStrlen (str + 1 ) : 0 ;
84- }
85-
86- // Helper to avoid recalculating lengths of common headers at runtime repeatedly
87- static constexpr size_t COMMON_HEADER_NAME_LENGTHS[] = {0 , // 0: invalid (nullptr)
88- #define V (n ) constexprStrlen(n),
89- COMMON_HEADERS (V)
90- #undef V
91- };
92-
9382inline constexpr kj::StringPtr getCommonHeaderName (uint id) {
9483 KJ_ASSERT (id > 0 && id <= MAX_COMMON_HEADER_ID, " Invalid common header ID" );
9584 kj::StringPtr name = COMMON_HEADER_NAMES[id];
@@ -107,8 +96,8 @@ constexpr kj::Maybe<uint> getCommonHeaderId(kj::StringPtr name) {
10796 for (uint i = 1 ; i <= MAX_COMMON_HEADER_ID; ++i) {
10897 KJ_DASSERT (COMMON_HEADER_NAMES[i] != nullptr );
10998 // If the lengths don't match or the first character doesn't match, skip full comparison
110- if (len != COMMON_HEADER_NAME_LENGTHS [i]) continue ;
111- if (strncasecmp (name.begin (), COMMON_HEADER_NAMES[i], len) == 0 ) {
99+ if (len != COMMON_HEADER_NAMES [i]. size () ) continue ;
100+ if (strncasecmp (name.begin (), COMMON_HEADER_NAMES[i]. begin () , len) == 0 ) {
112101 return i;
113102 }
114103 }
@@ -240,40 +229,22 @@ inline void requireValidHeaderValue(kj::StringPtr value) {
240229}
241230} // namespace
242231
243- Headers::UncommonHeaderKey::UncommonHeaderKey (kj::String name)
244- : name(kj::mv(name)),
245- hash (kj::hashCode(this ->name)) {}
246-
247- Headers::UncommonHeaderKey::UncommonHeaderKey (kj::StringPtr name)
248- : name(kj::str(name)),
249- hash(kj::hashCode(this ->name)) {}
250-
251- bool Headers::UncommonHeaderKey::operator ==(const UncommonHeaderKey& other) const {
252- // The same hash code is a necessary but not sufficient condition for equality.
253- return hash == other.hash && name == other.name ;
254- }
255-
256- bool Headers::UncommonHeaderKey::operator ==(kj::StringPtr otherName) const {
257- if (name.size () != otherName.size ()) return false ;
258- return strncasecmp (name.begin (), otherName.begin (), name.size ()) == 0 ;
259- }
260-
261232Headers::HeaderKey Headers::getHeaderKeyFor (kj::StringPtr name) {
262233 KJ_IF_SOME (commonId, getCommonHeaderId (name)) {
263234 return commonId;
264235 }
265236
266237 // Not a common header, so allocate lowercase copy for uncommon header
267- return UncommonHeaderKey ( toLower (name) );
238+ return toLower (name);
268239}
269240
270241Headers::HeaderKey Headers::cloneHeaderKey (const HeaderKey& key) {
271242 KJ_SWITCH_ONEOF (key) {
272243 KJ_CASE_ONEOF (commonId, uint) {
273244 return commonId;
274245 }
275- KJ_CASE_ONEOF (uncommonKey, UncommonHeaderKey ) {
276- return uncommonKey. clone ( );
246+ KJ_CASE_ONEOF (uncommonKey, kj::String ) {
247+ return kj::str (uncommonKey );
277248 }
278249 }
279250 KJ_UNREACHABLE;
@@ -284,7 +255,7 @@ bool Headers::isSetCookie(const HeaderKey& key) {
284255 KJ_CASE_ONEOF (commonId, uint) {
285256 return commonId == static_cast <uint>(capnp::CommonHeaderName::SET_COOKIE);
286257 }
287- KJ_CASE_ONEOF (uncommonKey, UncommonHeaderKey ) {
258+ KJ_CASE_ONEOF (uncommonKey, kj::String ) {
288259 // This case really shouldn't happen since "set-cookie" is a common header,
289260 // but just in case...
290261 return uncommonKey == " set-cookie" ;
@@ -294,21 +265,7 @@ bool Headers::isSetCookie(const HeaderKey& key) {
294265}
295266
296267bool Headers::headerKeyEquals (const HeaderKey& a, const HeaderKey& b) {
297- KJ_SWITCH_ONEOF (a) {
298- KJ_CASE_ONEOF (aCommonId, uint) {
299- KJ_IF_SOME (bCommonId, b.tryGet <uint>()) {
300- return aCommonId == bCommonId;
301- }
302- return false ;
303- }
304- KJ_CASE_ONEOF (aUncommonKey, UncommonHeaderKey) {
305- KJ_IF_SOME (bUncommonKey, b.tryGet <UncommonHeaderKey>()) {
306- return aUncommonKey == bUncommonKey;
307- }
308- return false ;
309- }
310- }
311- KJ_UNREACHABLE;
268+ return a == b;
312269}
313270
314271Headers::Header::Header (jsg::ByteString name, kj::Vector<jsg::ByteString> values)
@@ -354,8 +311,8 @@ kj::StringPtr Headers::Header::Header::getKeyName() const {
354311 KJ_CASE_ONEOF (commonId, uint) {
355312 return COMMON_HEADER_NAMES[commonId];
356313 }
357- KJ_CASE_ONEOF (uncommonKey, UncommonHeaderKey ) {
358- return uncommonKey. getName () ;
314+ KJ_CASE_ONEOF (uncommonKey, kj::String ) {
315+ return uncommonKey;
359316 }
360317 }
361318 KJ_UNREACHABLE;
@@ -394,15 +351,15 @@ kj::uint Headers::HeaderCallbacks::hashCode(const HeaderKey& key) {
394351 KJ_CASE_ONEOF (commonId, uint) {
395352 return kj::hashCode (commonId);
396353 }
397- KJ_CASE_ONEOF (uncommonKey, UncommonHeaderKey ) {
398- return uncommonKey. hashCode ();
354+ KJ_CASE_ONEOF (uncommonKey, kj::String ) {
355+ return kj:: hashCode (uncommonKey );
399356 }
400357 }
401358 KJ_UNREACHABLE;
402359}
403360
404361kj::uint Headers::HeaderCallbacks::hashCode (capnp::CommonHeaderName commondId) {
405- return kj::hashCode (static_cast <uint>( commondId) );
362+ return kj::hashCode (commondId);
406363}
407364
408365Headers::Headers (jsg::Lock& js, jsg::Dict<jsg::ByteString, jsg::ByteString> dict)
@@ -776,7 +733,7 @@ void Headers::serialize(jsg::Lock& js, jsg::Serializer& serializer) {
776733 KJ_CASE_ONEOF (commonId, uint) {
777734 serializer.writeRawUint32 (commonId);
778735 }
779- KJ_CASE_ONEOF (uncommonKey, UncommonHeaderKey ) {
736+ KJ_CASE_ONEOF (_, kj::String ) {
780737 serializer.writeRawUint32 (0 );
781738 serializer.writeLengthDelimited (header.getHeaderName ());
782739 }
0 commit comments