2x faster headers.get, headers.delete, headers.has (#18571)

This commit is contained in:
Jarred Sumner
2025-03-28 01:15:00 -07:00
committed by GitHub
parent 8e0c8a143e
commit accccbfdaf
4 changed files with 36 additions and 18 deletions

View File

@@ -1379,6 +1379,8 @@ JSC_DEFINE_HOST_FUNCTION(jsHTTPSetHeader, (JSGlobalObject * globalObject, CallFr
if (nameValue.isString()) {
String name = nameValue.toWTFString(globalObject);
RETURN_IF_EXCEPTION(scope, {});
FetchHeaders* impl = &headers->wrapped();
if (valueValue.isUndefined())

View File

@@ -207,22 +207,20 @@ ExceptionOr<void> FetchHeaders::append(const String& name, const String& value)
// https://fetch.spec.whatwg.org/#dom-headers-delete
ExceptionOr<void> FetchHeaders::remove(const StringView name)
{
ASSERT_WITH_MESSAGE(m_guard == FetchHeaders::Guard::None, "We don't use guards in Bun");
HTTPHeaderName headerName;
if (findHTTPHeaderName(name, headerName)) {
++m_updateCounter;
m_headers.remove(headerName);
return {};
}
if (!isValidHTTPToken(name))
return Exception { TypeError, makeString("Invalid header name: '"_s, name, "'"_s) };
if (m_guard == FetchHeaders::Guard::Immutable)
return Exception { TypeError, "Headers object's guard is 'immutable'"_s };
if (m_guard == FetchHeaders::Guard::Request && isForbiddenHeaderName(name))
return {};
if (m_guard == FetchHeaders::Guard::RequestNoCors && !isNoCORSSafelistedRequestHeaderName(name) && !isPriviledgedNoCORSRequestHeaderName(name))
return {};
if (m_guard == FetchHeaders::Guard::Response && isForbiddenResponseHeaderName(name))
return {};
++m_updateCounter;
m_headers.remove(name);
if (m_guard == FetchHeaders::Guard::RequestNoCors)
removePrivilegedNoCORSRequestHeaders(m_headers);
m_headers.removeUncommonHeader(name);
return {};
}
@@ -234,16 +232,23 @@ size_t FetchHeaders::memoryCost() const
ExceptionOr<String> FetchHeaders::get(const StringView name) const
{
if (!isValidHTTPToken(name))
return Exception { TypeError, makeString("Invalid header name: '"_s, name, "'"_s) };
return m_headers.get(name);
auto result = m_headers.get(name);
if (result.isEmpty()) {
if (!isValidHTTPToken(name))
return Exception { TypeError, makeString("Invalid header name: '"_s, name, "'"_s) };
}
return result;
}
ExceptionOr<bool> FetchHeaders::has(const StringView name) const
{
if (!isValidHTTPToken(name))
return Exception { TypeError, makeString("Invalid header name: '"_s, name, '"') };
return m_headers.contains(name);
bool has = m_headers.contains(name);
if (!has) {
if (!isValidHTTPToken(name))
return Exception { TypeError, makeString("Invalid header name: '"_s, name, '"') };
}
return has;
}
ExceptionOr<void> FetchHeaders::set(const HTTPHeaderName name, const String& value)

View File

@@ -219,6 +219,16 @@ bool HTTPHeaderMap::remove(const StringView name)
if (findHTTPHeaderName(name, headerName))
return remove(headerName);
return removeUncommonHeader(name);
}
bool HTTPHeaderMap::removeUncommonHeader(const StringView name)
{
#if ASSERT_ENABLED
HTTPHeaderName headerName;
ASSERT(!findHTTPHeaderName(name, headerName));
#endif
return m_uncommonHeaders.removeFirstMatching([&](auto& header) {
return equalIgnoringASCIICase(header.key, name);
});

View File

@@ -189,6 +189,7 @@ public:
WEBCORE_EXPORT bool contains(const StringView) const;
WEBCORE_EXPORT int64_t indexOf(StringView name) const;
WEBCORE_EXPORT bool remove(const StringView);
WEBCORE_EXPORT bool removeUncommonHeader(const StringView);
WEBCORE_EXPORT String getIndex(HeaderIndex index) const;
WEBCORE_EXPORT bool setIndex(HeaderIndex index, const String &value);