Просмотр исходного кода

Swizzle -[NSURLSessionTask resume] as a better requestWillBeSent… hook.

There is not an equivalent to connection:willSendRequest:redirectResponse: in the NSURLSessionDelegate protocol.
Ryan Olson лет назад: 11
Родитель
Сommit
bd9a062329
1 измененных файлов с 37 добавлено и 0 удалено
  1. 37 0
      Classes/Network/PonyDebugger/FLEXNetworkObserver.m

+ 37 - 0
Classes/Network/PonyDebugger/FLEXNetworkObserver.m

@@ -60,6 +60,8 @@ didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask delegate:(id <NSU
 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite delegate:(id <NSURLSessionDelegate>)delegate;
 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location data:(NSData *)data delegate:(id <NSURLSessionDelegate>)delegate;
 
+- (void)URLSessionTaskWillResume:(NSURLSessionTask *)task;
+
 @end
 
 @interface FLEXNetworkObserver ()
@@ -258,6 +260,7 @@ didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask delegate:(id <NSU
         }
 
         [self injectIntoNSURLConnectionCancel];
+        [self injectIntoNSURLSessionTaskResume];
     });
 }
 
@@ -303,6 +306,24 @@ didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask delegate:(id <NSU
     method_exchangeImplementations(originalCancel, newCancel);
 }
 
++ (void)injectIntoNSURLSessionTaskResume
+{
+    Class class = [NSURLSessionTask class];
+    SEL selector = @selector(resume);
+    SEL swizzledSelector = [self swizzledSelectorForSelector:selector];
+    Method originalResume = class_getInstanceMethod(class, selector);
+
+    void (^swizzleBlock)(NSURLSessionTask *) = ^(NSURLSessionTask *slf) {
+        [[FLEXNetworkObserver sharedObserver] URLSessionTaskWillResume:slf];
+        ((void(*)(id, SEL))objc_msgSend)(slf, swizzledSelector);
+    };
+
+    IMP implementation = imp_implementationWithBlock(swizzleBlock);
+    class_addMethod(class, swizzledSelector, implementation, method_getTypeEncoding(originalResume));
+    Method newResume = class_getInstanceMethod(class, swizzledSelector);
+    method_exchangeImplementations(originalResume, newResume);
+}
+
 + (void)injectWillSendRequestIntoDelegateClass:(Class)cls
 {
     SEL selector = @selector(connection:willSendRequest:redirectResponse:);
@@ -1006,4 +1027,20 @@ didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask delegate:(id <NSU
     }];
 }
 
+- (void)URLSessionTaskWillResume:(NSURLSessionTask *)task
+{
+    // Since resume can be called multiple times on the same task, only treat the first resume as
+    // the equivalent to connection:willSendRequest:...
+    [self performBlock:^{
+        NSURLRequest *request = [self requestForTask:task];
+        if (!request) {
+            request = task.currentRequest;
+            [self setRequest:request forTask:task];
+            NSString *requestID = [self requestIDForTask:task];
+
+            [[FLEXNetworkRecorder defaultRecorder] recordRequestWillBeSentWithRequestId:requestID request:request redirectResponse:nil];
+        }
+    }];
+}
+
 @end