123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- //
- // OSSNetworkingRequestDelegate.m
- // AliyunOSSSDK
- //
- // Created by huaixu on 2018/1/22.
- // Copyright © 2018年 aliyun. All rights reserved.
- //
- #import "OSSNetworkingRequestDelegate.h"
- #import "OSSAllRequestNeededMessage.h"
- #import "OSSURLRequestRetryHandler.h"
- #import "OSSHttpResponseParser.h"
- #import "OSSDefine.h"
- #import "OSSUtil.h"
- #import "OSSLog.h"
- #import "OSSIPv6Adapter.h"
- @implementation OSSNetworkingRequestDelegate
- - (instancetype)init {
- if (self = [super init]) {
- self.retryHandler = [OSSURLRequestRetryHandler defaultRetryHandler];
- self.interceptors = [[NSMutableArray alloc] init];
- self.isHttpdnsEnable = YES;
- }
- return self;
- }
- - (void)reset {
- self.isHttpRequestNotSuccessResponse = NO;
- self.error = nil;
- self.payloadTotalBytesWritten = 0;
- self.isRequestCancelled = NO;
- [self.responseParser reset];
- }
- - (void)cancel {
- self.isRequestCancelled = YES;
- if (self.currentSessionTask) {
- OSSLogDebug(@"this task is cancelled now!");
- [self.currentSessionTask cancel];
- }
- }
- - (OSSTask *)validateRequestParams {
- NSString * errorMessage = nil;
-
- if ((self.operType == OSSOperationTypeAppendObject || self.operType == OSSOperationTypePutObject || self.operType == OSSOperationTypeUploadPart)
- && !self.uploadingData && !self.uploadingFileURL) {
- errorMessage = @"This operation need data or file to upload but none is set";
- }
-
- if (self.uploadingFileURL && ![[NSFileManager defaultManager] fileExistsAtPath:[self.uploadingFileURL path]]) {
- errorMessage = @"File doesn't exist";
- }
-
- if (errorMessage) {
- return [OSSTask taskWithError:[NSError errorWithDomain:OSSClientErrorDomain
- code:OSSClientErrorCodeInvalidArgument
- userInfo:@{OSSErrorMessageTOKEN: errorMessage}]];
- } else {
- return [self.allNeededMessage validateRequestParamsInOperationType:self.operType];
- }
- }
- - (OSSTask *)buildInternalHttpRequest {
-
- OSSTask * validateParam = [self validateRequestParams];
- if (validateParam.error) {
- return validateParam;
- }
-
- #define URLENCODE(a) [OSSUtil encodeURL:(a)]
- OSSLogDebug(@"start to build request")
- // build base url string
- NSString *urlString = self.allNeededMessage.endpoint;
- NSURLComponents *urlComponents = [[NSURLComponents alloc] initWithString:urlString];
- NSString *headerHost = nil;
-
- if ([self.allNeededMessage.bucketName oss_isNotEmpty]) {
- OSSIPv6Adapter *ipAdapter = [OSSIPv6Adapter getInstance];
- if ([OSSUtil isOssOriginBucketHost:urlComponents.host]) {
- // eg. insert bucket to the begining of host.
- urlComponents.host = [NSString stringWithFormat:@"%@.%@", self.allNeededMessage.bucketName, urlComponents.host];
- headerHost = urlComponents.host;
-
- if (self.isHttpdnsEnable) {
- NSString *dnsResult = [OSSUtil getIpByHost: urlComponents.host];
- urlComponents.host = dnsResult;
- }
- } else if ([ipAdapter isIPv4Address:urlComponents.host] || [ipAdapter isIPv6Address:urlComponents.host]) {
- urlComponents.path = [NSString stringWithFormat:@"/%@%@",self.allNeededMessage.bucketName, urlComponents.path];
- }
- }
-
- urlString = urlComponents.string;
-
- // join object name
- if ([self.allNeededMessage.objectKey oss_isNotEmpty]) {
- urlString = [urlString oss_stringByAppendingPathComponentForURL:URLENCODE(self.allNeededMessage.objectKey)];
- }
-
- // join query string
- if (self.allNeededMessage.params) {
- NSMutableArray * querys = [[NSMutableArray alloc] init];
- for (NSString * key in [self.allNeededMessage.params allKeys]) {
- NSString * value = [self.allNeededMessage.params objectForKey:key];
- if (value) {
- if ([value isEqualToString:@""]) {
- [querys addObject:URLENCODE(key)];
- } else {
- [querys addObject:[NSString stringWithFormat:@"%@=%@", URLENCODE(key), URLENCODE(value)]];
- }
- }
- }
- if (querys && [querys count]) {
- NSString * queryString = [querys componentsJoinedByString:@"&"];
- urlString = [NSString stringWithFormat:@"%@?%@", urlString, queryString];
- }
- }
- OSSLogDebug(@"built full url: %@", urlString)
-
- // generate internal request For NSURLSession
- self.internalRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
-
- // set http method of request
- if (self.allNeededMessage.httpMethod) {
- [self.internalRequest setHTTPMethod:self.allNeededMessage.httpMethod];
- }
-
- // set host of header fields
- if ([headerHost oss_isNotEmpty]) {
- [self.internalRequest setValue:headerHost forHTTPHeaderField:@"Host"];
- }
-
- if (self.allNeededMessage.contentType) {
- [self.internalRequest setValue:self.allNeededMessage.contentType forHTTPHeaderField:@"Content-Type"];
- }
- if (self.allNeededMessage.contentMd5) {
- [self.internalRequest setValue:self.allNeededMessage.contentMd5 forHTTPHeaderField:@"Content-MD5"];
- }
- if (self.allNeededMessage.date) {
- [self.internalRequest setValue:self.allNeededMessage.date forHTTPHeaderField:@"Date"];
- }
- if (self.allNeededMessage.range) {
- [self.internalRequest setValue:self.allNeededMessage.range forHTTPHeaderField:@"Range"];
- }
- if (self.allNeededMessage.contentSHA1) {
- [self.internalRequest setValue:_allNeededMessage.contentSHA1 forHTTPHeaderField:@"x-oss-hash-sha1"];
- }
- if (self.allNeededMessage.headerParams) {
- for (NSString * key in [self.allNeededMessage.headerParams allKeys]) {
- [self.internalRequest setValue:[self.allNeededMessage.headerParams objectForKey:key] forHTTPHeaderField:key];
- }
- }
-
-
- OSSLogVerbose(@"buidlInternalHttpRequest -\nmethod: %@\nurl: %@\nheader: %@", self.internalRequest.HTTPMethod,
- self.internalRequest.URL, self.internalRequest.allHTTPHeaderFields)
-
- #undef URLENCODE//(a)
- return [OSSTask taskWithResult:nil];
- }
- @end
|