Title: [224786] trunk/Source/WebCore
Revision
224786
Author
[email protected]
Date
2017-11-13 15:00:38 -0800 (Mon, 13 Nov 2017)

Log Message

Call willPerformHTTPRedirection on WebCoreNSURLSession's delegate
https://bugs.webkit.org/show_bug.cgi?id=179539

Reviewed by Jer Noble.

This is now possible!
This will allow AVFoundation to fix redirect-related bugs.

* platform/network/cocoa/WebCoreNSURLSession.mm:
(-[WebCoreNSURLSession addDelegateOperation:]):
(-[WebCoreNSURLSession resetWithCompletionHandler:]):
(-[WebCoreNSURLSession flushWithCompletionHandler:]):
(WebCore::WebCoreNSURLSessionDataTaskClient::redirectReceived):
(-[WebCoreNSURLSessionDataTask resource:shouldCacheResponse:]):
(-[WebCoreNSURLSessionDataTask resource:receivedData:length:]):
(-[WebCoreNSURLSessionDataTask resource:receivedRedirect:request:completionHandler:]):
(-[WebCoreNSURLSessionDataTask resource:receivedRedirect:request:]): Deleted.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (224785 => 224786)


--- trunk/Source/WebCore/ChangeLog	2017-11-13 23:00:04 UTC (rev 224785)
+++ trunk/Source/WebCore/ChangeLog	2017-11-13 23:00:38 UTC (rev 224786)
@@ -1,3 +1,23 @@
+2017-11-13  Alex Christensen  <[email protected]>
+
+        Call willPerformHTTPRedirection on WebCoreNSURLSession's delegate
+        https://bugs.webkit.org/show_bug.cgi?id=179539
+
+        Reviewed by Jer Noble.
+
+        This is now possible!
+        This will allow AVFoundation to fix redirect-related bugs.
+
+        * platform/network/cocoa/WebCoreNSURLSession.mm:
+        (-[WebCoreNSURLSession addDelegateOperation:]):
+        (-[WebCoreNSURLSession resetWithCompletionHandler:]):
+        (-[WebCoreNSURLSession flushWithCompletionHandler:]):
+        (WebCore::WebCoreNSURLSessionDataTaskClient::redirectReceived):
+        (-[WebCoreNSURLSessionDataTask resource:shouldCacheResponse:]):
+        (-[WebCoreNSURLSessionDataTask resource:receivedData:length:]):
+        (-[WebCoreNSURLSessionDataTask resource:receivedRedirect:request:completionHandler:]):
+        (-[WebCoreNSURLSessionDataTask resource:receivedRedirect:request:]): Deleted.
+
 2017-11-13  Chris Dumez  <[email protected]>
 
         Add some more assertions in SWServerJobQueue

Modified: trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm (224785 => 224786)


--- trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm	2017-11-13 23:00:04 UTC (rev 224785)
+++ trunk/Source/WebCore/platform/network/cocoa/WebCoreNSURLSession.mm	2017-11-13 23:00:38 UTC (rev 224786)
@@ -29,6 +29,7 @@
 #import "CachedResourceRequest.h"
 #import "PlatformMediaResourceLoader.h"
 #import "SubresourceLoader.h"
+#import <wtf/BlockPtr.h>
 #import <wtf/CompletionHandler.h>
 
 using namespace WebCore;
@@ -41,7 +42,7 @@
 @property (readonly) PlatformMediaResourceLoader& loader;
 @property (readwrite, retain) id<NSURLSessionTaskDelegate> delegate;
 - (void)taskCompleted:(WebCoreNSURLSessionDataTask *)task;
-- (void)addDelegateOperation:(void (^)(void))operation;
+- (void)addDelegateOperation:(Function<void()>&&)operation;
 - (void)task:(WebCoreNSURLSessionDataTask *)task didReceiveCORSAccessCheckResult:(BOOL)result;
 @end
 
@@ -58,7 +59,7 @@
 - (void)resource:(PlatformMediaResource&)resource receivedResponse:(const ResourceResponse&)response;
 - (BOOL)resource:(PlatformMediaResource&)resource shouldCacheResponse:(const ResourceResponse&)response;
 - (void)resource:(PlatformMediaResource&)resource receivedData:(const char*)data length:(int)length;
-- (void)resource:(PlatformMediaResource&)resource receivedRedirect:(const ResourceResponse&)response request:(ResourceRequest&)request;
+- (void)resource:(PlatformMediaResource&)resource receivedRedirect:(const ResourceResponse&)response request:(ResourceRequest&&)request completionHandler:(CompletionHandler<void(ResourceRequest&&)>&&)completionHandler;
 - (void)resource:(PlatformMediaResource&)resource accessControlCheckFailedWithError:(const ResourceError&)error;
 - (void)resource:(PlatformMediaResource&)resource loadFailedWithError:(const ResourceError&)error;
 - (void)resourceFinished:(PlatformMediaResource&)resource;
@@ -127,10 +128,10 @@
     }];
 }
 
-- (void)addDelegateOperation:(void (^)(void))block
+- (void)addDelegateOperation:(Function<void()>&&)function
 {
     RetainPtr<WebCoreNSURLSession> strongSelf { self };
-    RetainPtr<NSBlockOperation> operation = [NSBlockOperation blockOperationWithBlock:block];
+    RetainPtr<NSBlockOperation> operation = [NSBlockOperation blockOperationWithBlock:BlockPtr<void()>::fromCallable(WTFMove(function)).get()];
     dispatch_async(_internalQueue.get(), [strongSelf, operation] {
         [strongSelf.get().delegateQueue addOperation:operation.get()];
         [operation waitUntilFinished];
@@ -216,13 +217,17 @@
 - (void)resetWithCompletionHandler:(void (^)(void))completionHandler
 {
     // FIXME: This cannot currently be implemented. We cannot guarantee that the next connection will happen on a new socket.
-    [self addDelegateOperation:completionHandler];
+    [self addDelegateOperation:[completionHandler = BlockPtr<void()>(completionHandler)] {
+        completionHandler();
+    }];
 }
 
 - (void)flushWithCompletionHandler:(void (^)(void))completionHandler
 {
     // FIXME: This cannot currently be implemented. We cannot guarantee that the next connection will happen on a new socket.
-    [self addDelegateOperation:completionHandler];
+    [self addDelegateOperation:[completionHandler = BlockPtr<void()>(completionHandler)] {
+        completionHandler();
+    }];
 }
 
 - (void)getTasksWithCompletionHandler:(void (^)(NSArray<NSURLSessionDataTask *> *dataTasks, NSArray<NSURLSessionUploadTask *> *uploadTasks, NSArray<NSURLSessionDownloadTask *> *downloadTasks))completionHandler
@@ -384,8 +389,7 @@
 
 void WebCoreNSURLSessionDataTaskClient::redirectReceived(PlatformMediaResource& resource, ResourceRequest&& request, const ResourceResponse& response, CompletionHandler<void(ResourceRequest&&)>&& completionHandler)
 {
-    [m_task resource:resource receivedRedirect:response request:request];
-    completionHandler(WTFMove(request));
+    [m_task resource:resource receivedRedirect:response request:WTFMove(request) completionHandler:WTFMove(completionHandler)];
 }
 
 void WebCoreNSURLSessionDataTaskClient::accessControlCheckFailed(PlatformMediaResource& resource, const ResourceError& error)
@@ -587,7 +591,6 @@
 - (BOOL)resource:(PlatformMediaResource&)resource shouldCacheResponse:(const ResourceResponse&)response
 {
     ASSERT_UNUSED(resource, &resource == _resource);
-    UNUSED_PARAM(response);
 
     ASSERT(isMainThread());
 
@@ -598,8 +601,6 @@
 - (void)resource:(PlatformMediaResource&)resource receivedData:(const char*)data length:(int)length
 {
     ASSERT_UNUSED(resource, &resource == _resource);
-    UNUSED_PARAM(data);
-    UNUSED_PARAM(length);
     RetainPtr<NSData> nsData = adoptNS([[NSData alloc] initWithBytes:data length:length]);
     RetainPtr<WebCoreNSURLSessionDataTask> strongSelf { self };
     [self.session addDelegateOperation:[strongSelf, length, nsData] {
@@ -610,17 +611,24 @@
     }];
 }
 
-- (void)resource:(PlatformMediaResource&)resource receivedRedirect:(const ResourceResponse&)response request:(ResourceRequest&)request
+- (void)resource:(PlatformMediaResource&)resource receivedRedirect:(const ResourceResponse&)response request:(ResourceRequest&&)request completionHandler:(CompletionHandler<void(ResourceRequest&&)>&&)completionHandler
 {
     ASSERT_UNUSED(resource, &resource == _resource);
-    UNUSED_PARAM(response);
-    UNUSED_PARAM(request);
-    // FIXME: This cannot currently be implemented, as the callback is synchronous
-    // on the main thread, and the NSURLSession delegate must be called back on a
-    // background queue, and we do not want to block the main thread until the
-    // delegate handles the callback and responds via a completion handler. If, in
-    // the future, the ResourceLoader exposes a callback-based willSendResponse
-    // API, this can be implemented.
+    [self.session addDelegateOperation:[strongSelf = retainPtr(self), response = retainPtr(response.nsURLResponse()), request = WTFMove(request), completionHandler = WTFMove(completionHandler)] () mutable {
+        if (![response isKindOfClass:[NSHTTPURLResponse class]]) {
+            ASSERT_NOT_REACHED();
+            return completionHandler(WTFMove(request));
+        }
+        
+        id<NSURLSessionDataDelegate> dataDelegate = (id<NSURLSessionDataDelegate>)strongSelf.get().session.delegate;
+        if ([dataDelegate respondsToSelector:@selector(URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:)]) {
+            auto completionHandlerBlock = BlockPtr<void(NSURLRequest *)>::fromCallable([completionHandler = WTFMove(completionHandler)](NSURLRequest *newRequest) mutable {
+                completionHandler(newRequest);
+            });
+            [dataDelegate URLSession:(NSURLSession *)strongSelf.get().session task:(NSURLSessionTask *)strongSelf.get() willPerformHTTPRedirection:(NSHTTPURLResponse *)response.get() newRequest:request.nsURLRequest(DoNotUpdateHTTPBody) completionHandler:completionHandlerBlock.get()];
+        } else
+            completionHandler(WTFMove(request));
+    }];
 }
 
 - (void)_resource:(PlatformMediaResource&)resource loadFinishedWithError:(NSError *)error
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to