OSSNetworkingRequestDelegate.m 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. //
  2. // OSSNetworkingRequestDelegate.m
  3. // AliyunOSSSDK
  4. //
  5. // Created by huaixu on 2018/1/22.
  6. // Copyright © 2018年 aliyun. All rights reserved.
  7. //
  8. #import "OSSNetworkingRequestDelegate.h"
  9. #import "OSSAllRequestNeededMessage.h"
  10. #import "OSSURLRequestRetryHandler.h"
  11. #import "OSSHttpResponseParser.h"
  12. #import "OSSDefine.h"
  13. #import "OSSUtil.h"
  14. #import "OSSLog.h"
  15. #import "OSSIPv6Adapter.h"
  16. @implementation OSSNetworkingRequestDelegate
  17. - (instancetype)init {
  18. if (self = [super init]) {
  19. self.retryHandler = [OSSURLRequestRetryHandler defaultRetryHandler];
  20. self.interceptors = [[NSMutableArray alloc] init];
  21. self.isHttpdnsEnable = YES;
  22. }
  23. return self;
  24. }
  25. - (void)reset {
  26. self.isHttpRequestNotSuccessResponse = NO;
  27. self.error = nil;
  28. self.payloadTotalBytesWritten = 0;
  29. self.isRequestCancelled = NO;
  30. [self.responseParser reset];
  31. }
  32. - (void)cancel {
  33. self.isRequestCancelled = YES;
  34. if (self.currentSessionTask) {
  35. OSSLogDebug(@"this task is cancelled now!");
  36. [self.currentSessionTask cancel];
  37. }
  38. }
  39. - (OSSTask *)validateRequestParams {
  40. NSString * errorMessage = nil;
  41. if ((self.operType == OSSOperationTypeAppendObject || self.operType == OSSOperationTypePutObject || self.operType == OSSOperationTypeUploadPart)
  42. && !self.uploadingData && !self.uploadingFileURL) {
  43. errorMessage = @"This operation need data or file to upload but none is set";
  44. }
  45. if (self.uploadingFileURL && ![[NSFileManager defaultManager] fileExistsAtPath:[self.uploadingFileURL path]]) {
  46. errorMessage = @"File doesn't exist";
  47. }
  48. if (errorMessage) {
  49. return [OSSTask taskWithError:[NSError errorWithDomain:OSSClientErrorDomain
  50. code:OSSClientErrorCodeInvalidArgument
  51. userInfo:@{OSSErrorMessageTOKEN: errorMessage}]];
  52. } else {
  53. return [self.allNeededMessage validateRequestParamsInOperationType:self.operType];
  54. }
  55. }
  56. - (OSSTask *)buildInternalHttpRequest {
  57. OSSTask * validateParam = [self validateRequestParams];
  58. if (validateParam.error) {
  59. return validateParam;
  60. }
  61. #define URLENCODE(a) [OSSUtil encodeURL:(a)]
  62. OSSLogDebug(@"start to build request")
  63. // build base url string
  64. NSString *urlString = self.allNeededMessage.endpoint;
  65. NSURLComponents *urlComponents = [[NSURLComponents alloc] initWithString:urlString];
  66. NSString *headerHost = nil;
  67. NSURLComponents *temComs = [NSURLComponents new];
  68. temComs.scheme = urlComponents.scheme;
  69. temComs.host = urlComponents.host;
  70. temComs.port = urlComponents.port;
  71. if ([self.allNeededMessage.bucketName oss_isNotEmpty]) {
  72. OSSIPv6Adapter *ipAdapter = [OSSIPv6Adapter getInstance];
  73. if ([OSSUtil isOssOriginBucketHost:temComs.host]) {
  74. // eg. insert bucket to the begining of host.
  75. temComs.host = [NSString stringWithFormat:@"%@.%@", self.allNeededMessage.bucketName, temComs.host];
  76. headerHost = temComs.host;
  77. if ([temComs.scheme.lowercaseString isEqualToString:@"http"] && self.isHttpdnsEnable) {
  78. NSString *dnsResult = [OSSUtil getIpByHost: temComs.host];
  79. temComs.host = dnsResult;
  80. }
  81. } else if ([ipAdapter isIPv4Address:temComs.host] || [ipAdapter isIPv6Address:temComs.host]) {
  82. temComs.path = [NSString stringWithFormat:@"/%@",self.allNeededMessage.bucketName];
  83. }
  84. }
  85. urlString = temComs.string;
  86. // join object name
  87. if ([self.allNeededMessage.objectKey oss_isNotEmpty]) {
  88. urlString = [urlString oss_stringByAppendingPathComponentForURL:URLENCODE(self.allNeededMessage.objectKey)];
  89. }
  90. // join query string
  91. if (self.allNeededMessage.params) {
  92. NSMutableArray * querys = [[NSMutableArray alloc] init];
  93. for (NSString * key in [self.allNeededMessage.params allKeys]) {
  94. NSString * value = [self.allNeededMessage.params objectForKey:key];
  95. if (value) {
  96. if ([value isEqualToString:@""]) {
  97. [querys addObject:URLENCODE(key)];
  98. } else {
  99. [querys addObject:[NSString stringWithFormat:@"%@=%@", URLENCODE(key), URLENCODE(value)]];
  100. }
  101. }
  102. }
  103. if (querys && [querys count]) {
  104. NSString * queryString = [querys componentsJoinedByString:@"&"];
  105. urlString = [NSString stringWithFormat:@"%@?%@", urlString, queryString];
  106. }
  107. }
  108. OSSLogDebug(@"built full url: %@", urlString)
  109. // generate internal request For NSURLSession
  110. self.internalRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
  111. // set http method of request
  112. if (self.allNeededMessage.httpMethod) {
  113. [self.internalRequest setHTTPMethod:self.allNeededMessage.httpMethod];
  114. }
  115. // set host of header fields
  116. if ([headerHost oss_isNotEmpty]) {
  117. [self.internalRequest setValue:headerHost forHTTPHeaderField:@"Host"];
  118. }
  119. if (self.allNeededMessage.contentType) {
  120. [self.internalRequest setValue:self.allNeededMessage.contentType forHTTPHeaderField:@"Content-Type"];
  121. }
  122. if (self.allNeededMessage.contentMd5) {
  123. [self.internalRequest setValue:self.allNeededMessage.contentMd5 forHTTPHeaderField:@"Content-MD5"];
  124. }
  125. if (self.allNeededMessage.date) {
  126. [self.internalRequest setValue:self.allNeededMessage.date forHTTPHeaderField:@"Date"];
  127. }
  128. if (self.allNeededMessage.range) {
  129. [self.internalRequest setValue:self.allNeededMessage.range forHTTPHeaderField:@"Range"];
  130. }
  131. if (self.allNeededMessage.contentSHA1) {
  132. [self.internalRequest setValue:_allNeededMessage.contentSHA1 forHTTPHeaderField:@"x-oss-hash-sha1"];
  133. }
  134. if (self.allNeededMessage.headerParams) {
  135. for (NSString * key in [self.allNeededMessage.headerParams allKeys]) {
  136. [self.internalRequest setValue:[self.allNeededMessage.headerParams objectForKey:key] forHTTPHeaderField:key];
  137. }
  138. }
  139. OSSLogVerbose(@"buidlInternalHttpRequest -\nmethod: %@\nurl: %@\nheader: %@", self.internalRequest.HTTPMethod,
  140. self.internalRequest.URL, self.internalRequest.allHTTPHeaderFields)
  141. #undef URLENCODE//(a)
  142. return [OSSTask taskWithResult:nil];
  143. }
  144. @end