Changeset 242786 in webkit
- Timestamp:
- Mar 12, 2019, 1:13:26 AM (7 years ago)
- Location:
- trunk
- Files:
-
- 7 edited
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-not-cors-safelisted.any-expected.txt (modified) (2 diffs)
-
LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-not-cors-safelisted.any.worker-expected.txt (modified) (2 diffs)
-
LayoutTests/imported/w3c/web-platform-tests/fetch/api/headers/headers-no-cors.window-expected.txt (modified) (2 diffs)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/fetch/FetchHeaders.cpp (modified) (7 diffs)
-
Source/WebCore/platform/network/HTTPParsers.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/imported/w3c/ChangeLog
r242595 r242786 1 2019-03-12 Rob Buis <rbuis@igalia.com> 2 3 Implement further CORS restrictions 4 https://bugs.webkit.org/show_bug.cgi?id=188644 5 6 Reviewed by Darin Adler. 7 8 Update improved test results. 9 10 * web-platform-tests/fetch/api/cors/cors-preflight-not-cors-safelisted.any-expected.txt: 11 * web-platform-tests/fetch/api/cors/cors-preflight-not-cors-safelisted.any.worker-expected.txt: 12 * web-platform-tests/fetch/api/headers/headers-no-cors.window-expected.txt: 13 1 14 2019-03-07 Frederic Wang <fwang@igalia.com> 2 15 -
trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-not-cors-safelisted.any-expected.txt
r238664 r242786 2 2 PASS Loading data… 3 3 PASS Need CORS-preflight for accept/" header 4 FAIL Need CORS-preflight for accept/012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 header assert_equals: Preflight request has been made expected "1" but got "0" 4 PASS Need CORS-preflight for accept/012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 header 5 5 PASS Need CORS-preflight for accept-language/ header 6 6 PASS Need CORS-preflight for accept-language/@ header … … 8 8 PASS Need CORS-preflight for content-language/@ header 9 9 PASS Need CORS-preflight for content-type/text/html header 10 FAIL Need CORS-preflight for content-type/text/plain; long=0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 header assert_equals: Preflight request has been made expected "1" but got "0" 10 PASS Need CORS-preflight for content-type/text/plain; long=0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 header 11 11 PASS Need CORS-preflight for test/hi header 12 12 -
trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-not-cors-safelisted.any.worker-expected.txt
r238664 r242786 2 2 PASS Loading data… 3 3 PASS Need CORS-preflight for accept/" header 4 FAIL Need CORS-preflight for accept/012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 header assert_equals: Preflight request has been made expected "1" but got "0" 4 PASS Need CORS-preflight for accept/012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 header 5 5 PASS Need CORS-preflight for accept-language/ header 6 6 PASS Need CORS-preflight for accept-language/@ header … … 8 8 PASS Need CORS-preflight for content-language/@ header 9 9 PASS Need CORS-preflight for content-type/text/html header 10 FAIL Need CORS-preflight for content-type/text/plain; long=0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 header assert_equals: Preflight request has been made expected "1" but got "0" 10 PASS Need CORS-preflight for content-type/text/plain; long=0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 header 11 11 PASS Need CORS-preflight for test/hi header 12 12 -
trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/headers/headers-no-cors.window-expected.txt
r239693 r242786 1 1 2 2 PASS Loading data… 3 FAIL "no-cors" Headers object cannot have accept set to sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, , sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss assert_equals: 1 expected "sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" but got "sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, " 4 FAIL "no-cors" Headers object cannot have accept-language set to sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, , sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss assert_equals: 1 expected "sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" but got "sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, " 5 FAIL "no-cors" Headers object cannot have content-language set to sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, , sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss assert_equals: 1 expected "sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" but got "sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, " 6 FAIL "no-cors" Headers object cannot have accept set to , sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss assert_equals: 1 expected "" but got ", sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" 7 FAIL "no-cors" Headers object cannot have accept-language set to , sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss assert_equals: 1 expected "" but got ", sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" 8 FAIL "no-cors" Headers object cannot have content-language set to , sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss assert_equals: 1 expected "" but got ", sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" 9 FAIL "no-cors" Headers object cannot have content-type set to text/plain;ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, text/plain assert_equals: 1 expected "text/plain;ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" but got "text/plain;ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, text/plain" 3 PASS "no-cors" Headers object cannot have accept set to sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, , sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss 4 PASS "no-cors" Headers object cannot have accept-language set to sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, , sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss 5 PASS "no-cors" Headers object cannot have content-language set to sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, , sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss 6 PASS "no-cors" Headers object cannot have accept set to , sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss 7 PASS "no-cors" Headers object cannot have accept-language set to , sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss 8 PASS "no-cors" Headers object cannot have content-language set to , sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss 9 PASS "no-cors" Headers object cannot have content-type set to text/plain;ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss, text/plain 10 10 PASS "no-cors" Headers object cannot have accept/" as header 11 FAIL "no-cors" Headers object cannot have accept/012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 as header assert_false: expected false got true 11 PASS "no-cors" Headers object cannot have accept/012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 as header 12 12 PASS "no-cors" Headers object cannot have accept-language/ as header 13 13 PASS "no-cors" Headers object cannot have accept-language/@ as header … … 15 15 PASS "no-cors" Headers object cannot have content-language/@ as header 16 16 PASS "no-cors" Headers object cannot have content-type/text/html as header 17 FAIL "no-cors" Headers object cannot have content-type/text/plain; long=0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 as header assert_false: expected false got true 17 PASS "no-cors" Headers object cannot have content-type/text/plain; long=0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 as header 18 18 PASS "no-cors" Headers object cannot have test/hi as header 19 19 PASS "no-cors" Headers object cannot have dpr/2 as header -
trunk/Source/WebCore/ChangeLog
r242784 r242786 1 2019-03-12 Rob Buis <rbuis@igalia.com> 2 3 Implement further CORS restrictions 4 https://bugs.webkit.org/show_bug.cgi?id=188644 5 6 Reviewed by Darin Adler. 7 8 Verify that header value length is not greater than 128 [1]. Also implement 9 Step 5 of [2] to append values to existing header value when calling 10 Headers.append. 11 12 Tests: fetch/api/cors/cors-preflight-not-cors-safelisted.any.html 13 fetch/api/cors/cors-preflight-not-cors-safelisted.any.worker.html 14 fetch/api/headers/headers-no-cors.window.html 15 16 [1] https://fetch.spec.whatwg.org/#cors-safelisted-request-header 17 [2] https://fetch.spec.whatwg.org/#concept-headers-append 18 19 * Modules/fetch/FetchHeaders.cpp: 20 (WebCore::canWriteHeader): 21 (WebCore::appendToHeaderMap): 22 (WebCore::FetchHeaders::remove): 23 (WebCore::FetchHeaders::set): 24 (WebCore::FetchHeaders::filterAndFill): 25 * platform/network/HTTPParsers.cpp: 26 (WebCore::isCrossOriginSafeRequestHeader): verify that header length is not greater than 128 27 1 28 2019-03-11 Ryosuke Niwa <rniwa@webkit.org> 2 29 -
trunk/Source/WebCore/Modules/fetch/FetchHeaders.cpp
r239427 r242786 34 34 namespace WebCore { 35 35 36 static ExceptionOr<bool> canWriteHeader(const String& name, const String& value, FetchHeaders::Guard guard)36 static ExceptionOr<bool> canWriteHeader(const String& name, const String& value, const String& combinedValue, FetchHeaders::Guard guard) 37 37 { 38 38 if (!isValidHTTPToken(name)) … … 44 44 if (guard == FetchHeaders::Guard::Request && isForbiddenHeaderName(name)) 45 45 return false; 46 if (guard == FetchHeaders::Guard::RequestNoCors && ! isSimpleHeader(name, value))46 if (guard == FetchHeaders::Guard::RequestNoCors && !combinedValue.isEmpty() && !isSimpleHeader(name, combinedValue)) 47 47 return false; 48 48 if (guard == FetchHeaders::Guard::Response && isForbiddenResponseHeaderName(name)) … … 54 54 { 55 55 String normalizedValue = stripLeadingAndTrailingHTTPSpaces(value); 56 auto canWriteResult = canWriteHeader(name, normalizedValue, guard); 57 if (canWriteResult.hasException()) 58 return canWriteResult.releaseException(); 59 if (!canWriteResult.releaseReturnValue()) 60 return { }; 61 headers.add(name, normalizedValue); 56 String combinedValue = normalizedValue; 57 if (headers.contains(name)) 58 combinedValue = makeString(headers.get(name), ", ", normalizedValue); 59 auto canWriteResult = canWriteHeader(name, normalizedValue, combinedValue, guard); 60 if (canWriteResult.hasException()) 61 return canWriteResult.releaseException(); 62 if (!canWriteResult.releaseReturnValue()) 63 return { }; 64 headers.set(name, combinedValue); 62 65 return { }; 63 66 } … … 65 68 static ExceptionOr<void> appendToHeaderMap(const HTTPHeaderMap::HTTPHeaderMapConstIterator::KeyValue& header, HTTPHeaderMap& headers, FetchHeaders::Guard guard) 66 69 { 67 auto canWriteResult = canWriteHeader(header.key, header.value, guard);70 auto canWriteResult = canWriteHeader(header.key, header.value, header.value, guard); 68 71 if (canWriteResult.hasException()) 69 72 return canWriteResult.releaseException(); … … 137 140 ExceptionOr<void> FetchHeaders::remove(const String& name) 138 141 { 139 auto canWriteResult = canWriteHeader(name, { }, m_guard);142 auto canWriteResult = canWriteHeader(name, { }, { }, m_guard); 140 143 if (canWriteResult.hasException()) 141 144 return canWriteResult.releaseException(); … … 163 166 { 164 167 String normalizedValue = stripLeadingAndTrailingHTTPSpaces(value); 165 auto canWriteResult = canWriteHeader(name, normalizedValue, m_guard);168 auto canWriteResult = canWriteHeader(name, normalizedValue, normalizedValue, m_guard); 166 169 if (canWriteResult.hasException()) 167 170 return canWriteResult.releaseException(); … … 175 178 { 176 179 for (auto& header : headers) { 177 auto canWriteResult = canWriteHeader(header.key, header.value, guard);180 auto canWriteResult = canWriteHeader(header.key, header.value, header.value, guard); 178 181 if (canWriteResult.hasException()) 179 182 continue; -
trunk/Source/WebCore/platform/network/HTTPParsers.cpp
r242776 r242786 860 860 switch (name) { 861 861 case HTTPHeaderName::Accept: 862 return isValidAcceptHeaderValue(value); 862 if (!isValidAcceptHeaderValue(value)) 863 return false; 864 break; 863 865 case HTTPHeaderName::AcceptLanguage: 864 866 case HTTPHeaderName::ContentLanguage: 865 return isValidLanguageHeaderValue(value); 867 if (!isValidLanguageHeaderValue(value)) 868 return false; 869 break; 866 870 case HTTPHeaderName::ContentType: { 867 871 // Preflight is required for MIME types that can not be sent via form submission. 868 872 String mimeType = extractMIMETypeFromMediaType(value); 869 return equalLettersIgnoringASCIICase(mimeType, "application/x-www-form-urlencoded") || equalLettersIgnoringASCIICase(mimeType, "multipart/form-data") || equalLettersIgnoringASCIICase(mimeType, "text/plain"); 873 if (!(equalLettersIgnoringASCIICase(mimeType, "application/x-www-form-urlencoded") || equalLettersIgnoringASCIICase(mimeType, "multipart/form-data") || equalLettersIgnoringASCIICase(mimeType, "text/plain"))) 874 return false; 875 break; 870 876 } 871 877 default: … … 873 879 return false; 874 880 } 881 return value.length() <= 128; 875 882 } 876 883
Note:
See TracChangeset
for help on using the changeset viewer.