Parcourir la source

Better handling when only some of the network recorder methods are called.

We won’t always see the full lifecycle of a request for various reasons. We should still try to log the transaction, even if we only see pieces of it.
Ryan Olson il y a 11 ans
Parent
commit
eee45744d0

+ 4 - 4
Classes/Network/FLEXNetworkRecorder.h

@@ -46,15 +46,15 @@ extern NSString *const kFLEXNetworkRecorderTransactionsClearedNotification;
 - (void)recordRequestWillBeSentWithRequestId:(NSString *)requestId request:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse requestMechanism:(NSString *)mechanism;
 - (void)recordRequestWillBeSentWithRequestId:(NSString *)requestId request:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse requestMechanism:(NSString *)mechanism;
 
 
 /// Call when HTTP response is available.
 /// Call when HTTP response is available.
-- (void)recordResponseReceivedWithRequestId:(NSString *)requestId response:(NSURLResponse *)response;
+- (void)recordResponseReceivedWithRequestId:(NSString *)requestId request:(NSURLRequest *)request response:(NSURLResponse *)response;
 
 
 /// Call when data chunk is received over the network.
 /// Call when data chunk is received over the network.
-- (void)recordDataReceivedWithRequestId:(NSString *)requestId dataLength:(int64_t)dataLength;
+- (void)recordDataReceivedWithRequestId:(NSString *)requestId request:(NSURLRequest *)request dataLength:(int64_t)dataLength;
 
 
 /// Call when HTTP request has finished loading.
 /// Call when HTTP request has finished loading.
-- (void)recordLoadingFinishedWithRequestId:(NSString *)requestId responseBody:(NSData *)responseBody;
+- (void)recordLoadingFinishedWithRequestId:(NSString *)requestId request:(NSURLRequest *)request responseBody:(NSData *)responseBody;
 
 
 /// Call when HTTP request has failed to load.
 /// Call when HTTP request has failed to load.
-- (void)recordLoadingFailedWithRequestId:(NSString *)requestId error:(NSError *)error;
+- (void)recordLoadingFailedWithRequestId:(NSString *)requestId request:(NSURLRequest *)request error:(NSError *)error;
 
 
 @end
 @end

+ 35 - 33
Classes/Network/FLEXNetworkRecorder.m

@@ -43,7 +43,9 @@ NSString *const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey = @"com.flex.r
         }
         }
         self.orderedTransactions = [NSMutableArray array];
         self.orderedTransactions = [NSMutableArray array];
         self.networkTransactionsForRequestIdentifiers = [NSMutableDictionary dictionary];
         self.networkTransactionsForRequestIdentifiers = [NSMutableDictionary dictionary];
-        self.queue = dispatch_queue_create("com.flex.FLEXNetworkRecorder", DISPATCH_QUEUE_CONCURRENT);
+
+        // Serial queue used because we use mutable objects that are not thread safe
+        self.queue = dispatch_queue_create("com.flex.FLEXNetworkRecorder", DISPATCH_QUEUE_SERIAL);
     }
     }
     return self;
     return self;
 }
 }
@@ -87,7 +89,7 @@ NSString *const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey = @"com.flex.r
 
 
 - (void)clearRecordedActivity
 - (void)clearRecordedActivity
 {
 {
-    dispatch_barrier_async(self.queue, ^{
+    dispatch_async(self.queue, ^{
         [self.responseCache removeAllObjects];
         [self.responseCache removeAllObjects];
         [self.orderedTransactions removeAllObjects];
         [self.orderedTransactions removeAllObjects];
         [self.networkTransactionsForRequestIdentifiers removeAllObjects];
         [self.networkTransactionsForRequestIdentifiers removeAllObjects];
@@ -102,33 +104,23 @@ NSString *const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey = @"com.flex.r
 - (void)recordRequestWillBeSentWithRequestId:(NSString *)requestId request:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse requestMechanism:(NSString *)mechanism
 - (void)recordRequestWillBeSentWithRequestId:(NSString *)requestId request:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse requestMechanism:(NSString *)mechanism
 {
 {
     if (redirectResponse) {
     if (redirectResponse) {
-        [self recordResponseReceivedWithRequestId:requestId response:redirectResponse];
-        [self recordLoadingFinishedWithRequestId:requestId responseBody:nil];
+        [self recordResponseReceivedWithRequestId:requestId request:request response:redirectResponse];
+        [self recordLoadingFinishedWithRequestId:requestId request:request responseBody:nil];
     }
     }
 
 
-    // Use a barrier here because we mutate collections that are not thread safe.
-    dispatch_barrier_async(self.queue, ^{
-        FLEXNetworkTransaction *transaction = [[FLEXNetworkTransaction alloc] init];
-        transaction.requestId = requestId;
-        transaction.request = request;
-        transaction.startTime = [NSDate date];
+    dispatch_async(self.queue, ^{
+        FLEXNetworkTransaction *transaction = [self addOrRetrieveTransactionForRequestId:requestId request:request];
         transaction.transactionState = FLEXNetworkTransactionStateAwaitingResponse;
         transaction.transactionState = FLEXNetworkTransactionStateAwaitingResponse;
         transaction.requestMechanism = mechanism;
         transaction.requestMechanism = mechanism;
 
 
-        [self.orderedTransactions insertObject:transaction atIndex:0];
-        [self.networkTransactionsForRequestIdentifiers setObject:transaction forKey:requestId];
-
         [self postNewTransactionNotificationWithTransaction:transaction];
         [self postNewTransactionNotificationWithTransaction:transaction];
     });
     });
 }
 }
 
 
-- (void)recordResponseReceivedWithRequestId:(NSString *)requestId response:(NSURLResponse *)response
+- (void)recordResponseReceivedWithRequestId:(NSString *)requestId request:(NSURLRequest *)request response:(NSURLResponse *)response
 {
 {
     dispatch_async(self.queue, ^{
     dispatch_async(self.queue, ^{
-        FLEXNetworkTransaction *transaction = [self.networkTransactionsForRequestIdentifiers objectForKey:requestId];
-        if (!transaction) {
-            return;
-        }
+        FLEXNetworkTransaction *transaction = [self addOrRetrieveTransactionForRequestId:requestId request:request];
         transaction.response = response;
         transaction.response = response;
         transaction.transactionState = FLEXNetworkTransactionStateReceivingData;
         transaction.transactionState = FLEXNetworkTransactionStateReceivingData;
         transaction.latency = -[transaction.startTime timeIntervalSinceNow];
         transaction.latency = -[transaction.startTime timeIntervalSinceNow];
@@ -137,26 +129,20 @@ NSString *const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey = @"com.flex.r
     });
     });
 }
 }
 
 
-- (void)recordDataReceivedWithRequestId:(NSString *)requestId dataLength:(int64_t)dataLength
+- (void)recordDataReceivedWithRequestId:(NSString *)requestId request:(NSURLRequest *)request dataLength:(int64_t)dataLength
 {
 {
     dispatch_async(self.queue, ^{
     dispatch_async(self.queue, ^{
-        FLEXNetworkTransaction *transaction = [self.networkTransactionsForRequestIdentifiers objectForKey:requestId];
-        if (!transaction) {
-            return;
-        }
+        FLEXNetworkTransaction *transaction = [self addOrRetrieveTransactionForRequestId:requestId request:request];
         transaction.receivedDataLength += dataLength;
         transaction.receivedDataLength += dataLength;
 
 
         [self postUpdateNotificationForTransaction:transaction];
         [self postUpdateNotificationForTransaction:transaction];
     });
     });
 }
 }
 
 
-- (void)recordLoadingFinishedWithRequestId:(NSString *)requestId responseBody:(NSData *)responseBody
+- (void)recordLoadingFinishedWithRequestId:(NSString *)requestId request:(NSURLRequest *)request responseBody:(NSData *)responseBody
 {
 {
     dispatch_async(self.queue, ^{
     dispatch_async(self.queue, ^{
-        FLEXNetworkTransaction *transaction = [self.networkTransactionsForRequestIdentifiers objectForKey:requestId];
-        if (!transaction) {
-            return;
-        }
+        FLEXNetworkTransaction *transaction = [self addOrRetrieveTransactionForRequestId:requestId request:request];
         transaction.transactionState = FLEXNetworkTransactionStateFinished;
         transaction.transactionState = FLEXNetworkTransactionStateFinished;
         transaction.duration = -[transaction.startTime timeIntervalSinceNow];
         transaction.duration = -[transaction.startTime timeIntervalSinceNow];
 
 
@@ -192,13 +178,10 @@ NSString *const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey = @"com.flex.r
     });
     });
 }
 }
 
 
-- (void)recordLoadingFailedWithRequestId:(NSString *)requestId error:(NSError *)error
+- (void)recordLoadingFailedWithRequestId:(NSString *)requestId request:(NSURLRequest *)request error:(NSError *)error
 {
 {
     dispatch_async(self.queue, ^{
     dispatch_async(self.queue, ^{
-        FLEXNetworkTransaction *transaction = [self.networkTransactionsForRequestIdentifiers objectForKey:requestId];
-        if (!transaction) {
-            return;
-        }
+        FLEXNetworkTransaction *transaction = [self addOrRetrieveTransactionForRequestId:requestId request:request];
         transaction.transactionState = FLEXNetworkTransactionStateFailed;
         transaction.transactionState = FLEXNetworkTransactionStateFailed;
         transaction.duration = [transaction.startTime timeIntervalSinceNow];
         transaction.duration = [transaction.startTime timeIntervalSinceNow];
         transaction.error = error;
         transaction.error = error;
@@ -207,6 +190,25 @@ NSString *const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey = @"com.flex.r
     });
     });
 }
 }
 
 
+/// Should only be called on the serial queue used in this class
+- (FLEXNetworkTransaction *)addOrRetrieveTransactionForRequestId:(NSString *)requestId request:(NSURLRequest *)request
+{
+    FLEXNetworkTransaction *transaction = [self.networkTransactionsForRequestIdentifiers objectForKey:requestId];
+    if (!transaction) {
+        transaction = [[FLEXNetworkTransaction alloc] init];
+        transaction.requestId = requestId;
+        transaction.request = request;
+        transaction.startTime = [NSDate date];
+
+        [self.orderedTransactions insertObject:transaction atIndex:0];
+        [self.networkTransactionsForRequestIdentifiers setObject:transaction forKey:requestId];
+    }
+    if (request) {
+        transaction.request = request;
+    }
+    return transaction;
+}
+
 - (void)postNewTransactionNotificationWithTransaction:(FLEXNetworkTransaction *)transaction
 - (void)postNewTransactionNotificationWithTransaction:(FLEXNetworkTransaction *)transaction
 {
 {
     dispatch_async(dispatch_get_main_queue(), ^{
     dispatch_async(dispatch_get_main_queue(), ^{

+ 12 - 11
Classes/Network/PonyDebugger/FLEXNetworkObserver.m

@@ -789,7 +789,7 @@ static NSString *const kFLEXNetworkObserverEnableOnLaunchDefaultsKey = @"com.fle
             [self setAccumulatedData:dataAccumulator forConnection:connection];
             [self setAccumulatedData:dataAccumulator forConnection:connection];
             
             
             NSString *requestID = [self requestIDForConnection:connection];
             NSString *requestID = [self requestIDForConnection:connection];
-            [[FLEXNetworkRecorder defaultRecorder] recordResponseReceivedWithRequestId:requestID response:response];
+            [[FLEXNetworkRecorder defaultRecorder] recordResponseReceivedWithRequestId:requestID request:connection.currentRequest response:response];
         }
         }
         
         
     }];
     }];
@@ -806,7 +806,7 @@ static NSString *const kFLEXNetworkObserverEnableOnLaunchDefaultsKey = @"com.fle
         
         
         NSString *requestID = [self requestIDForConnection:connection];
         NSString *requestID = [self requestIDForConnection:connection];
         
         
-        [[FLEXNetworkRecorder defaultRecorder] recordDataReceivedWithRequestId:requestID dataLength:data.length];
+        [[FLEXNetworkRecorder defaultRecorder] recordDataReceivedWithRequestId:requestID request:connection.currentRequest dataLength:data.length];
     }];
     }];
 }
 }
 
 
@@ -817,7 +817,7 @@ static NSString *const kFLEXNetworkObserverEnableOnLaunchDefaultsKey = @"com.fle
 
 
         NSData *accumulatedData = [self accumulatedDataForConnection:connection];
         NSData *accumulatedData = [self accumulatedDataForConnection:connection];
         
         
-        [[FLEXNetworkRecorder defaultRecorder] recordLoadingFinishedWithRequestId:requestID responseBody:accumulatedData];
+        [[FLEXNetworkRecorder defaultRecorder] recordLoadingFinishedWithRequestId:requestID request:connection.currentRequest responseBody:accumulatedData];
         
         
         [self connectionFinished:connection];
         [self connectionFinished:connection];
     }];
     }];
@@ -826,7 +826,8 @@ static NSString *const kFLEXNetworkObserverEnableOnLaunchDefaultsKey = @"com.fle
 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error delegate:(id<NSURLConnectionDelegate>)delegate
 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error delegate:(id<NSURLConnectionDelegate>)delegate
 {
 {
     [self performBlock:^{
     [self performBlock:^{
-        [[FLEXNetworkRecorder defaultRecorder] recordLoadingFailedWithRequestId:[self requestIDForConnection:connection] error:error];
+        NSString *requestID = [self requestIDForConnection:connection];
+        [[FLEXNetworkRecorder defaultRecorder] recordLoadingFailedWithRequestId:requestID request:connection.currentRequest error:error];
         
         
         [self connectionFinished:connection];
         [self connectionFinished:connection];
     }];
     }];
@@ -869,7 +870,7 @@ static NSString *const kFLEXNetworkObserverEnableOnLaunchDefaultsKey = @"com.fle
         [self setAccumulatedData:dataAccumulator forTask:dataTask];
         [self setAccumulatedData:dataAccumulator forTask:dataTask];
 
 
         NSString *requestID = [self requestIDForTask:dataTask];
         NSString *requestID = [self requestIDForTask:dataTask];
-        [[FLEXNetworkRecorder defaultRecorder] recordResponseReceivedWithRequestId:requestID response:response];
+        [[FLEXNetworkRecorder defaultRecorder] recordResponseReceivedWithRequestId:requestID request:dataTask.currentRequest response:response];
     }
     }
 }
 }
 
 
@@ -884,7 +885,7 @@ static NSString *const kFLEXNetworkObserverEnableOnLaunchDefaultsKey = @"com.fle
 
 
         NSString *requestID = [self requestIDForTask:dataTask];
         NSString *requestID = [self requestIDForTask:dataTask];
 
 
-        [[FLEXNetworkRecorder defaultRecorder] recordDataReceivedWithRequestId:requestID dataLength:data.length];
+        [[FLEXNetworkRecorder defaultRecorder] recordDataReceivedWithRequestId:requestID request:dataTask.currentRequest dataLength:data.length];
     }];
     }];
 }
 }
 
 
@@ -896,9 +897,9 @@ static NSString *const kFLEXNetworkObserverEnableOnLaunchDefaultsKey = @"com.fle
         NSData *accumulatedData = [self accumulatedDataForTask:task];
         NSData *accumulatedData = [self accumulatedDataForTask:task];
 
 
         if (error) {
         if (error) {
-            [[FLEXNetworkRecorder defaultRecorder] recordLoadingFailedWithRequestId:[self requestIDForTask:task] error:error];
+            [[FLEXNetworkRecorder defaultRecorder] recordLoadingFailedWithRequestId:requestID request:task.currentRequest error:error];
         } else {
         } else {
-            [[FLEXNetworkRecorder defaultRecorder] recordLoadingFinishedWithRequestId:requestID responseBody:accumulatedData];
+            [[FLEXNetworkRecorder defaultRecorder] recordLoadingFinishedWithRequestId:requestID request:task.currentRequest responseBody:accumulatedData];
         }
         }
 
 
         [self taskFinished:task];
         [self taskFinished:task];
@@ -923,12 +924,12 @@ static NSString *const kFLEXNetworkObserverEnableOnLaunchDefaultsKey = @"com.fle
             dataAccumulator = [[NSMutableData alloc] initWithCapacity:(NSUInteger) totalBytesExpectedToWrite];
             dataAccumulator = [[NSMutableData alloc] initWithCapacity:(NSUInteger) totalBytesExpectedToWrite];
             [self setAccumulatedData:dataAccumulator forTask:downloadTask];
             [self setAccumulatedData:dataAccumulator forTask:downloadTask];
 
 
-            [[FLEXNetworkRecorder defaultRecorder] recordResponseReceivedWithRequestId:requestID response:downloadTask.response];
+            [[FLEXNetworkRecorder defaultRecorder] recordResponseReceivedWithRequestId:requestID request:request response:downloadTask.response];
         }
         }
 
 
         NSString *requestID = [self requestIDForTask:downloadTask];
         NSString *requestID = [self requestIDForTask:downloadTask];
 
 
-        [[FLEXNetworkRecorder defaultRecorder] recordDataReceivedWithRequestId:requestID dataLength:bytesWritten];
+        [[FLEXNetworkRecorder defaultRecorder] recordDataReceivedWithRequestId:requestID request:downloadTask.currentRequest dataLength:bytesWritten];
     }];
     }];
 }
 }
 
 
@@ -936,7 +937,7 @@ static NSString *const kFLEXNetworkObserverEnableOnLaunchDefaultsKey = @"com.fle
 {
 {
     [self performBlock:^{
     [self performBlock:^{
         NSString *requestID = [self requestIDForTask:downloadTask];
         NSString *requestID = [self requestIDForTask:downloadTask];
-        [[FLEXNetworkRecorder defaultRecorder] recordLoadingFinishedWithRequestId:requestID responseBody:data];
+        [[FLEXNetworkRecorder defaultRecorder] recordLoadingFinishedWithRequestId:requestID request:downloadTask.currentRequest responseBody:data];
 
 
         [self taskFinished:downloadTask];
         [self taskFinished:downloadTask];
     }];
     }];