Changeset 287612 in webkit
- Timestamp:
- Jan 5, 2022 2:46:30 AM (7 months ago)
- Location:
- trunk
- Files:
-
- 10 added
- 19 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/http/wpt/fetch/request-consume-stream-expected.txt (modified) (1 diff)
-
LayoutTests/http/wpt/fetch/request-consume-stream.html (modified) (2 diffs)
-
LayoutTests/http/wpt/service-workers/form-data-upload-expected.txt (added)
-
LayoutTests/http/wpt/service-workers/form-data-upload-worker.js (added)
-
LayoutTests/http/wpt/service-workers/form-data-upload.html (added)
-
LayoutTests/http/wpt/service-workers/resources/create-temp-file-iframe.html (added)
-
LayoutTests/http/wpt/service-workers/resources/reset-temp-file.py (added)
-
LayoutTests/http/wpt/service-workers/resources/temp-file-utils.js (added)
-
LayoutTests/http/wpt/service-workers/resources/touch-temp-file.py (added)
-
LayoutTests/http/wpt/service-workers/resources/write-temp-file.py (added)
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-consume-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-consume-stream.any-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-consume-stream.any.worker-expected.txt (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/fetch/FetchBody.cpp (modified) (4 diffs)
-
Source/WebCore/Modules/fetch/FetchBody.h (modified) (1 diff)
-
Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp (modified) (4 diffs)
-
Source/WebCore/Modules/fetch/FetchBodyConsumer.h (modified) (5 diffs)
-
Source/WebCore/Modules/fetch/FormDataConsumer.cpp (added)
-
Source/WebCore/Modules/fetch/FormDataConsumer.h (added)
-
Source/WebCore/Sources.txt (modified) (1 diff)
-
Source/WebCore/WebCore.xcodeproj/project.pbxproj (modified) (2 diffs)
-
Source/WebCore/fileapi/BlobLoader.h (modified) (2 diffs)
-
Source/WebCore/fileapi/FileReaderLoader.cpp (modified) (2 diffs)
-
Source/WebCore/fileapi/FileReaderLoader.h (modified) (1 diff)
-
Source/WebCore/platform/SharedBuffer.h (modified) (1 diff)
-
Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r287611 r287612 1 2022-01-05 Youenn Fablet <youenn@apple.com> 2 3 Fetch using FormData with file doesn't go through Service Worker 4 https://bugs.webkit.org/show_bug.cgi?id=187461 5 <rdar://problem/41975544> 6 7 Reviewed by Chris Dumez. 8 9 In addition to adding a test to http/wpt/fetch/request-consume-stream.html, we fix the other tests that should all be passing. 10 Add http/wpt/service-workers/form-data-upload.html and translate exiting http/tests scripts for the WPT server. 11 12 * http/wpt/fetch/request-consume-stream-expected.txt: 13 * http/wpt/fetch/request-consume-stream.html: 14 * http/wpt/service-workers/form-data-upload-expected.txt: Added. 15 * http/wpt/service-workers/form-data-upload-worker.js: Added. 16 * http/wpt/service-workers/form-data-upload.html: Added. 17 * http/wpt/service-workers/resources/create-temp-file-iframe.html: Added. 18 * http/wpt/service-workers/resources/reset-temp-file.py: Added. 19 * http/wpt/service-workers/resources/temp-file-utils.js: Added. 20 * http/wpt/service-workers/resources/touch-temp-file.py: Added. 21 * http/wpt/service-workers/resources/write-temp-file.py: Added. 22 1 23 2022-01-05 Youenn Fablet <youenn@apple.com> 2 24 -
trunk/LayoutTests/http/wpt/fetch/request-consume-stream-expected.txt
r262254 r287612 1 1 2 FAIL Read empty text request's body as readableStream assert_array_equals: Retrieve and verify stream lengths differ, expected array object "" length 0, got object "123,34,107,101,121,34,58,32,34,118,97,108,117,101,34,125" length 16 3 FAIL Read empty blob request's body as readableStream assert_array_equals: Retrieve and verify stream lengths differ, expected array object "" length 0, got object "123,34,107,101,121,34,58,32,34,118,97,108,117,101,34,125" length 16 4 FAIL Read blob request's body as readableStream assert_array_equals: Retrieve and verify stream lengths differ, expected array object "115,32,105,115,32,114,101,113,117,101,115,116,39,115,32,98,111,100,121,34" length 24, got object "123,34,107,101,121,34,58,32,34,118,97,108,117,101,34,125" length 16 5 FAIL Read text request's body as readableStream assert_array_equals: Retrieve and verify stream lengths differ, expected array object "115,32,105,115,32,114,101,113,117,101,115,116,39,115,32,98,111,100,121,34" length 24, got object "123,34,107,101,121,34,58,32,34,118,97,108,117,101,34,125" length 16 6 FAIL Read URLSearchParams request's body as readableStream assert_array_equals: Retrieve and verify stream lengths differ, expected array object "110,97,109,101,61,118,97,108,117,101" length 10, got object "123,34,107,101,121,34,58,32,34,118,97,108,117,101,34,125" length 16 7 FAIL Read array buffer request's body as readableStream assert_array_equals: Retrieve and verify stream lengths differ, expected array object "115,32,105,115,32,114,101,113,117,101,115,116,39,115,32,98,111,100,121,34" length 24, got object "123,34,107,101,121,34,58,32,34,118,97,108,117,101,34,125" length 16 8 FAIL Read form data request's body as readableStream assert_array_equals: Retrieve and verify stream lengths differ, expected array object "110,97,109,101,61,118,97,108,117,101" length 10, got object "123,34,107,101,121,34,58,32,34,118,97,108,117,101,34,125" length 16 2 PASS Read empty text request's body as readableStream 3 PASS Read empty blob request's body as readableStream 4 PASS Read blob request's body as readableStream 5 PASS Read text request's body as readableStream 6 PASS Read URLSearchParams request's body as readableStream 7 PASS Read array buffer request's body as readableStream 8 PASS Read form data request's body as readableStream 9 PASS Read form data with blob request's body as readableStream 9 10 -
trunk/LayoutTests/http/wpt/fetch/request-consume-stream.html
r221437 r287612 12 12 <body> 13 13 <script> 14 async function getStringFromStream(reader, currentValue) { 15 const data = await reader.read(); 16 if (!data.done) { 17 let buffer; 18 if (currentValue) { 19 const newBuffer = new ArrayBuffer(data.value.length + currentValue.length); 20 buffer = new Uint8Array(newBuffer); 21 buffer.set(currentValue, 0); 22 buffer.set(data.value, currentValue.length); 23 } else 24 buffer = data.value; 25 return getStringFromStream(reader, buffer); 26 } 27 return (new TextDecoder).decode(currentValue); 28 } 29 14 30 function createRequestWithBody(body) 15 31 { 16 return new Request("", {body: "{\"key\": \"value\"}", method: "POST"});32 return new Request("", {body: body, method: "POST"}); 17 33 } 18 34 … … 59 75 }, "Read array buffer request's body as readableStream"); 60 76 61 promise_test( function(test){77 promise_test(async (test) => { 62 78 var request = createRequestWithBody(formData); 63 return validateStreamFromString(request.body.getReader(), "name=value"); 79 const value = await getStringFromStream(request.body.getReader()); 80 81 assert_true(value.includes('name="name"'), "name"); 82 assert_true(value.includes('value'), "name"); 64 83 }, "Read form data request's body as readableStream"); 84 85 promise_test(async (test) => { 86 const formData = new FormData(); 87 const blob = new Blob(["'Hello'"], { "type" : "text/plain" }); 88 formData.append("blob", blob, "blob.file"); 89 formData.append("name", "value"); 90 91 const request = createRequestWithBody(formData); 92 const value = await getStringFromStream(request.body.getReader()); 93 94 assert_true(value.includes('name="name"'), "name"); 95 assert_true(value.includes('value'), "name"); 96 97 assert_true(value.includes('name="blob"'), "blob"); 98 assert_true(value.includes('Hello'), "Hello"); 99 }, "Read form data with blob request's body as readableStream"); 65 100 </script> 66 101 </body> -
trunk/LayoutTests/imported/w3c/ChangeLog
r287610 r287612 1 2022-01-05 Youenn Fablet <youenn@apple.com> 2 3 Fetch using FormData with file doesn't go through Service Worker 4 https://bugs.webkit.org/show_bug.cgi?id=187461 5 <rdar://problem/41975544> 6 7 Reviewed by Chris Dumez. 8 9 * web-platform-tests/fetch/api/response/response-consume-expected.txt: 10 * web-platform-tests/fetch/api/response/response-consume-stream.any-expected.txt: 11 * web-platform-tests/fetch/api/response/response-consume-stream.any.worker-expected.txt: 12 1 13 2022-01-05 Martin Robinson <mrobinson@webkit.org> 2 14 -
trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-consume-expected.txt
r267651 r287612 39 39 PASS Consume response's body: from fetch to arrayBuffer 40 40 PASS Consume response's body: from fetch without correct type to formData (error case) 41 FAIL Consume response's body: from multipart form data blob to formData promise_test: Unhandled rejection with value: object "NotSupportedError: The operation is not supported." 41 PASS Consume response's body: from multipart form data blob to formData 42 42 -
trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-consume-stream.any-expected.txt
r279344 r287612 6 6 PASS Read URLSearchParams response's body as readableStream 7 7 PASS Read array buffer response's body as readableStream 8 FAIL Read form data response's body as readableStream promise_test: Unhandled rejection with value: object "NotSupportedError: Not implemented" 8 PASS Read form data response's body as readableStream 9 9 PASS Getting an error Response stream 10 10 PASS Getting a redirect Response stream -
trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/response/response-consume-stream.any.worker-expected.txt
r279344 r287612 6 6 PASS Read URLSearchParams response's body as readableStream 7 7 PASS Read array buffer response's body as readableStream 8 FAIL Read form data response's body as readableStream promise_test: Unhandled rejection with value: object "NotSupportedError: Not implemented" 8 PASS Read form data response's body as readableStream 9 9 PASS Getting an error Response stream 10 10 PASS Getting a redirect Response stream -
trunk/Source/WebCore/ChangeLog
r287611 r287612 1 2022-01-05 Youenn Fablet <youenn@apple.com> 2 3 Fetch using FormData with file doesn't go through Service Worker 4 https://bugs.webkit.org/show_bug.cgi?id=187461 5 <rdar://problem/41975544> 6 7 Reviewed by Chris Dumez. 8 9 Add support for reading formData based bodies through streams or regular methods like text. 10 For that purpose, we add FormDataConsumer which allows serializing form datas that may contain files or blobs. 11 Add the ability to load blobs from BlobLoader using the internal URL (stored in FormData) in lieu of passing a blob object. 12 Enable fetch events for form data based fetch events. 13 14 Test: http/wpt/service-workers/form-data-upload.html 15 16 * Modules/fetch/FetchBody.cpp: 17 * Modules/fetch/FetchBody.h: 18 * Modules/fetch/FetchBodyConsumer.cpp: 19 * Modules/fetch/FetchBodyConsumer.h: 20 * Modules/fetch/FormDataConsumer.cpp: Added. 21 * Modules/fetch/FormDataConsumer.h: Added. 22 * Sources.txt: 23 * WebCore.xcodeproj/project.pbxproj: 24 * fileapi/BlobLoader.h: 25 * fileapi/FileReaderLoader.cpp: 26 * fileapi/FileReaderLoader.h: 27 * workers/service/context/ServiceWorkerFetch.cpp: 28 1 29 2022-01-05 Youenn Fablet <youenn@apple.com> 2 30 -
trunk/Source/WebCore/Modules/fetch/FetchBody.cpp
r287021 r287612 95 95 } 96 96 97 // FIXME: Support form data bodies. 98 return std::nullopt; 97 return FetchBody { Ref { formData } }; 99 98 } 100 99 … … 197 196 m_data = nullptr; 198 197 } else if (isFormData()) 199 source.error(Exception { NotSupportedError, "Not implemented"_s });198 m_consumer.consumeFormDataAsStream(formDataBody(), source, owner.scriptExecutionContext()); 200 199 else if (m_consumer.hasData()) 201 200 closeStream = source.enqueue(m_consumer.takeAsArrayBuffer()); … … 235 234 void FetchBody::consumeFormData(FetchBodyOwner& owner, Ref<DeferredPromise>&& promise) 236 235 { 237 if (auto sharedBuffer = formDataBody().asSharedBuffer()) { 238 m_consumer.resolveWithData(WTFMove(promise), owner.contentType(), sharedBuffer->makeContiguous()->data(), sharedBuffer->size()); 239 m_data = nullptr; 240 } else { 241 // FIXME: If the form data contains blobs, load them like we do other blobs. 242 // That will fix the last WPT test in response-consume.html. 243 promise->reject(NotSupportedError); 244 } 236 m_consumer.resolveWithFormData(WTFMove(promise), owner.contentType(), formDataBody(), owner.scriptExecutionContext()); 237 m_data = nullptr; 245 238 } 246 239 … … 312 305 FetchBody FetchBody::clone() 313 306 { 314 FetchBody clone(m_consumer );307 FetchBody clone(m_consumer.clone()); 315 308 316 309 if (isArrayBuffer()) -
trunk/Source/WebCore/Modules/fetch/FetchBody.h
r287021 r287612 95 95 explicit FetchBody(String&& data) : m_data(WTFMove(data)) { } 96 96 explicit FetchBody(Ref<const URLSearchParams>&& data) : m_data(WTFMove(data)) { } 97 explicit FetchBody( const FetchBodyConsumer& consumer) : m_consumer(consumer) { }97 explicit FetchBody(FetchBodyConsumer&& consumer) : m_consumer(WTFMove(consumer)) { } 98 98 explicit FetchBody(Ref<ReadableStream>&& stream) : m_readableStream(WTFMove(stream)) { } 99 99 -
trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp
r287021 r287612 31 31 32 32 #include "DOMFormData.h" 33 #include "FormDataConsumer.h" 33 34 #include "HTTPHeaderField.h" 34 35 #include "HTTPParsers.h" … … 244 245 { 245 246 m_buffer.reset(); 247 if (m_formDataConsumer) 248 m_formDataConsumer->cancel(); 246 249 resetConsumePromise(); 247 250 if (m_sink) { … … 254 257 { 255 258 resolveWithTypeAndData(WTFMove(promise), m_type, contentType, data, length); 259 } 260 261 void FetchBodyConsumer::resolveWithFormData(Ref<DeferredPromise>&& promise, const String& contentType, const FormData& formData, ScriptExecutionContext* context) 262 { 263 if (auto sharedBuffer = formData.asSharedBuffer()) { 264 resolveWithData(WTFMove(promise), contentType, sharedBuffer->makeContiguous()->data(), sharedBuffer->size()); 265 return; 266 } 267 268 if (!context) 269 return; 270 271 m_formDataConsumer = makeUnique<FormDataConsumer>(formData, *context, [this, promise = WTFMove(promise), contentType, builder = SharedBufferBuilder { }](auto&& result) mutable { 272 if (result.hasException()) { 273 promise->reject(result.releaseException()); 274 return; 275 } 276 277 auto& value = result.returnValue(); 278 if (value.empty()) { 279 auto buffer = builder.takeAsContiguous(); 280 resolveWithData(WTFMove(promise), contentType, buffer->data(), buffer->size()); 281 return; 282 } 283 284 builder.append(value); 285 }); 286 } 287 288 void FetchBodyConsumer::consumeFormDataAsStream(const FormData& formData, FetchBodySource& source, ScriptExecutionContext* context) 289 { 290 if (auto sharedBuffer = formData.asSharedBuffer()) { 291 if (source.enqueue(ArrayBuffer::tryCreate(sharedBuffer->makeContiguous()->data(), sharedBuffer->size()))) 292 source.close(); 293 return; 294 } 295 296 if (!context) 297 return; 298 299 m_formDataConsumer = makeUnique<FormDataConsumer>(formData, *context, [this, source = Ref { source }](auto&& result) { 300 if (result.hasException()) { 301 source->error(result.releaseException()); 302 return; 303 } 304 305 auto& value = result.returnValue(); 306 if (value.empty()) { 307 source->close(); 308 return; 309 } 310 311 if (!source->enqueue(ArrayBuffer::tryCreate(value.data(), value.size()))) 312 m_formDataConsumer->cancel(); 313 }); 256 314 } 257 315 … … 417 475 } 418 476 477 FetchBodyConsumer FetchBodyConsumer::clone() 478 { 479 FetchBodyConsumer clone { m_type }; 480 clone.m_contentType = m_contentType; 481 clone.m_buffer = m_buffer; 482 return clone; 483 } 484 419 485 } // namespace WebCore -
trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.h
r287021 r287612 30 30 31 31 #include "FetchBodySource.h" 32 #include "FormDataConsumer.h" 32 33 #include "JSDOMPromiseDeferred.h" 33 34 #include "ReadableStreamSink.h" 35 #include "ScriptExecutionContextIdentifier.h" 34 36 #include "SharedBuffer.h" 35 37 #include "UserGestureIndicator.h" … … 40 42 class DOMFormData; 41 43 class FetchBodySource; 44 class FormData; 42 45 class ReadableStream; 43 46 … … 47 50 48 51 explicit FetchBodyConsumer(Type type) : m_type(type) { } 52 53 FetchBodyConsumer clone(); 49 54 50 55 void append(const uint8_t* data, unsigned); … … 66 71 void resolve(Ref<DeferredPromise>&&, const String& contentType, ReadableStream*); 67 72 void resolveWithData(Ref<DeferredPromise>&&, const String& contentType, const unsigned char*, unsigned); 73 void resolveWithFormData(Ref<DeferredPromise>&&, const String& contentType, const FormData&, ScriptExecutionContext*); 74 void consumeFormDataAsStream(const FormData&, FetchBodySource&, ScriptExecutionContext*); 68 75 69 76 void loadingFailed(const Exception&); … … 89 96 bool m_isLoading { false }; 90 97 RefPtr<UserGestureToken> m_userGestureToken; 98 std::unique_ptr<FormDataConsumer> m_formDataConsumer; 91 99 }; 92 100 -
trunk/Source/WebCore/Sources.txt
r287538 r287612 89 89 Modules/fetch/FetchRequest.cpp 90 90 Modules/fetch/FetchResponse.cpp 91 Modules/fetch/FormDataConsumer.cpp 91 92 Modules/fetch/WindowOrWorkerGlobalScopeFetch.cpp 92 93 Modules/filesystemaccess/FileSystemDirectoryHandle.cpp -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r287574 r287612 8486 8486 3FBC4AF2189881560046EE38 /* VideoFullscreenInterfaceAVKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoFullscreenInterfaceAVKit.h; sourceTree = "<group>"; }; 8487 8487 41024FC823CF254F00FDF98E /* SampleBufferDisplayLayer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = SampleBufferDisplayLayer.cpp; sourceTree = "<group>"; }; 8488 4102EE0E27830E6300D6BE74 /* FormDataConsumer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FormDataConsumer.h; sourceTree = "<group>"; }; 8489 4102EE1027830E6300D6BE74 /* FormDataConsumer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FormDataConsumer.cpp; sourceTree = "<group>"; }; 8488 8490 4107908A1FC3E4F20061B27A /* ClientOrigin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClientOrigin.h; sourceTree = "<group>"; }; 8489 8491 4109382C2347850E009428BA /* JSAbortSignalCustom.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JSAbortSignalCustom.cpp; sourceTree = "<group>"; }; … … 21282 21284 413015D61C7B570400091C6E /* FetchResponse.h */, 21283 21285 413015D71C7B570400091C6E /* FetchResponse.idl */, 21286 4102EE1027830E6300D6BE74 /* FormDataConsumer.cpp */, 21287 4102EE0E27830E6300D6BE74 /* FormDataConsumer.h */, 21284 21288 7C2E0BD125106AC4005F3C87 /* WindowOrWorkerGlobalScope+Fetch.idl */, 21285 21289 7C2E0BD025106AC4005F3C87 /* WindowOrWorkerGlobalScopeFetch.cpp */, -
trunk/Source/WebCore/fileapi/BlobLoader.h
r278340 r287612 44 44 45 45 void start(Blob&, ScriptExecutionContext*, FileReaderLoader::ReadType); 46 void start(const URL&, ScriptExecutionContext*, FileReaderLoader::ReadType); 46 47 47 48 void cancel(); … … 90 91 } 91 92 93 inline void BlobLoader::start(const URL& blobURL, ScriptExecutionContext* context, FileReaderLoader::ReadType readType) 94 { 95 ASSERT(!m_loader); 96 m_loader = makeUnique<FileReaderLoader>(readType, this); 97 m_loader->start(context, blobURL); 98 } 99 92 100 inline void BlobLoader::didFinishLoading() 93 101 { -
trunk/Source/WebCore/fileapi/FileReaderLoader.cpp
r286772 r287612 75 75 void FileReaderLoader::start(ScriptExecutionContext* scriptExecutionContext, Blob& blob) 76 76 { 77 start(scriptExecutionContext, blob.url()); 78 } 79 80 void FileReaderLoader::start(ScriptExecutionContext* scriptExecutionContext, const URL& blobURL) 81 { 77 82 ASSERT(scriptExecutionContext); 78 83 … … 83 88 return; 84 89 } 85 ThreadableBlobRegistry::registerBlobURL(scriptExecutionContext->securityOrigin(), scriptExecutionContext->policyContainer(), m_urlForReading, blob .url());90 ThreadableBlobRegistry::registerBlobURL(scriptExecutionContext->securityOrigin(), scriptExecutionContext->policyContainer(), m_urlForReading, blobURL); 86 91 87 92 // Construct and load the request. -
trunk/Source/WebCore/fileapi/FileReaderLoader.h
r286772 r287612 67 67 68 68 WEBCORE_EXPORT void start(ScriptExecutionContext*, Blob&); 69 void start(ScriptExecutionContext*, const URL&); 69 70 WEBCORE_EXPORT void cancel(); 70 71 -
trunk/Source/WebCore/platform/SharedBuffer.h
r287021 r287612 231 231 WEBCORE_EXPORT void append(const FragmentedSharedBuffer&); 232 232 WEBCORE_EXPORT void append(const uint8_t*, size_t); 233 void append(Span<const uint8_t> value) { append(value.data(), value.size()); } 233 234 void append(const char* data, size_t length) { append(reinterpret_cast<const uint8_t*>(data), length); } 234 235 WEBCORE_EXPORT void append(Vector<uint8_t>&&); -
trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp
r287021 r287612 47 47 48 48 // https://fetch.spec.whatwg.org/#http-fetch step 3.3 49 static inline std::optional<ResourceError>validateResponse(const ResourceResponse& response, FetchOptions::Mode mode, FetchOptions::Redirect redirect)49 static inline ResourceError validateResponse(const ResourceResponse& response, FetchOptions::Mode mode, FetchOptions::Redirect redirect) 50 50 { 51 51 if (response.type() == ResourceResponse::Type::Error) … … 85 85 86 86 auto resourceResponse = response->resourceResponse(); 87 if (auto error = validateResponse(resourceResponse, mode, redirect) ) {88 client->didFail(error .value());87 if (auto error = validateResponse(resourceResponse, mode, redirect); !error.isNull()) { 88 client->didFail(error); 89 89 return; 90 90 }
Note: See TracChangeset
for help on using the changeset viewer.