暂无描述

OSSNetworkingRequestDelegate.m 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. @implementation OSSNetworkingRequestDelegate
  16. - (instancetype)init {
  17. if (self = [super init]) {
  18. self.retryHandler = [OSSURLRequestRetryHandler defaultRetryHandler];
  19. self.interceptors = [[NSMutableArray alloc] init];
  20. self.isHttpdnsEnable = YES;
  21. }
  22. return self;
  23. }
  24. - (void)reset {
  25. self.isHttpRequestNotSuccessResponse = NO;
  26. self.error = nil;
  27. self.payloadTotalBytesWritten = 0;
  28. self.isRequestCancelled = NO;
  29. [self.responseParser reset];
  30. }
  31. - (void)cancel {
  32. self.isRequestCancelled = YES;
  33. if (self.currentSessionTask) {
  34. OSSLogDebug(@"this task is cancelled now!");
  35. [self.currentSessionTask cancel];
  36. }
  37. }
  38. - (OSSTask *)validateRequestParams {
  39. NSString * errorMessage = nil;
  40. if ((self.operType == OSSOperationTypeAppendObject || self.operType == OSSOperationTypePutObject || self.operType == OSSOperationTypeUploadPart)
  41. && !self.uploadingData && !self.uploadingFileURL) {
  42. errorMessage = @"This operation need data or file to upload but none is set";
  43. }
  44. if (self.uploadingFileURL && ![[NSFileManager defaultManager] fileExistsAtPath:[self.uploadingFileURL path]]) {
  45. errorMessage = @"File doesn't exist";
  46. }
  47. if (errorMessage) {
  48. return [OSSTask taskWithError:[NSError errorWithDomain:OSSClientErrorDomain
  49. code:OSSClientErrorCodeInvalidArgument
  50. userInfo:@{OSSErrorMessageTOKEN: errorMessage}]];
  51. } else {
  52. return [self.allNeededMessage validateRequestParamsInOperationType:self.operType];
  53. }
  54. }
  55. - (OSSTask *)buildInternalHttpRequest {
  56. OSSTask * validateParam = [self validateRequestParams];
  57. if (validateParam.error) {
  58. return validateParam;
  59. }
  60. #define URLENCODE(a) [OSSUtil encodeURL:(a)]
  61. OSSLogDebug(@"start to build request");
  62. // build base url string
  63. NSString * urlString = self.allNeededMessage.endpoint;
  64. NSURL * endPointURL = [NSURL URLWithString:self.allNeededMessage.endpoint];
  65. if ([OSSUtil isOssOriginBucketHost:endPointURL.host] && self.allNeededMessage.bucketName) {
  66. urlString = [NSString stringWithFormat:@"%@://%@.%@", endPointURL.scheme, self.allNeededMessage.bucketName, endPointURL.host];
  67. }
  68. endPointURL = [NSURL URLWithString:urlString];
  69. NSString * urlHost = endPointURL.host;
  70. if (!self.isAccessViaProxy && [OSSUtil isOssOriginBucketHost:urlHost] && self.isHttpdnsEnable) {
  71. NSString * httpdnsResolvedResult = [OSSUtil getIpByHost:urlHost];
  72. urlString = [NSString stringWithFormat:@"%@://%@", endPointURL.scheme, httpdnsResolvedResult];
  73. }
  74. if (self.allNeededMessage.objectKey) {
  75. urlString = [urlString oss_stringByAppendingPathComponentForURL:URLENCODE(self.allNeededMessage.objectKey)];
  76. }
  77. // join query string
  78. if (self.allNeededMessage.querys) {
  79. NSMutableArray * querys = [[NSMutableArray alloc] init];
  80. for (NSString * key in [self.allNeededMessage.querys allKeys]) {
  81. NSString * value = [self.allNeededMessage.querys objectForKey:key];
  82. if (value) {
  83. if ([value isEqualToString:@""]) {
  84. [querys addObject:URLENCODE(key)];
  85. } else {
  86. [querys addObject:[NSString stringWithFormat:@"%@=%@", URLENCODE(key), URLENCODE(value)]];
  87. }
  88. }
  89. }
  90. if (querys && [querys count]) {
  91. NSString * queryString = [querys componentsJoinedByString:@"&"];
  92. urlString = [NSString stringWithFormat:@"%@?%@", urlString, queryString];
  93. }
  94. }
  95. OSSLogDebug(@"built full url: %@", urlString);
  96. NSString * headerHost = urlHost;
  97. if (![OSSUtil isOssOriginBucketHost:urlHost] && self.allNeededMessage.isHostInCnameExcludeList && self.allNeededMessage.bucketName) {
  98. headerHost = [NSString stringWithFormat:@"%@.%@", self.allNeededMessage.bucketName, urlHost];
  99. }
  100. // set header fields
  101. self.internalRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
  102. // override default host
  103. [self.internalRequest setValue:headerHost forHTTPHeaderField:@"Host"];
  104. if (self.allNeededMessage.httpMethod) {
  105. [self.internalRequest setHTTPMethod:self.allNeededMessage.httpMethod];
  106. }
  107. if (self.allNeededMessage.contentType) {
  108. [self.internalRequest setValue:self.allNeededMessage.contentType forHTTPHeaderField:@"Content-Type"];
  109. }
  110. if (self.allNeededMessage.contentMd5) {
  111. [self.internalRequest setValue:self.allNeededMessage.contentMd5 forHTTPHeaderField:@"Content-MD5"];
  112. }
  113. if (self.allNeededMessage.date) {
  114. [self.internalRequest setValue:self.allNeededMessage.date forHTTPHeaderField:@"Date"];
  115. }
  116. if (self.allNeededMessage.range) {
  117. [self.internalRequest setValue:self.allNeededMessage.range forHTTPHeaderField:@"Range"];
  118. }
  119. if (self.allNeededMessage.contentSHA1) {
  120. [self.internalRequest setValue:_allNeededMessage.contentSHA1 forHTTPHeaderField:@"x-oss-hash-sha1"];
  121. }
  122. if (self.allNeededMessage.headerParams) {
  123. for (NSString * key in [self.allNeededMessage.headerParams allKeys]) {
  124. [self.internalRequest setValue:[self.allNeededMessage.headerParams objectForKey:key] forHTTPHeaderField:key];
  125. }
  126. }
  127. OSSLogVerbose(@"buidlInternalHttpRequest -\nmethod: %@\nurl: %@\nheader: %@", self.internalRequest.HTTPMethod,
  128. self.internalRequest.URL, self.internalRequest.allHTTPHeaderFields);
  129. #undef URLENCODE//(a)
  130. return [OSSTask taskWithResult:nil];
  131. }
  132. @end