Add NSURLSession delegation to http_file_source.mm (#16321)

This commit is contained in:
Julian Rex
2020-03-25 17:56:40 -04:00
committed by GitHub
parent 0998ffbab8
commit 9009089a93
3 changed files with 58 additions and 33 deletions

View File

@@ -2,12 +2,16 @@
NS_ASSUME_NONNULL_BEGIN
@class MGLNativeNetworkManager;
@protocol MGLNativeNetworkDelegate <NSObject>
@optional
- (NSString *)skuToken;
- (NSURLSession *)sessionForNetworkManager:(MGLNativeNetworkManager *)networkManager;
@required
- (NSURLSessionConfiguration *)sessionConfiguration;

View File

@@ -249,10 +249,27 @@ std::unique_ptr<AsyncRequest> HTTPFileSource::request(const Resource& resource,
if (isTile) {
[MGLNativeNetworkManager.sharedManager startDownloadEvent:url.relativePath type:@"tile"];
}
request->task = [impl->session
__block NSURLSession *session;
// Use the delegate's session if there is one, otherwise use the one that
// was created when this class was constructed.
MGLNativeNetworkManager *networkManager = MGLNativeNetworkManager.sharedManager;
if ([networkManager.delegate respondsToSelector:@selector(sessionForNetworkManager:)]) {
session = [networkManager.delegate sessionForNetworkManager:networkManager];
}
if (!session) {
session = impl->session;
}
assert(session);
request->task = [session
dataTaskWithRequest:req
completionHandler:^(NSData* data, NSURLResponse* res, NSError* error) {
session = nil;
if (error && [error code] == NSURLErrorCancelled) {
[MGLNativeNetworkManager.sharedManager cancelDownloadEventForResponse:res];
return;

View File

@@ -13,61 +13,65 @@ static MGLNativeNetworkManager *instance = nil;
return instance;
}
- (NSURLSessionConfiguration *)sessionConfiguration {
if (_delegate && [_delegate respondsToSelector:@selector(sessionConfiguration)]) {
return [_delegate sessionConfiguration];
}
// For testing. Since we get a `nil` return when SDK is modualar, we use this for testing requests.
// Same as `[MGLNetworkConfiguration defaultSessionConfiguration]` in `MGLNetworkConfiguration.m`.
return [self testSessionConfiguration];
}
- (NSURLSessionConfiguration *)testSessionConfiguration {
+ (NSURLSessionConfiguration *)testSessionConfiguration {
NSURLSessionConfiguration* sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfiguration.timeoutIntervalForResource = 30;
sessionConfiguration.HTTPMaximumConnectionsPerHost = 8;
sessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
sessionConfiguration.URLCache = nil;
return sessionConfiguration;
}
#pragma mark - Optionals
- (NSString *)skuToken {
if(_delegate && [_delegate respondsToSelector:@selector(skuToken)]) {
return [_delegate skuToken];
if([self.delegate respondsToSelector:@selector(skuToken)]) {
return [self.delegate skuToken];
}
return nil;
}
- (void)startDownloadEvent:(NSString *)event type:(NSString *)type {
if (_delegate && [_delegate respondsToSelector:@selector(startDownloadEvent:type:)]) {
[_delegate startDownloadEvent:event type:type];
#pragma mark - Required
- (NSURLSessionConfiguration *)sessionConfiguration {
NSURLSessionConfiguration *configuration = [_delegate sessionConfiguration];
if (!configuration) {
// TODO: Remove
NSLog(@"Using testSessionConfiguration");
// For testing. Since we get a `nil` return when SDK is modular, we use
// this for testing requests.
// Same as `[MGLNetworkConfiguration defaultSessionConfiguration]` in
// `MGLNetworkConfiguration.m`.
configuration = [MGLNativeNetworkManager testSessionConfiguration];
}
return configuration;
}
- (void)startDownloadEvent:(NSString *)event type:(NSString *)type {
[self.delegate startDownloadEvent:event type:type];
}
- (void)cancelDownloadEventForResponse:(NSURLResponse *)response {
if (_delegate && [_delegate respondsToSelector:@selector(cancelDownloadEventForResponse:)]) {
return [_delegate cancelDownloadEventForResponse:response];
}
[self.delegate cancelDownloadEventForResponse:response];
}
- (void)stopDownloadEventForResponse:(NSURLResponse *)response {
if (_delegate && [_delegate respondsToSelector:@selector(stopDownloadEventForResponse:)]) {
return [_delegate stopDownloadEventForResponse:response];
}
[self.delegate stopDownloadEventForResponse:response];
}
- (void)debugLog:(NSString *)format, ...{
if (_delegate && [_delegate respondsToSelector:@selector(debugLog:)]) {
return [_delegate debugLog:format];
}
- (void)debugLog:(NSString *)format, ... {
// TODO: Replace with existing mbgl logging handling.
[self.delegate debugLog:format];
}
- (void)errorLog:(NSString *)format, ...{
if (_delegate && [_delegate respondsToSelector:@selector(errorLog:)]) {
return [_delegate errorLog:format];
}
- (void)errorLog:(NSString *)format, ... {
// TODO: Replace with existing mbgl logging handling.
[self.delegate errorLog:format];
}
@end