QNUploadSystemClient.m 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. //
  2. // QNUploadSystemClient.m
  3. // QiniuSDK_Mac
  4. //
  5. // Created by yangsen on 2020/5/6.
  6. // Copyright © 2020 Qiniu. All rights reserved.
  7. //
  8. #import "QNUploadSystemClient.h"
  9. #import "QNUserAgent.h"
  10. #import "NSURLRequest+QNRequest.h"
  11. #import "QNURLProtocol.h"
  12. @interface QNUploadSystemClient()<NSURLSessionDelegate>
  13. @property(nonatomic, strong)QNUploadSingleRequestMetrics *requestMetrics;
  14. @property(nonatomic, strong)NSURLSessionDataTask *uploadTask;
  15. @property(nonatomic, strong)NSMutableData *responseData;
  16. @property(nonatomic, copy)void(^progress)(long long totalBytesWritten, long long totalBytesExpectedToWrite);
  17. @property(nonatomic, copy)QNRequestClientCompleteHandler complete;
  18. @end
  19. @implementation QNUploadSystemClient
  20. - (void)request:(NSURLRequest *)request
  21. connectionProxy:(NSDictionary *)connectionProxy
  22. progress:(void (^)(long long, long long))progress
  23. complete:(QNRequestClientCompleteHandler)complete {
  24. self.requestMetrics = [QNUploadSingleRequestMetrics emptyMetrics];
  25. self.requestMetrics.remoteAddress = request.qn_ip;
  26. self.requestMetrics.startDate = [NSDate date];
  27. self.responseData = [NSMutableData data];
  28. self.progress = progress;
  29. self.complete = complete;
  30. NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration qn_sessionConfiguration];
  31. if (connectionProxy) {
  32. configuration.connectionProxyDictionary = connectionProxy;
  33. }
  34. NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration
  35. delegate:self
  36. delegateQueue:nil];
  37. NSURLSessionDataTask *uploadTask = [session dataTaskWithRequest:request];
  38. [uploadTask resume];
  39. self.uploadTask = uploadTask;
  40. }
  41. - (void)cancel{
  42. [self.uploadTask cancel];
  43. }
  44. //MARK:-- NSURLSessionDelegate
  45. - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
  46. completionHandler(NSURLSessionResponseAllow);
  47. }
  48. - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
  49. [self.responseData appendData:data];
  50. }
  51. - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(nullable NSError *)error {
  52. self.requestMetrics.endDate = [NSDate date];
  53. self.requestMetrics.request = task.currentRequest;
  54. self.requestMetrics.response = task.response;
  55. self.requestMetrics.error = error;
  56. self.requestMetrics.countOfResponseBodyBytesReceived = task.response.expectedContentLength;
  57. self.requestMetrics.countOfRequestHeaderBytesSent = [NSString stringWithFormat:@"%@", task.currentRequest.allHTTPHeaderFields].length;
  58. self.complete(task.response, self.requestMetrics,self.responseData, error);
  59. [session finishTasksAndInvalidate];
  60. }
  61. - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics API_AVAILABLE(ios(10.0)) {
  62. NSURLSessionTaskTransactionMetrics *transactionMetrics = metrics.transactionMetrics.lastObject;
  63. self.requestMetrics.domainLookupStartDate = transactionMetrics.domainLookupStartDate;
  64. self.requestMetrics.domainLookupEndDate = transactionMetrics.domainLookupEndDate;
  65. self.requestMetrics.connectStartDate = transactionMetrics.connectStartDate;
  66. self.requestMetrics.secureConnectionStartDate = transactionMetrics.secureConnectionStartDate;
  67. self.requestMetrics.secureConnectionEndDate = transactionMetrics.secureConnectionEndDate;
  68. self.requestMetrics.connectEndDate = transactionMetrics.connectEndDate;
  69. self.requestMetrics.requestStartDate = transactionMetrics.requestStartDate;
  70. self.requestMetrics.requestEndDate = transactionMetrics.requestEndDate;
  71. self.requestMetrics.responseStartDate = transactionMetrics.responseStartDate;
  72. self.requestMetrics.responseEndDate = transactionMetrics.responseEndDate;
  73. if ([transactionMetrics.networkProtocolName isEqualToString:@"http/1.0"]) {
  74. self.requestMetrics.httpVersion = @"1.0";
  75. } else if ([transactionMetrics.networkProtocolName isEqualToString:@"http/1.1"]) {
  76. self.requestMetrics.httpVersion = @"1.1";
  77. } else if ([transactionMetrics.networkProtocolName isEqualToString:@"h2"]) {
  78. self.requestMetrics.httpVersion = @"2";
  79. } else if ([transactionMetrics.networkProtocolName isEqualToString:@"h3"]) {
  80. self.requestMetrics.httpVersion = @"3";
  81. } else {
  82. self.requestMetrics.httpVersion = transactionMetrics.networkProtocolName;
  83. }
  84. #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000
  85. if (@available(iOS 13.0, *)) {
  86. self.requestMetrics.localAddress = transactionMetrics.localAddress;
  87. self.requestMetrics.localPort = transactionMetrics.localPort;
  88. self.requestMetrics.remoteAddress = transactionMetrics.remoteAddress;
  89. self.requestMetrics.remotePort = transactionMetrics.remotePort;
  90. }
  91. #endif
  92. }
  93. - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
  94. didSendBodyData:(int64_t)bytesSent
  95. totalBytesSent:(int64_t)totalBytesSent
  96. totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend {
  97. self.requestMetrics.countOfRequestBodyBytesSent = totalBytesSent;
  98. if (self.progress) {
  99. self.progress(totalBytesSent, totalBytesExpectedToSend);
  100. }
  101. }
  102. @end