aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bun.js/bindings/webcore/FetchHeaders.cpp18
-rw-r--r--src/bun.js/bindings/webcore/HTTPHeaderMap.h2
-rw-r--r--src/bun.js/bindings/webcore/HTTPParsers.cpp60
3 files changed, 42 insertions, 38 deletions
diff --git a/src/bun.js/bindings/webcore/FetchHeaders.cpp b/src/bun.js/bindings/webcore/FetchHeaders.cpp
index 7834836c7..9d8572faf 100644
--- a/src/bun.js/bindings/webcore/FetchHeaders.cpp
+++ b/src/bun.js/bindings/webcore/FetchHeaders.cpp
@@ -46,8 +46,6 @@ static ExceptionOr<bool> canWriteHeader(const HTTPHeaderName name, const String&
return Exception { TypeError, makeString("Header '", name, "' has invalid value: '", value, "'") };
if (guard == FetchHeaders::Guard::Immutable)
return Exception { TypeError, "Headers object's guard is 'immutable'"_s };
- if (guard == FetchHeaders::Guard::RequestNoCors && !combinedValue.isEmpty())
- return false;
return true;
}
@@ -60,12 +58,6 @@ static ExceptionOr<bool> canWriteHeader(const String& name, const String& value,
return Exception { TypeError, makeString("Header '", name, "' has invalid value: '", value, "'") };
if (guard == FetchHeaders::Guard::Immutable)
return Exception { TypeError, "Headers object's guard is 'immutable'"_s };
- if (guard == FetchHeaders::Guard::Request && isForbiddenHeaderName(name))
- return false;
- if (guard == FetchHeaders::Guard::RequestNoCors && !combinedValue.isEmpty() && !isSimpleHeader(name, combinedValue))
- return false;
- if (guard == FetchHeaders::Guard::Response && isForbiddenResponseHeaderName(name))
- return false;
return true;
}
@@ -173,6 +165,16 @@ ExceptionOr<void> FetchHeaders::fill(const Init& headerInit)
ExceptionOr<void> FetchHeaders::fill(const FetchHeaders& otherHeaders)
{
+ if (this->size() == 0) {
+ HTTPHeaderMap headers;
+ headers.commonHeaders().appendVector(otherHeaders.m_headers.commonHeaders());
+ headers.uncommonHeaders().appendVector(otherHeaders.m_headers.uncommonHeaders());
+ headers.getSetCookieHeaders().appendVector(otherHeaders.m_headers.getSetCookieHeaders());
+ setInternalHeaders(WTFMove(headers));
+ m_updateCounter++;
+ return {};
+ }
+
for (auto& header : otherHeaders.m_headers) {
auto result = appendToHeaderMap(header, m_headers, m_guard);
if (result.hasException())
diff --git a/src/bun.js/bindings/webcore/HTTPHeaderMap.h b/src/bun.js/bindings/webcore/HTTPHeaderMap.h
index 0e4d9b565..e96e31f86 100644
--- a/src/bun.js/bindings/webcore/HTTPHeaderMap.h
+++ b/src/bun.js/bindings/webcore/HTTPHeaderMap.h
@@ -220,10 +220,12 @@ public:
template<size_t length> bool remove(const char (&)[length]) = delete;
const Vector<String, 0> &getSetCookieHeaders() const { return m_setCookieHeaders; }
+
const CommonHeadersVector &commonHeaders() const { return m_commonHeaders; }
const UncommonHeadersVector &uncommonHeaders() const { return m_uncommonHeaders; }
CommonHeadersVector &commonHeaders() { return m_commonHeaders; }
UncommonHeadersVector &uncommonHeaders() { return m_uncommonHeaders; }
+ Vector<String, 0> &getSetCookieHeaders() { return m_setCookieHeaders; }
const_iterator begin() const { return const_iterator(*this, m_commonHeaders.begin(), m_uncommonHeaders.begin(), m_setCookieHeaders.begin()); }
const_iterator end() const { return const_iterator(*this, m_commonHeaders.end(), m_uncommonHeaders.end(), m_setCookieHeaders.end()); }
diff --git a/src/bun.js/bindings/webcore/HTTPParsers.cpp b/src/bun.js/bindings/webcore/HTTPParsers.cpp
index d3e4d4c3a..cb4985281 100644
--- a/src/bun.js/bindings/webcore/HTTPParsers.cpp
+++ b/src/bun.js/bindings/webcore/HTTPParsers.cpp
@@ -996,36 +996,36 @@ bool isCrossOriginSafeRequestHeader(HTTPHeaderName name, const String& value)
if (value.length() > 128)
return false;
- switch (name) {
- case HTTPHeaderName::Accept:
- if (!isValidAcceptHeaderValue(value))
- return false;
- break;
- case HTTPHeaderName::AcceptLanguage:
- case HTTPHeaderName::ContentLanguage:
- if (!isValidLanguageHeaderValue(value))
- return false;
- break;
- case HTTPHeaderName::ContentType: {
- // Preflight is required for MIME types that can not be sent via form submission.
- if (containsCORSUnsafeRequestHeaderBytes(value))
- return false;
- auto parsedContentType = ParsedContentType::create(value);
- if (!parsedContentType)
- return false;
- String mimeType = parsedContentType->mimeType();
- if (!(equalLettersIgnoringASCIICase(mimeType, "application/x-www-form-urlencoded"_s) || equalLettersIgnoringASCIICase(mimeType, "multipart/form-data"_s) || equalLettersIgnoringASCIICase(mimeType, "text/plain"_s)))
- return false;
- break;
- }
- case HTTPHeaderName::Range:
- if (!isSimpleRangeHeaderValue(value))
- return false;
- break;
- default:
- // FIXME: Should we also make safe other headers (DPR, Downlink, Save-Data...)? That would require validating their values.
- return false;
- }
+ // switch (name) {
+ // case HTTPHeaderName::Accept:
+ // if (!isValidAcceptHeaderValue(value))
+ // return false;
+ // break;
+ // case HTTPHeaderName::AcceptLanguage:
+ // case HTTPHeaderName::ContentLanguage:
+ // if (!isValidLanguageHeaderValue(value))
+ // return false;
+ // break;
+ // case HTTPHeaderName::ContentType: {
+ // // Preflight is required for MIME types that can not be sent via form submission.
+ // if (containsCORSUnsafeRequestHeaderBytes(value))
+ // return false;
+ // auto parsedContentType = ParsedContentType::create(value);
+ // if (!parsedContentType)
+ // return false;
+ // String mimeType = parsedContentType->mimeType();
+ // if (!(equalLettersIgnoringASCIICase(mimeType, "application/x-www-form-urlencoded"_s) || equalLettersIgnoringASCIICase(mimeType, "multipart/form-data"_s) || equalLettersIgnoringASCIICase(mimeType, "text/plain"_s)))
+ // return false;
+ // break;
+ // }
+ // case HTTPHeaderName::Range:
+ // if (!isSimpleRangeHeaderValue(value))
+ // return false;
+ // break;
+ // default:
+ // // FIXME: Should we also make safe other headers (DPR, Downlink, Save-Data...)? That would require validating their values.
+ // return false;
+ // }
return true;
}