FLEXNetworkLib to SKFLEXNetworkLib

Summary:
rename FLEXNetworkLib to SKFLEXNetworkLib so it doesnt clash with Stock FLEX if embedded in the app too

also 'fix' 3 warnings by adding explicit casts

Reviewed By: lblasa

Differential Revision: D35200011

fbshipit-source-id: 82bdecc5076b86958ea0cb80260584c012940045
This commit is contained in:
Dominik Pich
2022-03-31 12:35:22 -07:00
committed by Facebook GitHub Bot
parent fd23a9d626
commit 8cbb5c4d46
9 changed files with 331 additions and 325 deletions

View File

@@ -38,13 +38,13 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
FOUNDATION_EXTERN NSString* const FOUNDATION_EXTERN NSString* const
kFLEXNetworkObserverEnabledStateChangedNotification; kSKFLEXNetworkObserverEnabledStateChangedNotification;
/// This class swizzles NSURLConnection and NSURLSession delegate methods to /// This class swizzles NSURLConnection and NSURLSession delegate methods to
/// observe events in the URL loading system. High level network events are sent /// observe events in the URL loading system. High level network events are sent
/// to the default FLEXNetworkRecorder instance which maintains the request /// to the default SKFLEXNetworkRecorder instance which maintains the request
/// history and caches response bodies. /// history and caches response bodies.
@interface FLEXNetworkObserver : NSObject @interface SKFLEXNetworkObserver : NSObject
+ (void)start; + (void)start;

View File

@@ -35,38 +35,38 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#import "FLEXNetworkObserver.h" #import "SKFLEXNetworkObserver.h"
#import <objc/message.h> #import <objc/message.h>
#import <objc/runtime.h> #import <objc/runtime.h>
#import <dispatch/queue.h> #import <dispatch/queue.h>
#import "FLEXNetworkRecorder.h" #import "SKFLEXNetworkRecorder.h"
#import "FLEXUtility.h" #import "SKFLEXUtility.h"
NSString* const kFLEXNetworkObserverEnabledStateChangedNotification = NSString* const kSKFLEXNetworkObserverEnabledStateChangedNotification =
@"kFLEXNetworkObserverEnabledStateChangedNotification"; @"kSKFLEXNetworkObserverEnabledStateChangedNotification";
static NSString* const kFLEXNetworkObserverEnabledDefaultsKey = static NSString* const kSKFLEXNetworkObserverEnabledDefaultsKey =
@"com.flex.FLEXNetworkObserver.enableOnLaunch"; @"com.skflex.SKFLEXNetworkObserver.enableOnLaunch";
typedef void (^NSURLSessionAsyncCompletion)( typedef void (^NSURLSessionAsyncCompletion)(
id fileURLOrData, id fileURLOrData,
NSURLResponse* response, NSURLResponse* response,
NSError* error); NSError* error);
@interface FLEXInternalRequestState : NSObject @interface SKFLEXInternalRequestState : NSObject
@property(nonatomic, copy) NSURLRequest* request; @property(nonatomic, copy) NSURLRequest* request;
@property(nonatomic, strong) NSMutableData* dataAccumulator; @property(nonatomic, strong) NSMutableData* dataAccumulator;
@end @end
@implementation FLEXInternalRequestState @implementation SKFLEXInternalRequestState
@end @end
@interface FLEXNetworkObserver (NSURLConnectionHelpers) @interface SKFLEXNetworkObserver (NSURLConnectionHelpers)
- (void)connection:(NSURLConnection*)connection - (void)connection:(NSURLConnection*)connection
willSendRequest:(NSURLRequest*)request willSendRequest:(NSURLRequest*)request
@@ -90,7 +90,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
@end @end
@interface FLEXNetworkObserver (NSURLSessionTaskHelpers) @interface SKFLEXNetworkObserver (NSURLSessionTaskHelpers)
- (void)URLSession:(NSURLSession*)session - (void)URLSession:(NSURLSession*)session
task:(NSURLSessionTask*)task task:(NSURLSessionTask*)task
@@ -132,16 +132,16 @@ typedef void (^NSURLSessionAsyncCompletion)(
@end @end
@interface FLEXNetworkObserver () @interface SKFLEXNetworkObserver ()
@property(nonatomic, strong) @property(nonatomic, strong)
NSMutableDictionary<NSString*, FLEXInternalRequestState*>* NSMutableDictionary<NSString*, SKFLEXInternalRequestState*>*
requestStatesForRequestIDs; requestStatesForRequestIDs;
@property(nonatomic, strong) dispatch_queue_t queue; @property(nonatomic, strong) dispatch_queue_t queue;
@end @end
@implementation FLEXNetworkObserver @implementation SKFLEXNetworkObserver
#pragma mark - Public Methods #pragma mark - Public Methods
@@ -152,7 +152,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
#pragma mark - Statics #pragma mark - Statics
+ (instancetype)sharedObserver { + (instancetype)sharedObserver {
static FLEXNetworkObserver* sharedObserver = nil; static SKFLEXNetworkObserver* sharedObserver = nil;
static dispatch_once_t onceToken; static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
sharedObserver = [[[self class] alloc] init]; sharedObserver = [[[self class] alloc] init];
@@ -237,7 +237,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
for (NSInteger classIndex = 0; classIndex < numClasses; ++classIndex) { for (NSInteger classIndex = 0; classIndex < numClasses; ++classIndex) {
Class className = classes[classIndex]; Class className = classes[classIndex];
if (className == [FLEXNetworkObserver class]) { if (className == [SKFLEXNetworkObserver class]) {
continue; continue;
} }
@@ -309,11 +309,11 @@ typedef void (^NSURLSessionAsyncCompletion)(
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
Class className = [NSURLConnection class]; Class className = [NSURLConnection class];
SEL selector = @selector(cancel); SEL selector = @selector(cancel);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Method originalCancel = class_getInstanceMethod(className, selector); Method originalCancel = class_getInstanceMethod(className, selector);
void (^swizzleBlock)(NSURLConnection*) = ^(NSURLConnection* slf) { void (^swizzleBlock)(NSURLConnection*) = ^(NSURLConnection* slf) {
[[FLEXNetworkObserver sharedObserver] connectionWillCancel:slf]; [[SKFLEXNetworkObserver sharedObserver] connectionWillCancel:slf];
((void (*)(id, SEL))objc_msgSend)(slf, swizzledSelector); ((void (*)(id, SEL))objc_msgSend)(slf, swizzledSelector);
}; };
@@ -349,7 +349,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
} }
SEL selector = @selector(resume); SEL selector = @selector(resume);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Method originalResume = class_getInstanceMethod(className, selector); Method originalResume = class_getInstanceMethod(className, selector);
@@ -362,7 +362,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
// request won't trigger a race to finalize the parser. // request won't trigger a race to finalize the parser.
[slf.currentRequest HTTPBody]; [slf.currentRequest HTTPBody];
[[FLEXNetworkObserver sharedObserver] URLSessionTaskWillResume:slf]; [[SKFLEXNetworkObserver sharedObserver] URLSessionTaskWillResume:slf];
((void (*)(id, SEL))objc_msgSend)(slf, swizzledSelector); ((void (*)(id, SEL))objc_msgSend)(slf, swizzledSelector);
}; };
@@ -382,7 +382,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
Class className = objc_getMetaClass(class_getName([NSURLConnection class])); Class className = objc_getMetaClass(class_getName([NSURLConnection class]));
SEL selector = @selector(sendAsynchronousRequest:queue:completionHandler:); SEL selector = @selector(sendAsynchronousRequest:queue:completionHandler:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
typedef void (^NSURLConnectionAsyncCompletion)( typedef void (^NSURLConnectionAsyncCompletion)(
NSURLResponse* response, NSData* data, NSError* connectionError); NSURLResponse* response, NSData* data, NSError* connectionError);
@@ -397,28 +397,28 @@ typedef void (^NSURLSessionAsyncCompletion)(
NSOperationQueue* queue, NSOperationQueue* queue,
NSURLConnectionAsyncCompletion completion) { NSURLConnectionAsyncCompletion completion) {
NSString* requestID = [self nextRequestID]; NSString* requestID = [self nextRequestID];
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordRequestWillBeSentWithRequestID:requestID recordRequestWillBeSentWithRequestID:requestID
request:request request:request
redirectResponse:nil]; redirectResponse:nil];
NSString* mechanism = [self mechanismFromClassMethod:selector NSString* mechanism = [self mechanismFromClassMethod:selector
onClass:className]; onClass:className];
[[FLEXNetworkRecorder defaultRecorder] recordMechanism:mechanism [[SKFLEXNetworkRecorder defaultRecorder] recordMechanism:mechanism
forRequestID:requestID]; forRequestID:requestID];
NSURLConnectionAsyncCompletion completionWrapper = ^( NSURLConnectionAsyncCompletion completionWrapper = ^(
NSURLResponse* response, NSData* data, NSError* connectionError) { NSURLResponse* response, NSData* data, NSError* connectionError) {
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordResponseReceivedWithRequestID:requestID recordResponseReceivedWithRequestID:requestID
response:response]; response:response];
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordDataReceivedWithRequestID:requestID recordDataReceivedWithRequestID:requestID
dataLength:[data length]]; dataLength:[data length]];
if (connectionError) { if (connectionError) {
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordLoadingFailedWithRequestID:requestID recordLoadingFailedWithRequestID:requestID
error:connectionError]; error:connectionError];
} else { } else {
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordLoadingFinishedWithRequestID:requestID recordLoadingFinishedWithRequestID:requestID
responseBody:data]; responseBody:data];
} }
@@ -432,7 +432,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
slf, swizzledSelector, request, queue, completionWrapper); slf, swizzledSelector, request, queue, completionWrapper);
}; };
[FLEXUtility replaceImplementationOfKnownSelector:selector [SKFLEXUtility replaceImplementationOfKnownSelector:selector
onClass:className onClass:className
withBlock:asyncSwizzleBlock withBlock:asyncSwizzleBlock
swizzledSelector:swizzledSelector]; swizzledSelector:swizzledSelector];
@@ -444,7 +444,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
Class className = objc_getMetaClass(class_getName([NSURLConnection class])); Class className = objc_getMetaClass(class_getName([NSURLConnection class]));
SEL selector = @selector(sendSynchronousRequest:returningResponse:error:); SEL selector = @selector(sendSynchronousRequest:returningResponse:error:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
NSData* ( NSData* (
^syncSwizzleBlock)(Class, NSURLRequest*, NSURLResponse**, NSError**) = ^syncSwizzleBlock)(Class, NSURLRequest*, NSURLResponse**, NSError**) =
@@ -455,31 +455,31 @@ typedef void (^NSURLSessionAsyncCompletion)(
NSError** error) { NSError** error) {
NSData* data = nil; NSData* data = nil;
NSString* requestID = [self nextRequestID]; NSString* requestID = [self nextRequestID];
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordRequestWillBeSentWithRequestID:requestID recordRequestWillBeSentWithRequestID:requestID
request:request request:request
redirectResponse:nil]; redirectResponse:nil];
NSString* mechanism = [self mechanismFromClassMethod:selector NSString* mechanism = [self mechanismFromClassMethod:selector
onClass:className]; onClass:className];
[[FLEXNetworkRecorder defaultRecorder] recordMechanism:mechanism [[SKFLEXNetworkRecorder defaultRecorder] recordMechanism:mechanism
forRequestID:requestID]; forRequestID:requestID];
NSError* temporaryError = nil; NSError* temporaryError = nil;
NSURLResponse* temporaryResponse = nil; NSURLResponse* temporaryResponse = nil;
data = data =
((id(*)(id, SEL, id, NSURLResponse**, NSError**)) ((id(*)(id, SEL, id, NSURLResponse**, NSError**))
objc_msgSend)(slf, swizzledSelector, request, &temporaryResponse, &temporaryError); objc_msgSend)(slf, swizzledSelector, request, &temporaryResponse, &temporaryError);
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordResponseReceivedWithRequestID:requestID recordResponseReceivedWithRequestID:requestID
response:temporaryResponse]; response:temporaryResponse];
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordDataReceivedWithRequestID:requestID recordDataReceivedWithRequestID:requestID
dataLength:[data length]]; dataLength:[data length]];
if (temporaryError) { if (temporaryError) {
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordLoadingFailedWithRequestID:requestID recordLoadingFailedWithRequestID:requestID
error:temporaryError]; error:temporaryError];
} else { } else {
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordLoadingFinishedWithRequestID:requestID recordLoadingFinishedWithRequestID:requestID
responseBody:data]; responseBody:data];
} }
@@ -492,7 +492,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
return data; return data;
}; };
[FLEXUtility replaceImplementationOfKnownSelector:selector [SKFLEXUtility replaceImplementationOfKnownSelector:selector
onClass:className onClass:className
withBlock:syncSwizzleBlock withBlock:syncSwizzleBlock
swizzledSelector:swizzledSelector]; swizzledSelector:swizzledSelector];
@@ -518,9 +518,11 @@ typedef void (^NSURLSessionAsyncCompletion)(
for (int selectorIndex = 0; selectorIndex < numSelectors; selectorIndex++) { for (int selectorIndex = 0; selectorIndex < numSelectors; selectorIndex++) {
SEL selector = selectors[selectorIndex]; SEL selector = selectors[selectorIndex];
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector =
[SKFLEXUtility swizzledSelectorForSelector:selector];
if ([FLEXUtility instanceRespondsButDoesNotImplementSelector:selector if ([SKFLEXUtility
instanceRespondsButDoesNotImplementSelector:selector
class:className]) { class:className]) {
// iOS 7 does not implement these methods on NSURLSession. We actually // iOS 7 does not implement these methods on NSURLSession. We actually
// want to swizzle __NSCFURLSession, which we can get from the class of // want to swizzle __NSCFURLSession, which we can get from the class of
@@ -559,7 +561,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
return task; return task;
}; };
[FLEXUtility [SKFLEXUtility
replaceImplementationOfKnownSelector:selector replaceImplementationOfKnownSelector:selector
onClass:className onClass:className
withBlock:asyncDataOrDownloadSwizzleBlock withBlock:asyncDataOrDownloadSwizzleBlock
@@ -585,9 +587,11 @@ typedef void (^NSURLSessionAsyncCompletion)(
for (int selectorIndex = 0; selectorIndex < numSelectors; selectorIndex++) { for (int selectorIndex = 0; selectorIndex < numSelectors; selectorIndex++) {
SEL selector = selectors[selectorIndex]; SEL selector = selectors[selectorIndex];
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector =
[SKFLEXUtility swizzledSelectorForSelector:selector];
if ([FLEXUtility instanceRespondsButDoesNotImplementSelector:selector if ([SKFLEXUtility
instanceRespondsButDoesNotImplementSelector:selector
class:className]) { class:className]) {
// iOS 7 does not implement these methods on NSURLSession. We actually // iOS 7 does not implement these methods on NSURLSession. We actually
// want to swizzle __NSCFURLSession, which we can get from the class of // want to swizzle __NSCFURLSession, which we can get from the class of
@@ -629,7 +633,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
return task; return task;
}; };
[FLEXUtility [SKFLEXUtility
replaceImplementationOfKnownSelector:selector replaceImplementationOfKnownSelector:selector
onClass:className onClass:className
withBlock:asyncUploadTaskSwizzleBlock withBlock:asyncUploadTaskSwizzleBlock
@@ -650,9 +654,9 @@ typedef void (^NSURLSessionAsyncCompletion)(
completion:(NSURLSessionAsyncCompletion)completion { completion:(NSURLSessionAsyncCompletion)completion {
NSURLSessionAsyncCompletion completionWrapper = NSURLSessionAsyncCompletion completionWrapper =
^(id fileURLOrData, NSURLResponse* response, NSError* error) { ^(id fileURLOrData, NSURLResponse* response, NSError* error) {
[[FLEXNetworkRecorder defaultRecorder] recordMechanism:mechanism [[SKFLEXNetworkRecorder defaultRecorder] recordMechanism:mechanism
forRequestID:requestID]; forRequestID:requestID];
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordResponseReceivedWithRequestID:requestID recordResponseReceivedWithRequestID:requestID
response:response]; response:response];
NSData* data = nil; NSData* data = nil;
@@ -661,15 +665,15 @@ typedef void (^NSURLSessionAsyncCompletion)(
} else if ([fileURLOrData isKindOfClass:[NSData class]]) { } else if ([fileURLOrData isKindOfClass:[NSData class]]) {
data = fileURLOrData; data = fileURLOrData;
} }
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordDataReceivedWithRequestID:requestID recordDataReceivedWithRequestID:requestID
dataLength:[data length]]; dataLength:[data length]];
if (error) { if (error) {
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordLoadingFailedWithRequestID:requestID recordLoadingFailedWithRequestID:requestID
error:error]; error:error];
} else { } else {
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordLoadingFinishedWithRequestID:requestID recordLoadingFinishedWithRequestID:requestID
responseBody:data]; responseBody:data];
} }
@@ -684,7 +688,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
+ (void)injectWillSendRequestIntoDelegateClass:(Class)cls { + (void)injectWillSendRequestIntoDelegateClass:(Class)cls {
SEL selector = @selector(connection:willSendRequest:redirectResponse:); SEL selector = @selector(connection:willSendRequest:redirectResponse:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Protocol* protocol = @protocol(NSURLConnectionDataDelegate); Protocol* protocol = @protocol(NSURLConnectionDataDelegate);
if (!protocol) { if (!protocol) {
@@ -702,7 +706,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
NSURLConnection* connection, NSURLConnection* connection,
NSURLRequest* request, NSURLRequest* request,
NSURLResponse* response) { NSURLResponse* response) {
[[FLEXNetworkObserver sharedObserver] connection:connection [[SKFLEXNetworkObserver sharedObserver] connection:connection
willSendRequest:request willSendRequest:request
redirectResponse:response redirectResponse:response
delegate:slf]; delegate:slf];
@@ -731,7 +735,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
return returnValue; return returnValue;
}; };
[FLEXUtility replaceImplementationOfSelector:selector [SKFLEXUtility replaceImplementationOfSelector:selector
withSelector:swizzledSelector withSelector:swizzledSelector
forClass:cls forClass:cls
withMethodDescription:methodDescription withMethodDescription:methodDescription
@@ -741,7 +745,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
+ (void)injectDidReceiveResponseIntoDelegateClass:(Class)cls { + (void)injectDidReceiveResponseIntoDelegateClass:(Class)cls {
SEL selector = @selector(connection:didReceiveResponse:); SEL selector = @selector(connection:didReceiveResponse:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Protocol* protocol = @protocol(NSURLConnectionDataDelegate); Protocol* protocol = @protocol(NSURLConnectionDataDelegate);
if (!protocol) { if (!protocol) {
@@ -760,7 +764,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
^(id<NSURLConnectionDelegate> slf, ^(id<NSURLConnectionDelegate> slf,
NSURLConnection* connection, NSURLConnection* connection,
NSURLResponse* response) { NSURLResponse* response) {
[[FLEXNetworkObserver sharedObserver] connection:connection [[SKFLEXNetworkObserver sharedObserver] connection:connection
didReceiveResponse:response didReceiveResponse:response
delegate:slf]; delegate:slf];
}; };
@@ -780,7 +784,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
}]; }];
}; };
[FLEXUtility replaceImplementationOfSelector:selector [SKFLEXUtility replaceImplementationOfSelector:selector
withSelector:swizzledSelector withSelector:swizzledSelector
forClass:cls forClass:cls
withMethodDescription:methodDescription withMethodDescription:methodDescription
@@ -790,7 +794,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
+ (void)injectDidReceiveDataIntoDelegateClass:(Class)cls { + (void)injectDidReceiveDataIntoDelegateClass:(Class)cls {
SEL selector = @selector(connection:didReceiveData:); SEL selector = @selector(connection:didReceiveData:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Protocol* protocol = @protocol(NSURLConnectionDataDelegate); Protocol* protocol = @protocol(NSURLConnectionDataDelegate);
if (!protocol) { if (!protocol) {
@@ -809,7 +813,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
^(id<NSURLConnectionDelegate> slf, ^(id<NSURLConnectionDelegate> slf,
NSURLConnection* connection, NSURLConnection* connection,
NSData* data) { NSData* data) {
[[FLEXNetworkObserver sharedObserver] connection:connection [[SKFLEXNetworkObserver sharedObserver] connection:connection
didReceiveData:data didReceiveData:data
delegate:slf]; delegate:slf];
}; };
@@ -829,7 +833,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
}]; }];
}; };
[FLEXUtility replaceImplementationOfSelector:selector [SKFLEXUtility replaceImplementationOfSelector:selector
withSelector:swizzledSelector withSelector:swizzledSelector
forClass:cls forClass:cls
withMethodDescription:methodDescription withMethodDescription:methodDescription
@@ -839,7 +843,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
+ (void)injectDidFinishLoadingIntoDelegateClass:(Class)cls { + (void)injectDidFinishLoadingIntoDelegateClass:(Class)cls {
SEL selector = @selector(connectionDidFinishLoading:); SEL selector = @selector(connectionDidFinishLoading:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Protocol* protocol = @protocol(NSURLConnectionDataDelegate); Protocol* protocol = @protocol(NSURLConnectionDataDelegate);
if (!protocol) { if (!protocol) {
@@ -852,9 +856,10 @@ typedef void (^NSURLSessionAsyncCompletion)(
typedef void (^NSURLConnectionDidFinishLoadingBlock)( typedef void (^NSURLConnectionDidFinishLoadingBlock)(
id<NSURLConnectionDelegate> slf, NSURLConnection* connection); id<NSURLConnectionDelegate> slf, NSURLConnection* connection);
NSURLConnectionDidFinishLoadingBlock undefinedBlock = ^( NSURLConnectionDidFinishLoadingBlock undefinedBlock =
id<NSURLConnectionDelegate> slf, NSURLConnection* connection) { ^(id<NSURLConnectionDelegate> slf, NSURLConnection* connection) {
[[FLEXNetworkObserver sharedObserver] connectionDidFinishLoading:connection [[SKFLEXNetworkObserver sharedObserver]
connectionDidFinishLoading:connection
delegate:slf]; delegate:slf];
}; };
@@ -871,7 +876,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
}]; }];
}; };
[FLEXUtility replaceImplementationOfSelector:selector [SKFLEXUtility replaceImplementationOfSelector:selector
withSelector:swizzledSelector withSelector:swizzledSelector
forClass:cls forClass:cls
withMethodDescription:methodDescription withMethodDescription:methodDescription
@@ -881,7 +886,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
+ (void)injectDidFailWithErrorIntoDelegateClass:(Class)cls { + (void)injectDidFailWithErrorIntoDelegateClass:(Class)cls {
SEL selector = @selector(connection:didFailWithError:); SEL selector = @selector(connection:didFailWithError:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Protocol* protocol = @protocol(NSURLConnectionDelegate); Protocol* protocol = @protocol(NSURLConnectionDelegate);
struct objc_method_description methodDescription = struct objc_method_description methodDescription =
@@ -896,7 +901,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
^(id<NSURLConnectionDelegate> slf, ^(id<NSURLConnectionDelegate> slf,
NSURLConnection* connection, NSURLConnection* connection,
NSError* error) { NSError* error) {
[[FLEXNetworkObserver sharedObserver] connection:connection [[SKFLEXNetworkObserver sharedObserver] connection:connection
didFailWithError:error didFailWithError:error
delegate:slf]; delegate:slf];
}; };
@@ -916,7 +921,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
}]; }];
}; };
[FLEXUtility replaceImplementationOfSelector:selector [SKFLEXUtility replaceImplementationOfSelector:selector
withSelector:swizzledSelector withSelector:swizzledSelector
forClass:cls forClass:cls
withMethodDescription:methodDescription withMethodDescription:methodDescription
@@ -928,7 +933,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
SEL selector = @selector SEL selector = @selector
(URLSession: (URLSession:
task:willPerformHTTPRedirection:newRequest:completionHandler:); task:willPerformHTTPRedirection:newRequest:completionHandler:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Protocol* protocol = @protocol(NSURLSessionTaskDelegate); Protocol* protocol = @protocol(NSURLSessionTaskDelegate);
@@ -950,7 +955,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
NSHTTPURLResponse* response, NSHTTPURLResponse* response,
NSURLRequest* newRequest, NSURLRequest* newRequest,
void (^completionHandler)(NSURLRequest*)) { void (^completionHandler)(NSURLRequest*)) {
[[FLEXNetworkObserver sharedObserver] URLSession:session [[SKFLEXNetworkObserver sharedObserver] URLSession:session
task:task task:task
willPerformHTTPRedirection:response willPerformHTTPRedirection:response
newRequest:newRequest newRequest:newRequest
@@ -969,7 +974,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
[self sniffWithoutDuplicationForObject:session [self sniffWithoutDuplicationForObject:session
selector:selector selector:selector
sniffingBlock:^{ sniffingBlock:^{
[[FLEXNetworkObserver sharedObserver] URLSession:session [[SKFLEXNetworkObserver sharedObserver] URLSession:session
task:task task:task
willPerformHTTPRedirection:response willPerformHTTPRedirection:response
newRequest:newRequest newRequest:newRequest
@@ -989,7 +994,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
}]; }];
}; };
[FLEXUtility replaceImplementationOfSelector:selector [SKFLEXUtility replaceImplementationOfSelector:selector
withSelector:swizzledSelector withSelector:swizzledSelector
forClass:cls forClass:cls
withMethodDescription:methodDescription withMethodDescription:methodDescription
@@ -999,7 +1004,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
+ (void)injectTaskDidReceiveDataIntoDelegateClass:(Class)cls { + (void)injectTaskDidReceiveDataIntoDelegateClass:(Class)cls {
SEL selector = @selector(URLSession:dataTask:didReceiveData:); SEL selector = @selector(URLSession:dataTask:didReceiveData:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Protocol* protocol = @protocol(NSURLSessionDataDelegate); Protocol* protocol = @protocol(NSURLSessionDataDelegate);
@@ -1017,7 +1022,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
NSURLSession* session, NSURLSession* session,
NSURLSessionDataTask* dataTask, NSURLSessionDataTask* dataTask,
NSData* data) { NSData* data) {
[[FLEXNetworkObserver sharedObserver] URLSession:session [[SKFLEXNetworkObserver sharedObserver] URLSession:session
dataTask:dataTask dataTask:dataTask
didReceiveData:data didReceiveData:data
delegate:slf]; delegate:slf];
@@ -1039,7 +1044,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
}]; }];
}; };
[FLEXUtility replaceImplementationOfSelector:selector [SKFLEXUtility replaceImplementationOfSelector:selector
withSelector:swizzledSelector withSelector:swizzledSelector
forClass:cls forClass:cls
withMethodDescription:methodDescription withMethodDescription:methodDescription
@@ -1049,7 +1054,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
+ (void)injectDataTaskDidBecomeDownloadTaskIntoDelegateClass:(Class)cls { + (void)injectDataTaskDidBecomeDownloadTaskIntoDelegateClass:(Class)cls {
SEL selector = @selector(URLSession:dataTask:didBecomeDownloadTask:); SEL selector = @selector(URLSession:dataTask:didBecomeDownloadTask:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Protocol* protocol = @protocol(NSURLSessionDataDelegate); Protocol* protocol = @protocol(NSURLSessionDataDelegate);
@@ -1067,7 +1072,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
NSURLSession* session, NSURLSession* session,
NSURLSessionDataTask* dataTask, NSURLSessionDataTask* dataTask,
NSURLSessionDownloadTask* downloadTask) { NSURLSessionDownloadTask* downloadTask) {
[[FLEXNetworkObserver sharedObserver] URLSession:session [[SKFLEXNetworkObserver sharedObserver] URLSession:session
dataTask:dataTask dataTask:dataTask
didBecomeDownloadTask:downloadTask didBecomeDownloadTask:downloadTask
delegate:slf]; delegate:slf];
@@ -1089,7 +1094,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
}]; }];
}; };
[FLEXUtility replaceImplementationOfSelector:selector [SKFLEXUtility replaceImplementationOfSelector:selector
withSelector:swizzledSelector withSelector:swizzledSelector
forClass:cls forClass:cls
withMethodDescription:methodDescription withMethodDescription:methodDescription
@@ -1100,7 +1105,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
+ (void)injectTaskDidReceiveResponseIntoDelegateClass:(Class)cls { + (void)injectTaskDidReceiveResponseIntoDelegateClass:(Class)cls {
SEL selector = @selector(URLSession: SEL selector = @selector(URLSession:
dataTask:didReceiveResponse:completionHandler:); dataTask:didReceiveResponse:completionHandler:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Protocol* protocol = @protocol(NSURLSessionDataDelegate); Protocol* protocol = @protocol(NSURLSessionDataDelegate);
@@ -1120,7 +1125,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
NSURLSessionDataTask* dataTask, NSURLSessionDataTask* dataTask,
NSURLResponse* response, NSURLResponse* response,
void (^completionHandler)(NSURLSessionResponseDisposition disposition)) { void (^completionHandler)(NSURLSessionResponseDisposition disposition)) {
[[FLEXNetworkObserver sharedObserver] URLSession:session [[SKFLEXNetworkObserver sharedObserver] URLSession:session
dataTask:dataTask dataTask:dataTask
didReceiveResponse:response didReceiveResponse:response
completionHandler:completionHandler completionHandler:completionHandler
@@ -1137,7 +1142,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
[self sniffWithoutDuplicationForObject:session [self sniffWithoutDuplicationForObject:session
selector:selector selector:selector
sniffingBlock:^{ sniffingBlock:^{
[[FLEXNetworkObserver sharedObserver] URLSession:session [[SKFLEXNetworkObserver sharedObserver] URLSession:session
dataTask:dataTask dataTask:dataTask
didReceiveResponse:response didReceiveResponse:response
completionHandler:completionHandler completionHandler:completionHandler
@@ -1156,7 +1161,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
}]; }];
}; };
[FLEXUtility replaceImplementationOfSelector:selector [SKFLEXUtility replaceImplementationOfSelector:selector
withSelector:swizzledSelector withSelector:swizzledSelector
forClass:cls forClass:cls
withMethodDescription:methodDescription withMethodDescription:methodDescription
@@ -1166,7 +1171,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
+ (void)injectTaskDidCompleteWithErrorIntoDelegateClass:(Class)cls { + (void)injectTaskDidCompleteWithErrorIntoDelegateClass:(Class)cls {
SEL selector = @selector(URLSession:task:didCompleteWithError:); SEL selector = @selector(URLSession:task:didCompleteWithError:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Protocol* protocol = @protocol(NSURLSessionTaskDelegate); Protocol* protocol = @protocol(NSURLSessionTaskDelegate);
struct objc_method_description methodDescription = struct objc_method_description methodDescription =
@@ -1183,7 +1188,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
NSURLSession* session, NSURLSession* session,
NSURLSessionTask* task, NSURLSessionTask* task,
NSError* error) { NSError* error) {
[[FLEXNetworkObserver sharedObserver] URLSession:session [[SKFLEXNetworkObserver sharedObserver] URLSession:session
task:task task:task
didCompleteWithError:error didCompleteWithError:error
delegate:slf]; delegate:slf];
@@ -1205,7 +1210,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
}]; }];
}; };
[FLEXUtility replaceImplementationOfSelector:selector [SKFLEXUtility replaceImplementationOfSelector:selector
withSelector:swizzledSelector withSelector:swizzledSelector
forClass:cls forClass:cls
withMethodDescription:methodDescription withMethodDescription:methodDescription
@@ -1216,7 +1221,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
// Used for overriding AFNetworking behavior // Used for overriding AFNetworking behavior
+ (void)injectRespondsToSelectorIntoDelegateClass:(Class)cls { + (void)injectRespondsToSelectorIntoDelegateClass:(Class)cls {
SEL selector = @selector(respondsToSelector:); SEL selector = @selector(respondsToSelector:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
// Protocol *protocol = @protocol(NSURLSessionTaskDelegate); // Protocol *protocol = @protocol(NSURLSessionTaskDelegate);
Method method = class_getInstanceMethod(cls, selector); Method method = class_getInstanceMethod(cls, selector);
@@ -1237,7 +1242,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
return ((BOOL(*)(id, SEL, SEL))objc_msgSend)(slf, swizzledSelector, sel); return ((BOOL(*)(id, SEL, SEL))objc_msgSend)(slf, swizzledSelector, sel);
}; };
[FLEXUtility replaceImplementationOfSelector:selector [SKFLEXUtility replaceImplementationOfSelector:selector
withSelector:swizzledSelector withSelector:swizzledSelector
forClass:cls forClass:cls
withMethodDescription:methodDescription withMethodDescription:methodDescription
@@ -1247,7 +1252,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
+ (void)injectDownloadTaskDidFinishDownloadingIntoDelegateClass:(Class)cls { + (void)injectDownloadTaskDidFinishDownloadingIntoDelegateClass:(Class)cls {
SEL selector = @selector(URLSession:downloadTask:didFinishDownloadingToURL:); SEL selector = @selector(URLSession:downloadTask:didFinishDownloadingToURL:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Protocol* protocol = @protocol(NSURLSessionDownloadDelegate); Protocol* protocol = @protocol(NSURLSessionDownloadDelegate);
struct objc_method_description methodDescription = struct objc_method_description methodDescription =
@@ -1265,7 +1270,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
NSURLSessionDownloadTask* task, NSURLSessionDownloadTask* task,
NSURL* location) { NSURL* location) {
NSData* data = [NSData dataWithContentsOfFile:location.relativePath]; NSData* data = [NSData dataWithContentsOfFile:location.relativePath];
[[FLEXNetworkObserver sharedObserver] URLSession:session [[SKFLEXNetworkObserver sharedObserver] URLSession:session
task:task task:task
didFinishDownloadingToURL:location didFinishDownloadingToURL:location
data:data data:data
@@ -1288,7 +1293,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
}]; }];
}; };
[FLEXUtility replaceImplementationOfSelector:selector [SKFLEXUtility replaceImplementationOfSelector:selector
withSelector:swizzledSelector withSelector:swizzledSelector
forClass:cls forClass:cls
withMethodDescription:methodDescription withMethodDescription:methodDescription
@@ -1300,7 +1305,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
SEL selector = @selector( SEL selector = @selector(
URLSession: URLSession:
downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:); downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:);
SEL swizzledSelector = [FLEXUtility swizzledSelectorForSelector:selector]; SEL swizzledSelector = [SKFLEXUtility swizzledSelectorForSelector:selector];
Protocol* protocol = @protocol(NSURLSessionDownloadDelegate); Protocol* protocol = @protocol(NSURLSessionDownloadDelegate);
struct objc_method_description methodDescription = struct objc_method_description methodDescription =
@@ -1321,7 +1326,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
int64_t bytesWritten, int64_t bytesWritten,
int64_t totalBytesWritten, int64_t totalBytesWritten,
int64_t totalBytesExpectedToWrite) { int64_t totalBytesExpectedToWrite) {
[[FLEXNetworkObserver sharedObserver] URLSession:session [[SKFLEXNetworkObserver sharedObserver] URLSession:session
downloadTask:task downloadTask:task
didWriteData:bytesWritten didWriteData:bytesWritten
totalBytesWritten:totalBytesWritten totalBytesWritten:totalBytesWritten
@@ -1359,7 +1364,7 @@ typedef void (^NSURLSessionAsyncCompletion)(
}]; }];
}; };
[FLEXUtility replaceImplementationOfSelector:selector [SKFLEXUtility replaceImplementationOfSelector:selector
withSelector:swizzledSelector withSelector:swizzledSelector
forClass:cls forClass:cls
withMethodDescription:methodDescription withMethodDescription:methodDescription
@@ -1367,11 +1372,11 @@ typedef void (^NSURLSessionAsyncCompletion)(
undefinedBlock:undefinedBlock]; undefinedBlock:undefinedBlock];
} }
static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey"; static char const* const kSKFLEXRequestIDKey = "kSKFLEXRequestIDKey";
+ (NSString*)requestIDForConnectionOrTask:(id)connectionOrTask { + (NSString*)requestIDForConnectionOrTask:(id)connectionOrTask {
NSString* requestID = NSString* requestID =
objc_getAssociatedObject(connectionOrTask, kFLEXRequestIDKey); objc_getAssociatedObject(connectionOrTask, kSKFLEXRequestIDKey);
if (!requestID) { if (!requestID) {
requestID = [self nextRequestID]; requestID = [self nextRequestID];
[self setRequestID:requestID forConnectionOrTask:connectionOrTask]; [self setRequestID:requestID forConnectionOrTask:connectionOrTask];
@@ -1384,7 +1389,7 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
if (connectionOrTask) { if (connectionOrTask) {
objc_setAssociatedObject( objc_setAssociatedObject(
connectionOrTask, connectionOrTask,
kFLEXRequestIDKey, kSKFLEXRequestIDKey,
requestID, requestID,
OBJC_ASSOCIATION_RETAIN_NONATOMIC); OBJC_ASSOCIATION_RETAIN_NONATOMIC);
} }
@@ -1397,7 +1402,7 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
if (self) { if (self) {
self.requestStatesForRequestIDs = [NSMutableDictionary new]; self.requestStatesForRequestIDs = [NSMutableDictionary new];
self.queue = dispatch_queue_create( self.queue = dispatch_queue_create(
"com.flex.FLEXNetworkObserver", DISPATCH_QUEUE_SERIAL); "com.skflex.SKFLEXNetworkObserver", DISPATCH_QUEUE_SERIAL);
} }
return self; return self;
} }
@@ -1408,11 +1413,11 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
dispatch_async(_queue, block); dispatch_async(_queue, block);
} }
- (FLEXInternalRequestState*)requestStateForRequestID:(NSString*)requestID { - (SKFLEXInternalRequestState*)requestStateForRequestID:(NSString*)requestID {
FLEXInternalRequestState* requestState = SKFLEXInternalRequestState* requestState =
self.requestStatesForRequestIDs[requestID]; self.requestStatesForRequestIDs[requestID];
if (!requestState) { if (!requestState) {
requestState = [FLEXInternalRequestState new]; requestState = [SKFLEXInternalRequestState new];
[self.requestStatesForRequestIDs setObject:requestState forKey:requestID]; [self.requestStatesForRequestIDs setObject:requestState forKey:requestID];
} }
return requestState; return requestState;
@@ -1424,7 +1429,7 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
@end @end
@implementation FLEXNetworkObserver (NSURLConnectionHelpers) @implementation SKFLEXNetworkObserver (NSURLConnectionHelpers)
- (void)connection:(NSURLConnection*)connection - (void)connection:(NSURLConnection*)connection
willSendRequest:(NSURLRequest*)request willSendRequest:(NSURLRequest*)request
@@ -1433,16 +1438,16 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
[self performBlock:^{ [self performBlock:^{
NSString* requestID = NSString* requestID =
[[self class] requestIDForConnectionOrTask:connection]; [[self class] requestIDForConnectionOrTask:connection];
FLEXInternalRequestState* requestState = SKFLEXInternalRequestState* requestState =
[self requestStateForRequestID:requestID]; [self requestStateForRequestID:requestID];
requestState.request = request; requestState.request = request;
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordRequestWillBeSentWithRequestID:requestID recordRequestWillBeSentWithRequestID:requestID
request:request request:request
redirectResponse:response]; redirectResponse:response];
NSString* mechanism = [NSString NSString* mechanism = [NSString
stringWithFormat:@"NSURLConnection (delegate: %@)", [delegate class]]; stringWithFormat:@"NSURLConnection (delegate: %@)", [delegate class]];
[[FLEXNetworkRecorder defaultRecorder] recordMechanism:mechanism [[SKFLEXNetworkRecorder defaultRecorder] recordMechanism:mechanism
forRequestID:requestID]; forRequestID:requestID];
}]; }];
} }
@@ -1453,7 +1458,7 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
[self performBlock:^{ [self performBlock:^{
NSString* requestID = NSString* requestID =
[[self class] requestIDForConnectionOrTask:connection]; [[self class] requestIDForConnectionOrTask:connection];
FLEXInternalRequestState* requestState = SKFLEXInternalRequestState* requestState =
[self requestStateForRequestID:requestID]; [self requestStateForRequestID:requestID];
NSMutableData* dataAccumulator = nil; NSMutableData* dataAccumulator = nil;
@@ -1465,7 +1470,7 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
} }
requestState.dataAccumulator = dataAccumulator; requestState.dataAccumulator = dataAccumulator;
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordResponseReceivedWithRequestID:requestID recordResponseReceivedWithRequestID:requestID
response:response]; response:response];
}]; }];
@@ -1479,10 +1484,10 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
[self performBlock:^{ [self performBlock:^{
NSString* requestID = NSString* requestID =
[[self class] requestIDForConnectionOrTask:connection]; [[self class] requestIDForConnectionOrTask:connection];
FLEXInternalRequestState* requestState = SKFLEXInternalRequestState* requestState =
[self requestStateForRequestID:requestID]; [self requestStateForRequestID:requestID];
[requestState.dataAccumulator appendData:data]; [requestState.dataAccumulator appendData:data];
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordDataReceivedWithRequestID:requestID recordDataReceivedWithRequestID:requestID
dataLength:data.length]; dataLength:data.length];
}]; }];
@@ -1493,9 +1498,9 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
[self performBlock:^{ [self performBlock:^{
NSString* requestID = NSString* requestID =
[[self class] requestIDForConnectionOrTask:connection]; [[self class] requestIDForConnectionOrTask:connection];
FLEXInternalRequestState* requestState = SKFLEXInternalRequestState* requestState =
[self requestStateForRequestID:requestID]; [self requestStateForRequestID:requestID];
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordLoadingFinishedWithRequestID:requestID recordLoadingFinishedWithRequestID:requestID
responseBody:requestState.dataAccumulator]; responseBody:requestState.dataAccumulator];
[self removeRequestStateForRequestID:requestID]; [self removeRequestStateForRequestID:requestID];
@@ -1508,7 +1513,7 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
[self performBlock:^{ [self performBlock:^{
NSString* requestID = NSString* requestID =
[[self class] requestIDForConnectionOrTask:connection]; [[self class] requestIDForConnectionOrTask:connection];
FLEXInternalRequestState* requestState = SKFLEXInternalRequestState* requestState =
[self requestStateForRequestID:requestID]; [self requestStateForRequestID:requestID];
// Cancellations can occur prior to the willSendRequest:... NSURLConnection // Cancellations can occur prior to the willSendRequest:... NSURLConnection
@@ -1516,7 +1521,7 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
// record the failure if the recorder already knows about the request // record the failure if the recorder already knows about the request
// through willSendRequest:... // through willSendRequest:...
if (requestState.request) { if (requestState.request) {
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordLoadingFailedWithRequestID:requestID recordLoadingFailedWithRequestID:requestID
error:error]; error:error];
} }
@@ -1540,7 +1545,7 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
@end @end
@implementation FLEXNetworkObserver (NSURLSessionTaskHelpers) @implementation SKFLEXNetworkObserver (NSURLSessionTaskHelpers)
- (void)URLSession:(NSURLSession*)session - (void)URLSession:(NSURLSession*)session
task:(NSURLSessionTask*)task task:(NSURLSessionTask*)task
@@ -1550,7 +1555,7 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
delegate:(id<NSURLSessionDelegate>)delegate { delegate:(id<NSURLSessionDelegate>)delegate {
[self performBlock:^{ [self performBlock:^{
NSString* requestID = [[self class] requestIDForConnectionOrTask:task]; NSString* requestID = [[self class] requestIDForConnectionOrTask:task];
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordRequestWillBeSentWithRequestID:requestID recordRequestWillBeSentWithRequestID:requestID
request:request request:request
redirectResponse:response]; redirectResponse:response];
@@ -1565,7 +1570,7 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
delegate:(id<NSURLSessionDelegate>)delegate { delegate:(id<NSURLSessionDelegate>)delegate {
[self performBlock:^{ [self performBlock:^{
NSString* requestID = [[self class] requestIDForConnectionOrTask:dataTask]; NSString* requestID = [[self class] requestIDForConnectionOrTask:dataTask];
FLEXInternalRequestState* requestState = SKFLEXInternalRequestState* requestState =
[self requestStateForRequestID:requestID]; [self requestStateForRequestID:requestID];
NSMutableData* dataAccumulator = nil; NSMutableData* dataAccumulator = nil;
@@ -1580,10 +1585,10 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
NSString* requestMechanism = NSString* requestMechanism =
[NSString stringWithFormat:@"NSURLSessionDataTask (delegate: %@)", [NSString stringWithFormat:@"NSURLSessionDataTask (delegate: %@)",
[delegate class]]; [delegate class]];
[[FLEXNetworkRecorder defaultRecorder] recordMechanism:requestMechanism [[SKFLEXNetworkRecorder defaultRecorder] recordMechanism:requestMechanism
forRequestID:requestID]; forRequestID:requestID];
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordResponseReceivedWithRequestID:requestID recordResponseReceivedWithRequestID:requestID
response:response]; response:response];
}]; }];
@@ -1609,12 +1614,12 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
data = [data copy]; data = [data copy];
[self performBlock:^{ [self performBlock:^{
NSString* requestID = [[self class] requestIDForConnectionOrTask:dataTask]; NSString* requestID = [[self class] requestIDForConnectionOrTask:dataTask];
FLEXInternalRequestState* requestState = SKFLEXInternalRequestState* requestState =
[self requestStateForRequestID:requestID]; [self requestStateForRequestID:requestID];
[requestState.dataAccumulator appendData:data]; [requestState.dataAccumulator appendData:data];
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordDataReceivedWithRequestID:requestID recordDataReceivedWithRequestID:requestID
dataLength:data.length]; dataLength:data.length];
}]; }];
@@ -1626,15 +1631,15 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
delegate:(id<NSURLSessionDelegate>)delegate { delegate:(id<NSURLSessionDelegate>)delegate {
[self performBlock:^{ [self performBlock:^{
NSString* requestID = [[self class] requestIDForConnectionOrTask:task]; NSString* requestID = [[self class] requestIDForConnectionOrTask:task];
FLEXInternalRequestState* requestState = SKFLEXInternalRequestState* requestState =
[self requestStateForRequestID:requestID]; [self requestStateForRequestID:requestID];
if (error) { if (error) {
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordLoadingFailedWithRequestID:requestID recordLoadingFailedWithRequestID:requestID
error:error]; error:error];
} else { } else {
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordLoadingFinishedWithRequestID:requestID recordLoadingFinishedWithRequestID:requestID
responseBody:requestState.dataAccumulator]; responseBody:requestState.dataAccumulator];
} }
@@ -1652,7 +1657,7 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
[self performBlock:^{ [self performBlock:^{
NSString* requestID = NSString* requestID =
[[self class] requestIDForConnectionOrTask:downloadTask]; [[self class] requestIDForConnectionOrTask:downloadTask];
FLEXInternalRequestState* requestState = SKFLEXInternalRequestState* requestState =
[self requestStateForRequestID:requestID]; [self requestStateForRequestID:requestID];
if (!requestState.dataAccumulator) { if (!requestState.dataAccumulator) {
@@ -1661,18 +1666,18 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
: 0; : 0;
requestState.dataAccumulator = requestState.dataAccumulator =
[[NSMutableData alloc] initWithCapacity:unsignedBytesExpectedToWrite]; [[NSMutableData alloc] initWithCapacity:unsignedBytesExpectedToWrite];
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordResponseReceivedWithRequestID:requestID recordResponseReceivedWithRequestID:requestID
response:downloadTask.response]; response:downloadTask.response];
NSString* requestMechanism = NSString* requestMechanism =
[NSString stringWithFormat:@"NSURLSessionDownloadTask (delegate: %@)", [NSString stringWithFormat:@"NSURLSessionDownloadTask (delegate: %@)",
[delegate class]]; [delegate class]];
[[FLEXNetworkRecorder defaultRecorder] recordMechanism:requestMechanism [[SKFLEXNetworkRecorder defaultRecorder] recordMechanism:requestMechanism
forRequestID:requestID]; forRequestID:requestID];
} }
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordDataReceivedWithRequestID:requestID recordDataReceivedWithRequestID:requestID
dataLength:bytesWritten]; dataLength:bytesWritten];
}]; }];
@@ -1687,7 +1692,7 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
[self performBlock:^{ [self performBlock:^{
NSString* requestID = NSString* requestID =
[[self class] requestIDForConnectionOrTask:downloadTask]; [[self class] requestIDForConnectionOrTask:downloadTask];
FLEXInternalRequestState* requestState = SKFLEXInternalRequestState* requestState =
[self requestStateForRequestID:requestID]; [self requestStateForRequestID:requestID];
[requestState.dataAccumulator appendData:data]; [requestState.dataAccumulator appendData:data];
}]; }];
@@ -1698,12 +1703,12 @@ static char const* const kFLEXRequestIDKey = "kFLEXRequestIDKey";
// first resume as the equivalent to connection:willSendRequest:... // first resume as the equivalent to connection:willSendRequest:...
[self performBlock:^{ [self performBlock:^{
NSString* requestID = [[self class] requestIDForConnectionOrTask:task]; NSString* requestID = [[self class] requestIDForConnectionOrTask:task];
FLEXInternalRequestState* requestState = SKFLEXInternalRequestState* requestState =
[self requestStateForRequestID:requestID]; [self requestStateForRequestID:requestID];
if (!requestState.request) { if (!requestState.request) {
requestState.request = task.currentRequest; requestState.request = task.currentRequest;
[[FLEXNetworkRecorder defaultRecorder] [[SKFLEXNetworkRecorder defaultRecorder]
recordRequestWillBeSentWithRequestID:requestID recordRequestWillBeSentWithRequestID:requestID
request:task.currentRequest request:task.currentRequest
redirectResponse:nil]; redirectResponse:nil];

View File

@@ -49,14 +49,14 @@
#import <FlipperKitNetworkPlugin/SKNetworkReporter.h> #import <FlipperKitNetworkPlugin/SKNetworkReporter.h>
// Notifications posted when the record is updated // Notifications posted when the record is updated
extern NSString* const kFLEXNetworkRecorderNewTransactionNotification; extern NSString* const kSKFLEXNetworkRecorderNewTransactionNotification;
extern NSString* const kFLEXNetworkRecorderTransactionUpdatedNotification; extern NSString* const kSKFLEXNetworkRecorderTransactionUpdatedNotification;
extern NSString* const kFLEXNetworkRecorderUserInfoTransactionKey; extern NSString* const kSKFLEXNetworkRecorderUserInfoTransactionKey;
extern NSString* const kFLEXNetworkRecorderTransactionsClearedNotification; extern NSString* const kSKFLEXNetworkRecorderTransactionsClearedNotification;
@class FLEXNetworkTransaction; @class SKFLEXNetworkTransaction;
@interface FLEXNetworkRecorder : NSObject @interface SKFLEXNetworkRecorder : NSObject
/// In general, it only makes sense to have one recorder for the entire /// In general, it only makes sense to have one recorder for the entire
/// application. /// application.
@@ -76,13 +76,13 @@ extern NSString* const kFLEXNetworkRecorderTransactionsClearedNotification;
// Accessing recorded network activity // Accessing recorded network activity
/// Array of FLEXNetworkTransaction objects ordered by start time with the /// Array of SKFLEXNetworkTransaction objects ordered by start time with the
/// newest first. /// newest first.
- (NSArray<FLEXNetworkTransaction*>*)networkTransactions; - (NSArray<SKFLEXNetworkTransaction*>*)networkTransactions;
/// The full response data IFF it hasn't been purged due to memory pressure. /// The full response data IFF it hasn't been purged due to memory pressure.
- (NSData*)cachedResponseBodyForTransaction: - (NSData*)cachedResponseBodyForTransaction:
(FLEXNetworkTransaction*)transaction; (SKFLEXNetworkTransaction*)transaction;
/// Dumps all network transactions and cached response bodies. /// Dumps all network transactions and cached response bodies.
- (void)clearRecordedActivity; - (void)clearRecordedActivity;

View File

@@ -44,43 +44,43 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
#import "FLEXNetworkRecorder.h" #import "SKFLEXNetworkRecorder.h"
#import "FLEXNetworkTransaction.h" #import "SKFLEXNetworkTransaction.h"
#import "FLEXUtility.h" #import "SKFLEXUtility.h"
NSString* const kFLEXNetworkRecorderNewTransactionNotification = NSString* const kSKFLEXNetworkRecorderNewTransactionNotification =
@"kFLEXNetworkRecorderNewTransactionNotification"; @"kSKFLEXNetworkRecorderNewTransactionNotification";
NSString* const kFLEXNetworkRecorderTransactionUpdatedNotification = NSString* const kSKFLEXNetworkRecorderTransactionUpdatedNotification =
@"kFLEXNetworkRecorderTransactionUpdatedNotification"; @"kSKFLEXNetworkRecorderTransactionUpdatedNotification";
NSString* const kFLEXNetworkRecorderUserInfoTransactionKey = @"transaction"; NSString* const kSKFLEXNetworkRecorderUserInfoTransactionKey = @"transaction";
NSString* const kFLEXNetworkRecorderTransactionsClearedNotification = NSString* const kSKFLEXNetworkRecorderTransactionsClearedNotification =
@"kFLEXNetworkRecorderTransactionsClearedNotification"; @"kSKFLEXNetworkRecorderTransactionsClearedNotification";
NSString* const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey = NSString* const kSKFLEXNetworkRecorderResponseCacheLimitDefaultsKey =
@"com.flex.responseCacheLimit"; @"com.skflex.responseCacheLimit";
@interface FLEXNetworkRecorder () @interface SKFLEXNetworkRecorder ()
@property(nonatomic, strong) NSCache* responseCache; @property(nonatomic, strong) NSCache* responseCache;
@property(nonatomic, strong) @property(nonatomic, strong)
NSMutableArray<FLEXNetworkTransaction*>* orderedTransactions; NSMutableArray<SKFLEXNetworkTransaction*>* orderedTransactions;
@property(nonatomic, strong) @property(nonatomic, strong)
NSMutableDictionary<NSString*, FLEXNetworkTransaction*>* NSMutableDictionary<NSString*, SKFLEXNetworkTransaction*>*
networkTransactionsForRequestIdentifiers; networkTransactionsForRequestIdentifiers;
@property(nonatomic, strong) dispatch_queue_t queue; @property(nonatomic, strong) dispatch_queue_t queue;
@property(nonatomic, strong) @property(nonatomic, strong)
NSMutableDictionary<NSString*, NSNumber*>* identifierDict; NSMutableDictionary<NSString*, NSNumber*>* identifierDict;
@end @end
@implementation FLEXNetworkRecorder @implementation SKFLEXNetworkRecorder
- (instancetype)init { - (instancetype)init {
self = [super init]; self = [super init];
if (self) { if (self) {
_responseCache = [NSCache new]; _responseCache = [NSCache new];
NSUInteger responseCacheLimit = [[[NSUserDefaults standardUserDefaults] NSUInteger responseCacheLimit = [[[NSUserDefaults standardUserDefaults]
objectForKey:kFLEXNetworkRecorderResponseCacheLimitDefaultsKey] objectForKey:kSKFLEXNetworkRecorderResponseCacheLimitDefaultsKey]
unsignedIntegerValue]; unsignedIntegerValue];
if (responseCacheLimit) { if (responseCacheLimit) {
[_responseCache setTotalCostLimit:responseCacheLimit]; [_responseCache setTotalCostLimit:responseCacheLimit];
@@ -95,14 +95,14 @@ NSString* const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey =
// Serial queue used because we use mutable objects that are not thread safe // Serial queue used because we use mutable objects that are not thread safe
_queue = dispatch_queue_create( _queue = dispatch_queue_create(
"com.flex.FLEXNetworkRecorder", DISPATCH_QUEUE_SERIAL); "com.skflex.SKFLEXNetworkRecorder", DISPATCH_QUEUE_SERIAL);
_identifierDict = [NSMutableDictionary dictionary]; _identifierDict = [NSMutableDictionary dictionary];
} }
return self; return self;
} }
+ (instancetype)defaultRecorder { + (instancetype)defaultRecorder {
static FLEXNetworkRecorder* defaultRecorder = nil; static SKFLEXNetworkRecorder* defaultRecorder = nil;
static dispatch_once_t onceToken; static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
defaultRecorder = [[[self class] alloc] init]; defaultRecorder = [[[self class] alloc] init];
@@ -124,11 +124,11 @@ NSString* const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey =
[self.responseCache setTotalCostLimit:responseCacheByteLimit]; [self.responseCache setTotalCostLimit:responseCacheByteLimit];
[[NSUserDefaults standardUserDefaults] [[NSUserDefaults standardUserDefaults]
setObject:@(responseCacheByteLimit) setObject:@(responseCacheByteLimit)
forKey:kFLEXNetworkRecorderResponseCacheLimitDefaultsKey]; forKey:kSKFLEXNetworkRecorderResponseCacheLimitDefaultsKey];
} }
- (NSArray<FLEXNetworkTransaction*>*)networkTransactions { - (NSArray<SKFLEXNetworkTransaction*>*)networkTransactions {
__block NSArray<FLEXNetworkTransaction*>* transactions = nil; __block NSArray<SKFLEXNetworkTransaction*>* transactions = nil;
dispatch_sync(self.queue, ^{ dispatch_sync(self.queue, ^{
transactions = [self.orderedTransactions copy]; transactions = [self.orderedTransactions copy];
}); });
@@ -136,7 +136,7 @@ NSString* const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey =
} }
- (NSData*)cachedResponseBodyForTransaction: - (NSData*)cachedResponseBodyForTransaction:
(FLEXNetworkTransaction*)transaction { (SKFLEXNetworkTransaction*)transaction {
return [self.responseCache objectForKey:transaction.requestID]; return [self.responseCache objectForKey:transaction.requestID];
} }
@@ -167,12 +167,12 @@ NSString* const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey =
SKRequestInfo* info = [[SKRequestInfo alloc] SKRequestInfo* info = [[SKRequestInfo alloc]
initWithIdentifier:self.identifierDict[requestID].longLongValue initWithIdentifier:self.identifierDict[requestID].longLongValue
timestamp:[NSDate timestamp] timestamp:(uint64_t)[NSDate timestamp]
request:request request:request
data:request.HTTPBody]; data:request.HTTPBody];
[self.delegate didObserveRequest:info]; [self.delegate didObserveRequest:info];
FLEXNetworkTransaction* transaction = [FLEXNetworkTransaction new]; SKFLEXNetworkTransaction* transaction = [SKFLEXNetworkTransaction new];
transaction.requestID = requestID; transaction.requestID = requestID;
transaction.request = request; transaction.request = request;
transaction.startTime = requestDate; transaction.startTime = requestDate;
@@ -180,7 +180,8 @@ NSString* const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey =
[self.orderedTransactions insertObject:transaction atIndex:0]; [self.orderedTransactions insertObject:transaction atIndex:0];
[self.networkTransactionsForRequestIdentifiers setObject:transaction [self.networkTransactionsForRequestIdentifiers setObject:transaction
forKey:requestID]; forKey:requestID];
transaction.transactionState = FLEXNetworkTransactionStateAwaitingResponse; transaction.transactionState =
SKFLEXNetworkTransactionStateAwaitingResponse;
}); });
} }
@@ -190,13 +191,13 @@ NSString* const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey =
NSDate* responseDate = [NSDate date]; NSDate* responseDate = [NSDate date];
dispatch_async(self.queue, ^{ dispatch_async(self.queue, ^{
FLEXNetworkTransaction* transaction = SKFLEXNetworkTransaction* transaction =
self.networkTransactionsForRequestIdentifiers[requestID]; self.networkTransactionsForRequestIdentifiers[requestID];
if (!transaction) { if (!transaction) {
return; return;
} }
transaction.response = response; transaction.response = response;
transaction.transactionState = FLEXNetworkTransactionStateReceivingData; transaction.transactionState = SKFLEXNetworkTransactionStateReceivingData;
transaction.latency = transaction.latency =
-[transaction.startTime timeIntervalSinceDate:responseDate]; -[transaction.startTime timeIntervalSinceDate:responseDate];
}); });
@@ -206,7 +207,7 @@ NSString* const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey =
- (void)recordDataReceivedWithRequestID:(NSString*)requestID - (void)recordDataReceivedWithRequestID:(NSString*)requestID
dataLength:(int64_t)dataLength { dataLength:(int64_t)dataLength {
dispatch_async(self.queue, ^{ dispatch_async(self.queue, ^{
FLEXNetworkTransaction* transaction = SKFLEXNetworkTransaction* transaction =
self.networkTransactionsForRequestIdentifiers[requestID]; self.networkTransactionsForRequestIdentifiers[requestID];
if (!transaction) { if (!transaction) {
return; return;
@@ -220,17 +221,17 @@ NSString* const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey =
responseBody:(NSData*)responseBody { responseBody:(NSData*)responseBody {
NSDate* finishedDate = [NSDate date]; NSDate* finishedDate = [NSDate date];
dispatch_async(self.queue, ^{ dispatch_async(self.queue, ^{
FLEXNetworkTransaction* transaction = SKFLEXNetworkTransaction* transaction =
self.networkTransactionsForRequestIdentifiers[requestID]; self.networkTransactionsForRequestIdentifiers[requestID];
if (!transaction) { if (!transaction) {
return; return;
} }
transaction.transactionState = FLEXNetworkTransactionStateFinished; transaction.transactionState = SKFLEXNetworkTransactionStateFinished;
transaction.duration = transaction.duration =
-[transaction.startTime timeIntervalSinceDate:finishedDate]; -[transaction.startTime timeIntervalSinceDate:finishedDate];
SKResponseInfo* responseInfo = [[SKResponseInfo alloc] SKResponseInfo* responseInfo = [[SKResponseInfo alloc]
initWithIndentifier:self.identifierDict[requestID].longLongValue initWithIndentifier:self.identifierDict[requestID].longLongValue
timestamp:[NSDate timestamp] timestamp:(uint64_t)[NSDate timestamp]
response:transaction.response response:transaction.response
data:responseBody]; data:responseBody];
self.identifierDict[requestID] = nil; // Clear the entry self.identifierDict[requestID] = nil; // Clear the entry
@@ -257,7 +258,7 @@ NSString* const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey =
- (void)recordLoadingFailedWithRequestID:(NSString*)requestID - (void)recordLoadingFailedWithRequestID:(NSString*)requestID
error:(NSError*)error { error:(NSError*)error {
dispatch_async(self.queue, ^{ dispatch_async(self.queue, ^{
FLEXNetworkTransaction* transaction = SKFLEXNetworkTransaction* transaction =
self.networkTransactionsForRequestIdentifiers[requestID]; self.networkTransactionsForRequestIdentifiers[requestID];
if (!transaction) { if (!transaction) {
return; return;
@@ -265,12 +266,12 @@ NSString* const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey =
SKResponseInfo* responseInfo = [[SKResponseInfo alloc] SKResponseInfo* responseInfo = [[SKResponseInfo alloc]
initWithIndentifier:self.identifierDict[requestID].longLongValue initWithIndentifier:self.identifierDict[requestID].longLongValue
timestamp:[NSDate timestamp] timestamp:(uint64_t)[NSDate timestamp]
response:transaction.response response:transaction.response
data:nil]; data:nil];
self.identifierDict[requestID] = nil; // Clear the entry self.identifierDict[requestID] = nil; // Clear the entry
[self.delegate didObserveResponse:responseInfo]; [self.delegate didObserveResponse:responseInfo];
transaction.transactionState = FLEXNetworkTransactionStateFailed; transaction.transactionState = SKFLEXNetworkTransactionStateFailed;
transaction.duration = -[transaction.startTime timeIntervalSinceNow]; transaction.duration = -[transaction.startTime timeIntervalSinceNow];
transaction.error = error; transaction.error = error;
}); });
@@ -278,7 +279,7 @@ NSString* const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey =
- (void)recordMechanism:(NSString*)mechanism forRequestID:(NSString*)requestID { - (void)recordMechanism:(NSString*)mechanism forRequestID:(NSString*)requestID {
dispatch_async(self.queue, ^{ dispatch_async(self.queue, ^{
FLEXNetworkTransaction* transaction = SKFLEXNetworkTransaction* transaction =
self.networkTransactionsForRequestIdentifiers[requestID]; self.networkTransactionsForRequestIdentifiers[requestID];
if (!transaction) { if (!transaction) {
return; return;

View File

@@ -46,22 +46,22 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
typedef NS_ENUM(NSInteger, FLEXNetworkTransactionState) { typedef NS_ENUM(NSInteger, SKFLEXNetworkTransactionState) {
FLEXNetworkTransactionStateUnstarted, SKFLEXNetworkTransactionStateUnstarted,
FLEXNetworkTransactionStateAwaitingResponse, SKFLEXNetworkTransactionStateAwaitingResponse,
FLEXNetworkTransactionStateReceivingData, SKFLEXNetworkTransactionStateReceivingData,
FLEXNetworkTransactionStateFinished, SKFLEXNetworkTransactionStateFinished,
FLEXNetworkTransactionStateFailed SKFLEXNetworkTransactionStateFailed
}; };
@interface FLEXNetworkTransaction : NSObject @interface SKFLEXNetworkTransaction : NSObject
@property(nonatomic, copy) NSString* requestID; @property(nonatomic, copy) NSString* requestID;
@property(nonatomic, strong) NSURLRequest* request; @property(nonatomic, strong) NSURLRequest* request;
@property(nonatomic, strong) NSURLResponse* response; @property(nonatomic, strong) NSURLResponse* response;
@property(nonatomic, copy) NSString* requestMechanism; @property(nonatomic, copy) NSString* requestMechanism;
@property(nonatomic, assign) FLEXNetworkTransactionState transactionState; @property(nonatomic, assign) SKFLEXNetworkTransactionState transactionState;
@property(nonatomic, strong) NSError* error; @property(nonatomic, strong) NSError* error;
@property(nonatomic, strong) NSDate* startTime; @property(nonatomic, strong) NSDate* startTime;
@@ -74,6 +74,6 @@ typedef NS_ENUM(NSInteger, FLEXNetworkTransactionState) {
@property(nonatomic, strong, readonly) NSData* cachedRequestBody; @property(nonatomic, strong, readonly) NSData* cachedRequestBody;
+ (NSString*)readableStringFromTransactionState: + (NSString*)readableStringFromTransactionState:
(FLEXNetworkTransactionState)state; (SKFLEXNetworkTransactionState)state;
@end @end

View File

@@ -44,15 +44,15 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
#import "FLEXNetworkTransaction.h" #import "SKFLEXNetworkTransaction.h"
@interface FLEXNetworkTransaction () @interface SKFLEXNetworkTransaction ()
@property(nonatomic, strong, readwrite) NSData* cachedRequestBody; @property(nonatomic, strong, readwrite) NSData* cachedRequestBody;
@end @end
@implementation FLEXNetworkTransaction @implementation SKFLEXNetworkTransaction
- (NSString*)description { - (NSString*)description {
NSString* description = [super description]; NSString* description = [super description];
@@ -94,26 +94,26 @@
} }
+ (NSString*)readableStringFromTransactionState: + (NSString*)readableStringFromTransactionState:
(FLEXNetworkTransactionState)state { (SKFLEXNetworkTransactionState)state {
NSString* readableString = nil; NSString* readableString = nil;
switch (state) { switch (state) {
case FLEXNetworkTransactionStateUnstarted: case SKFLEXNetworkTransactionStateUnstarted:
readableString = @"Unstarted"; readableString = @"Unstarted";
break; break;
case FLEXNetworkTransactionStateAwaitingResponse: case SKFLEXNetworkTransactionStateAwaitingResponse:
readableString = @"Awaiting Response"; readableString = @"Awaiting Response";
break; break;
case FLEXNetworkTransactionStateReceivingData: case SKFLEXNetworkTransactionStateReceivingData:
readableString = @"Receiving Data"; readableString = @"Receiving Data";
break; break;
case FLEXNetworkTransactionStateFinished: case SKFLEXNetworkTransactionStateFinished:
readableString = @"Finished"; readableString = @"Finished";
break; break;
case FLEXNetworkTransactionStateFailed: case SKFLEXNetworkTransactionStateFailed:
readableString = @"Failed"; readableString = @"Failed";
break; break;
} }

View File

@@ -62,7 +62,7 @@
@end @end
@interface FLEXUtility : NSObject @interface SKFLEXUtility : NSObject
// Swizzling utilities // Swizzling utilities

View File

@@ -44,7 +44,7 @@
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. // POSSIBILITY OF SUCH DAMAGE.
#import "FLEXUtility.h" #import "SKFLEXUtility.h"
#include <assert.h> #include <assert.h>
#include <mach/mach.h> #include <mach/mach.h>
@@ -54,11 +54,11 @@
#import <ImageIO/ImageIO.h> #import <ImageIO/ImageIO.h>
@implementation FLEXUtility @implementation SKFLEXUtility
+ (SEL)swizzledSelectorForSelector:(SEL)selector { + (SEL)swizzledSelectorForSelector:(SEL)selector {
return NSSelectorFromString( return NSSelectorFromString(
[NSString stringWithFormat:@"_flex_swizzle_%x_%@", [NSString stringWithFormat:@"_skflex_swizzle_%x_%@",
arc4random(), arc4random(),
NSStringFromSelector(selector)]); NSStringFromSelector(selector)]);
} }

View File

@@ -8,8 +8,8 @@
#if FB_SONARKIT_ENABLED #if FB_SONARKIT_ENABLED
#import "SKIOSNetworkAdapter.h" #import "SKIOSNetworkAdapter.h"
#import "FLEXNetworkLib/FLEXNetworkObserver.h" #import "SKFLEXNetworkLib/SKFLEXNetworkObserver.h"
#import "FLEXNetworkLib/FLEXNetworkRecorder.h" #import "SKFLEXNetworkLib/SKFLEXNetworkRecorder.h"
@implementation SKIOSNetworkAdapter @implementation SKIOSNetworkAdapter
@synthesize delegate = _delegate; @synthesize delegate = _delegate;
@@ -22,8 +22,8 @@
- (void)setDelegate:(id<SKNetworkReporterDelegate>)delegate { - (void)setDelegate:(id<SKNetworkReporterDelegate>)delegate {
_delegate = delegate; _delegate = delegate;
[FLEXNetworkObserver start]; [SKFLEXNetworkObserver start];
[FLEXNetworkRecorder defaultRecorder].delegate = _delegate; [SKFLEXNetworkRecorder defaultRecorder].delegate = _delegate;
} }
@end @end