OSSNetworkingRequestDelegate.m 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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. if ([self.allNeededMessage.bucketName oss_isNotEmpty]) {
  68. OSSIPv6Adapter *ipAdapter = [OSSIPv6Adapter getInstance];
  69. if ([OSSUtil isOssOriginBucketHost:urlComponents.host]) {
  70. // eg. insert bucket to the begining of host.
  71. urlComponents.host = [NSString stringWithFormat:@"%@.%@", self.allNeededMessage.bucketName, urlComponents.host];
  72. headerHost = urlComponents.host;
  73. if (self.isHttpdnsEnable) {
  74. NSString *dnsResult = [OSSUtil getIpByHost: urlComponents.host];
  75. urlComponents.host = dnsResult;
  76. }
  77. } else if ([ipAdapter isIPv4Address:urlComponents.host] || [ipAdapter isIPv6Address:urlComponents.host]) {
  78. urlComponents.path = [NSString stringWithFormat:@"/%@%@",self.allNeededMessage.bucketName, urlComponents.path];
  79. }
  80. }
  81. urlString = urlComponents.string;
  82. // join object name
  83. if ([self.allNeededMessage.objectKey oss_isNotEmpty]) {
  84. urlString = [urlString oss_stringByAppendingPathComponentForURL:URLENCODE(self.allNeededMessage.objectKey)];
  85. }
  86. // join query string
  87. if (self.allNeededMessage.params) {
  88. NSMutableArray * querys = [[NSMutableArray alloc] init];
  89. for (NSString * key in [self.allNeededMessage.params allKeys]) {
  90. NSString * value = [self.allNeededMessage.params objectForKey:key];
  91. if (value) {
  92. if ([value isEqualToString:@""]) {
  93. [querys addObject:URLENCODE(key)];
  94. } else {
  95. [querys addObject:[NSString stringWithFormat:@"%@=%@", URLENCODE(key), URLENCODE(value)]];
  96. }
  97. }
  98. }
  99. if (querys && [querys count]) {
  100. NSString * queryString = [querys componentsJoinedByString:@"&"];
  101. urlString = [NSString stringWithFormat:@"%@?%@", urlString, queryString];
  102. }
  103. }
  104. OSSLogDebug(@"built full url: %@", urlString)
  105. // generate internal request For NSURLSession
  106. self.internalRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
  107. // set http method of request
  108. if (self.allNeededMessage.httpMethod) {
  109. [self.internalRequest setHTTPMethod:self.allNeededMessage.httpMethod];
  110. }
  111. // set host of header fields
  112. if ([headerHost oss_isNotEmpty]) {
  113. [self.internalRequest setValue:headerHost forHTTPHeaderField:@"Host"];
  114. }
  115. if (self.allNeededMessage.contentType) {
  116. [self.internalRequest setValue:self.allNeededMessage.contentType forHTTPHeaderField:@"Content-Type"];
  117. }
  118. if (self.allNeededMessage.contentMd5) {
  119. [self.internalRequest setValue:self.allNeededMessage.contentMd5 forHTTPHeaderField:@"Content-MD5"];
  120. }
  121. if (self.allNeededMessage.date) {
  122. [self.internalRequest setValue:self.allNeededMessage.date forHTTPHeaderField:@"Date"];
  123. }
  124. if (self.allNeededMessage.range) {
  125. [self.internalRequest setValue:self.allNeededMessage.range forHTTPHeaderField:@"Range"];
  126. }
  127. if (self.allNeededMessage.contentSHA1) {
  128. [self.internalRequest setValue:_allNeededMessage.contentSHA1 forHTTPHeaderField:@"x-oss-hash-sha1"];
  129. }
  130. if (self.allNeededMessage.headerParams) {
  131. for (NSString * key in [self.allNeededMessage.headerParams allKeys]) {
  132. [self.internalRequest setValue:[self.allNeededMessage.headerParams objectForKey:key] forHTTPHeaderField:key];
  133. }
  134. }
  135. OSSLogVerbose(@"buidlInternalHttpRequest -\nmethod: %@\nurl: %@\nheader: %@", self.internalRequest.HTTPMethod,
  136. self.internalRequest.URL, self.internalRequest.allHTTPHeaderFields)
  137. #undef URLENCODE//(a)
  138. return [OSSTask taskWithResult:nil];
  139. }
  140. @end