ably-cocoa/Source/ARTHttp.m

75 lines
2.5 KiB
Objective-C

#import "ARTHttp+Private.h"
#import "ARTURLSessionServerTrust.h"
#import "ARTConstants.h"
@interface ARTHttp ()
@property (readonly, strong, nonatomic) id<ARTURLSession> urlSession;
@end
Class configuredUrlSessionClass = nil;
#pragma mark - ARTHttp
@implementation ARTHttp {
ARTLog *_logger;
}
+ (void)setURLSessionClass:(const Class)urlSessionClass {
configuredUrlSessionClass = urlSessionClass;
}
- (instancetype)init:(dispatch_queue_t)queue logger:(ARTLog *)logger {
self = [super init];
if (self) {
const Class urlSessionClass = configuredUrlSessionClass ? configuredUrlSessionClass : [ARTURLSessionServerTrust class];
_urlSession = [[urlSessionClass alloc] init:queue];
_logger = logger;
}
return self;
}
- (ARTLog *)logger {
return _logger;
}
- (dispatch_queue_t)queue {
return _urlSession.queue;
}
- (void)dealloc {
[_urlSession finishTasksAndInvalidate];
}
- (NSObject<ARTCancellable> *)executeRequest:(NSMutableURLRequest *)request completion:(ARTURLRequestCallback)callback {
[self.logger debug:@"--> %@ %@\n Body: %@\n Headers: %@", request.HTTPMethod, request.URL.absoluteString, [self debugDescriptionOfBodyWithData:request.HTTPBody], request.allHTTPHeaderFields];
return [_urlSession get:request completion:^(NSHTTPURLResponse *response, NSData *data, NSError *error) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
if (error) {
[self.logger error:@"<-- %@ %@: error %@", request.HTTPMethod, request.URL.absoluteString, error];
} else {
[self.logger debug:@"<-- %@ %@: statusCode %ld\n Data: %@\n Headers: %@\n", request.HTTPMethod, request.URL.absoluteString, (long)httpResponse.statusCode, [self debugDescriptionOfBodyWithData:data], httpResponse.allHeaderFields];
NSString *headerErrorMessage = httpResponse.allHeaderFields[ARTHttpHeaderFieldErrorMessageKey];
if (headerErrorMessage && ![headerErrorMessage isEqualToString:@""]) {
[self.logger warn:@"%@", headerErrorMessage];
}
}
callback(httpResponse, data, error);
}];
}
- (NSString *)debugDescriptionOfBodyWithData:(NSData *)data {
if (self.logger.logLevel <= ARTLogLevelDebug) {
NSString *requestBodyStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (!requestBodyStr) {
requestBodyStr = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];
}
return requestBodyStr;
}
return nil;
}
@end