| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| |
| #import "WXResourceRequestHandlerDefaultImpl.h" |
| #import "WXThreadSafeMutableDictionary.h" |
| #import "WXAppConfiguration.h" |
| |
| @interface WXResourceRequestHandlerDefaultImpl () <NSURLSessionDataDelegate> |
| |
| @end |
| |
| @implementation WXResourceRequestHandlerDefaultImpl |
| { |
| NSURLSession *_session; |
| WXThreadSafeMutableDictionary<NSURLSessionDataTask *, id<WXResourceRequestDelegate>> *_delegates; |
| } |
| |
| #pragma mark - WXResourceRequestHandler |
| |
| - (void)sendRequest:(WXResourceRequest *)request withDelegate:(id<WXResourceRequestDelegate>)delegate |
| { |
| if (!_session) { |
| NSURLSessionConfiguration *urlSessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; |
| if ([WXAppConfiguration customizeProtocolClasses].count > 0) { |
| NSArray *defaultProtocols = urlSessionConfig.protocolClasses; |
| urlSessionConfig.protocolClasses = [[WXAppConfiguration customizeProtocolClasses] arrayByAddingObjectsFromArray:defaultProtocols]; |
| } |
| _session = [NSURLSession sessionWithConfiguration:urlSessionConfig |
| delegate:self |
| delegateQueue:[NSOperationQueue mainQueue]]; |
| _delegates = [WXThreadSafeMutableDictionary new]; |
| } |
| |
| NSURLSessionDataTask *task = [_session dataTaskWithRequest:request]; |
| request.taskIdentifier = task; |
| [_delegates setObject:delegate forKey:task]; |
| [task resume]; |
| } |
| |
| - (void)cancelRequest:(WXResourceRequest *)request |
| { |
| if ([request.taskIdentifier isKindOfClass:[NSURLSessionTask class]]) { |
| NSURLSessionTask *task = (NSURLSessionTask *)request.taskIdentifier; |
| [task cancel]; |
| [_delegates removeObjectForKey:task]; |
| } |
| } |
| |
| #pragma mark - NSURLSessionTaskDelegate & NSURLSessionDataDelegate |
| |
| - (void)URLSession:(NSURLSession *)session |
| task:(NSURLSessionTask *)task |
| didSendBodyData:(int64_t)bytesSent |
| totalBytesSent:(int64_t)totalBytesSent |
| totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend |
| { |
| id<WXResourceRequestDelegate> delegate = [_delegates objectForKey:task]; |
| [delegate request:(WXResourceRequest *)task.originalRequest didSendData:bytesSent totalBytesToBeSent:totalBytesExpectedToSend]; |
| } |
| |
| - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)task |
| didReceiveResponse:(NSURLResponse *)response |
| completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler |
| { |
| id<WXResourceRequestDelegate> delegate = [_delegates objectForKey:task]; |
| [delegate request:(WXResourceRequest *)task.originalRequest didReceiveResponse:(WXResourceResponse *)response]; |
| completionHandler(NSURLSessionResponseAllow); |
| } |
| |
| - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)task didReceiveData:(NSData *)data |
| { |
| id<WXResourceRequestDelegate> delegate = [_delegates objectForKey:task]; |
| [delegate request:(WXResourceRequest *)task.originalRequest didReceiveData:data]; |
| } |
| |
| - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error |
| { |
| id<WXResourceRequestDelegate> delegate = [_delegates objectForKey:task]; |
| if (error) { |
| [delegate request:(WXResourceRequest *)task.originalRequest didFailWithError:error]; |
| }else { |
| [delegate requestDidFinishLoading:(WXResourceRequest *)task.originalRequest]; |
| } |
| [_delegates removeObjectForKey:task]; |
| } |
| |
| #ifdef __IPHONE_10_0 |
| - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics |
| { |
| id<WXResourceRequestDelegate> delegate = [_delegates objectForKey:task]; |
| [delegate request:(WXResourceRequest *)task.originalRequest didFinishCollectingMetrics:metrics]; |
| } |
| #endif |
| @end |