Index: Source/core/fetch/CrossOriginAccessControl.cpp |
diff --git a/Source/core/fetch/CrossOriginAccessControl.cpp b/Source/core/fetch/CrossOriginAccessControl.cpp |
index 803eca8baaad0071c54ccefd512bebf4009ece75..4c65341229039228690868aa02b047cb5653a3fe 100644 |
--- a/Source/core/fetch/CrossOriginAccessControl.cpp |
+++ b/Source/core/fetch/CrossOriginAccessControl.cpp |
@@ -85,7 +85,10 @@ ResourceRequest createAccessControlPreflightRequest(const ResourceRequest& reque |
const HTTPHeaderMap& requestHeaderFields = request.httpHeaderFields(); |
if (requestHeaderFields.size() > 0) { |
- StringBuilder headerBuffer; |
+ // Sort header names lexicographically: https://crbug.com/452391 |
+ // Fetch API Spec: |
+ // https://fetch.spec.whatwg.org/#cors-preflight-fetch-0 |
+ Vector<String> headers; |
for (const auto& header : requestHeaderFields) { |
if (equalIgnoringCase(header.key, "referer")) { |
// When the request is from a Worker, referrer header was added |
@@ -93,11 +96,16 @@ ResourceRequest createAccessControlPreflightRequest(const ResourceRequest& reque |
// Access-Control-Request-Headers header. |
continue; |
} |
+ headers.append(header.key.lower()); |
+ } |
+ std::sort(headers.begin(), headers.end(), WTF::codePointCompareLessThan); |
+ StringBuilder headerBuffer; |
+ for (const String& header : headers) { |
if (!headerBuffer.isEmpty()) |
headerBuffer.appendLiteral(", "); |
- headerBuffer.append(header.key); |
+ headerBuffer.append(header); |
} |
- preflightRequest.setHTTPHeaderField("Access-Control-Request-Headers", AtomicString(headerBuffer.toString().lower())); |
+ preflightRequest.setHTTPHeaderField("Access-Control-Request-Headers", AtomicString(headerBuffer.toString())); |
} |
return preflightRequest; |