diff --git a/.gitignore b/.gitignore index 839c9ed9..234b6be2 100644 --- a/.gitignore +++ b/.gitignore @@ -38,5 +38,5 @@ Products/ # big Resource for test Example/AliyunOSSSDK-iOS-Example/Resources/ -# Python script generated files +script generated files Scripts/*.pyc diff --git a/AliyunOSSSDK.xcodeproj/project.pbxproj b/AliyunOSSSDK.xcodeproj/project.pbxproj index 4ffccc9d..0ae4f4cb 100644 --- a/AliyunOSSSDK.xcodeproj/project.pbxproj +++ b/AliyunOSSSDK.xcodeproj/project.pbxproj @@ -92,6 +92,10 @@ D829F3AA1FD8CFBE00A8C2DC /* OSSInputStreamHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = D829F3A71FD8CFBE00A8C2DC /* OSSInputStreamHelper.h */; }; D829F3AB1FD8CFBE00A8C2DC /* OSSInputStreamHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = D829F3A81FD8CFBE00A8C2DC /* OSSInputStreamHelper.m */; }; D829F3AC1FD8CFBE00A8C2DC /* OSSInputStreamHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = D829F3A81FD8CFBE00A8C2DC /* OSSInputStreamHelper.m */; }; + D833051F21A25E40001F42D9 /* OSSRequest+Utils.h in Headers */ = {isa = PBXBuildFile; fileRef = D833051D21A25E40001F42D9 /* OSSRequest+Utils.h */; }; + D833052021A25E40001F42D9 /* OSSRequest+Utils.h in Headers */ = {isa = PBXBuildFile; fileRef = D833051D21A25E40001F42D9 /* OSSRequest+Utils.h */; }; + D833052121A25E40001F42D9 /* OSSRequest+Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = D833051E21A25E40001F42D9 /* OSSRequest+Utils.m */; }; + D833052221A25E40001F42D9 /* OSSRequest+Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = D833051E21A25E40001F42D9 /* OSSRequest+Utils.m */; }; D842D59B1FFCAAD600220913 /* AliyunOSSiOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21028BBC1BA9ABF500C2A6BA /* AliyunOSSiOS.framework */; }; D842D59C1FFCAAF300220913 /* OSSLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = D842D5891FFC8C0500220913 /* OSSLog.swift */; }; D842D5A81FFCBA2800220913 /* AliyunOSSiOS.h in Headers */ = {isa = PBXBuildFile; fileRef = D842D5A71FFCBA2800220913 /* AliyunOSSiOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -259,6 +263,8 @@ D827B4342111ADF7003A24F6 /* OSSGetSymlinkResult.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OSSGetSymlinkResult.m; sourceTree = ""; }; D829F3A71FD8CFBE00A8C2DC /* OSSInputStreamHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OSSInputStreamHelper.h; sourceTree = ""; }; D829F3A81FD8CFBE00A8C2DC /* OSSInputStreamHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OSSInputStreamHelper.m; sourceTree = ""; }; + D833051D21A25E40001F42D9 /* OSSRequest+Utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "OSSRequest+Utils.h"; sourceTree = ""; }; + D833051E21A25E40001F42D9 /* OSSRequest+Utils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "OSSRequest+Utils.m"; sourceTree = ""; }; D842D5891FFC8C0500220913 /* OSSLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OSSLog.swift; sourceTree = ""; }; D842D5911FFCA8F300220913 /* AliyunOSSSwiftSDK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AliyunOSSSwiftSDK.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D842D59E1FFCB97900220913 /* AliyunOSSSwift.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AliyunOSSSwift.h; sourceTree = ""; }; @@ -486,6 +492,8 @@ D827B42E2111ADE9003A24F6 /* OSSPutSymlinkResult.m */, D827B4332111ADF7003A24F6 /* OSSGetSymlinkResult.h */, D827B4342111ADF7003A24F6 /* OSSGetSymlinkResult.m */, + D833051D21A25E40001F42D9 /* OSSRequest+Utils.h */, + D833051E21A25E40001F42D9 /* OSSRequest+Utils.m */, ); path = AliyunOSSSDK; sourceTree = ""; @@ -550,6 +558,7 @@ files = ( D8C41B1A1FCC2FD20091699B /* OSSModel.h in Headers */, D8C41B1D1FCC2FD20091699B /* OSSCompat.h in Headers */, + D833051F21A25E40001F42D9 /* OSSRequest+Utils.h in Headers */, D8C41B1F1FCC2FD20091699B /* OSSUtil.h in Headers */, D8C41B201FCC2FD20091699B /* OSSXMLDictionary.h in Headers */, D8C41B211FCC2FD20091699B /* OSSClient.h in Headers */, @@ -608,6 +617,7 @@ files = ( D80C81FB1FC82541008E3900 /* OSSModel.h in Headers */, D80C81FE1FC8254D008E3900 /* OSSXMLDictionary.h in Headers */, + D833052021A25E40001F42D9 /* OSSRequest+Utils.h in Headers */, D80C81FF1FC82554008E3900 /* OSSClient.h in Headers */, D80C82021FC8255B008E3900 /* OSSNetworking.h in Headers */, D80C82131FC82596008E3900 /* OSSIPv6Adapter.h in Headers */, @@ -838,6 +848,7 @@ D827B41321114E4B003A24F6 /* NSMutableDictionary+OSS.m in Sources */, D85278122015DF4900D7B1DE /* OSSConstants.m in Sources */, D80C88CB201AC1B400F379D8 /* OSSGetObjectACLRequest.m in Sources */, + D833052121A25E40001F42D9 /* OSSRequest+Utils.m in Sources */, D8C41B0E1FCC2F920091699B /* OSSDDLog.m in Sources */, D8C2951A20F46A95008A08AA /* OSSGetBucketInfoResult.m in Sources */, D8C41B101FCC2F920091699B /* OSSReachability.m in Sources */, @@ -891,6 +902,7 @@ D827B41421114E4B003A24F6 /* NSMutableDictionary+OSS.m in Sources */, D85278132015DF4900D7B1DE /* OSSConstants.m in Sources */, D80C88CC201AC1B400F379D8 /* OSSGetObjectACLRequest.m in Sources */, + D833052221A25E40001F42D9 /* OSSRequest+Utils.m in Sources */, D8C41ACF1FCC28500091699B /* OSSDDLog.m in Sources */, D8C2951B20F46A95008A08AA /* OSSGetBucketInfoResult.m in Sources */, D8C41AD11FCC28500091699B /* OSSReachability.m in Sources */, diff --git a/AliyunOSSSDK/OSSAllRequestNeededMessage.m b/AliyunOSSSDK/OSSAllRequestNeededMessage.m index b114e261..64b615f2 100644 --- a/AliyunOSSSDK/OSSAllRequestNeededMessage.m +++ b/AliyunOSSSDK/OSSAllRequestNeededMessage.m @@ -11,6 +11,10 @@ #import "OSSDefine.h" #import "OSSUtil.h" +static NSString * const kOSSInvalidBucketNameMessage = @"The bucket name is invalid. \nA bucket name must: \n1) be comprised of lower-case characters, numbers or dash(-); \n2) start with lower case or numbers; \n3) be between 3-63 characters long."; + +static NSString * const kOSSInvalidObjectNameMessage = @"The object key is invalid. \nAn object name should be: \n1) between 1 - 1023 bytes long when encoded as UTF-8 \n2) cannot contain LF or CR or unsupported chars in XML1.0, \n3) cannot begin with \'/\' or \'\\\'."; + @implementation OSSAllRequestNeededMessage - (instancetype)init @@ -33,31 +37,23 @@ - (void)setHeaderParams:(NSMutableDictionary *)headerParams { - (OSSTask *)validateRequestParamsInOperationType:(OSSOperationType)operType { NSString * errorMessage = nil; + // 1.check for endpoint if (!self.endpoint) { errorMessage = @"Endpoint should not be nil"; } - if (!self.bucketName && operType != OSSOperationTypeGetService) { - errorMessage = @"Bucket name should not be nil"; - } - - if (self.bucketName && ![OSSUtil validateBucketName:self.bucketName]) { - errorMessage = @"Bucket name invalid"; - } - - if (!self.objectKey && - (operType != OSSOperationTypeGetBucket && operType != OSSOperationTypeCreateBucket - && operType != OSSOperationTypeDeleteBucket && operType != OSSOperationTypeGetService - && operType != OSSOperationTypeGetBucketACL&& operType != OSSOperationTypeDeleteMultipleObjects - && operType != OSSOperationTypeListMultipartUploads - && operType != OSSOperationTypeGetBucketInfo)) { - errorMessage = @"Object key should not be nil"; + // 2.check for bucket and object + if (operType != OSSOperationTypeGetService) { + if (![_bucketName oss_isNotEmpty] + || ![OSSUtil validateBucketName:_bucketName]) { + errorMessage = kOSSInvalidBucketNameMessage; + } + if (![self operationBelongsToBucket:operType]) { + if (![_objectKey oss_isNotEmpty] + || ![OSSUtil validateObjectKey:_objectKey]) { + errorMessage = kOSSInvalidObjectNameMessage; + } } - - - - if (self.objectKey && ![OSSUtil validateObjectKey:self.objectKey]) { - errorMessage = @"Object key invalid"; } if (errorMessage) { @@ -69,4 +65,31 @@ - (OSSTask *)validateRequestParamsInOperationType:(OSSOperationType)operType { } } +- (BOOL)operationBelongsToBucket:(OSSOperationType)type { + BOOL belongsToBucket = NO; + switch (type) { + case OSSOperationTypeGetService: + case OSSOperationTypeCreateBucket: + case OSSOperationTypeDeleteBucket: + case OSSOperationTypeGetBucket: + case OSSOperationTypeGetBucketInfo: + case OSSOperationTypeGetBucketACL: + case OSSOperationTypePutBucketACL: + case OSSOperationTypePutBucketLogging: + case OSSOperationTypeGetBucketLogging: + case OSSOperationTypeDeleteBucketLogging: + case OSSOperationTypePutBucketReferer: + case OSSOperationTypeGetBucketReferer: + case OSSOperationTypePutBucketLifecycle: + case OSSOperationTypeGetBucketLifecycle: + case OSSOperationTypeDeleteBucketLifecycle: + belongsToBucket = YES; + break; + default: + break; + } + + return belongsToBucket; +} + @end diff --git a/AliyunOSSSDK/OSSClient.h b/AliyunOSSSDK/OSSClient.h index ac9a8534..8f113fbe 100644 --- a/AliyunOSSSDK/OSSClient.h +++ b/AliyunOSSSDK/OSSClient.h @@ -10,9 +10,20 @@ @class OSSGetServiceRequest; @class OSSCreateBucketRequest; @class OSSDeleteBucketRequest; -@class OSSHeadObjectRequest; -@class OSSGetBucketRequest; +@class OSSPutBucketACLRequest; @class OSSGetBucketACLRequest; +@class OSSGetBucketInfoRequest; +@class OSSPutBucketLoggingRequest; +@class OSSGetBucketLoggingRequest; +@class OSSDeleteBucketLoggingRequest; +@class OSSPutBucketRefererRequest; +@class OSSGetBucketRefererRequest; +@class OSSPutBucketLifecycleRequest; +@class OSSGetBucketLifecycleRequest; +@class OSSDeleteBucketLifecycleRequest; + +@class OSSGetBucketRequest; +@class OSSHeadObjectRequest; @class OSSGetObjectRequest; @class OSSGetObjectACLRequest; @class OSSPutObjectRequest; @@ -31,7 +42,6 @@ @class OSSMultipartUploadRequest; @class OSSCallBackRequest; @class OSSImagePersistRequest; -@class OSSGetBucketInfoRequest; @class OSSPutSymlinkRequest; @class OSSGetSymlinkRequest; @class OSSRestoreObjectRequest; @@ -139,12 +149,78 @@ NS_ASSUME_NONNULL_BEGIN */ - (OSSTask *)getBucketInfo:(OSSGetBucketInfoRequest *)request; +- (OSSTask *)putBucketACL:(OSSPutBucketACLRequest *)request; + /** The corresponding RESTFul API: GetBucketACL Gets the bucket ACL. */ - (OSSTask *)getBucketACL:(OSSGetBucketACLRequest *)request; +/** + Update the bucket logging settings. Log file will create every one hour and name format: -YYYY-mm-DD-HH-MM-SS-UniqueString + + @param request an instance of OSSPutBucketLoggingRequest + @return an instance of OSSTask + */ +- (OSSTask *)putBucketLogging:(OSSPutBucketLoggingRequest *)request; + +/** + Get the bucket logging settings. + + @param request an instance of OSSGetBucketLoggingRequest + @return an instance of OSSTask + */ +- (OSSTask *)getBucketLogging:(OSSGetBucketLoggingRequest *)request; + +/** + Delete the bucket logging settings. + + @param request an instance of OSSDeleteBucketLoggingRequest + @return an instance of OSSTask + */ +- (OSSTask *)deleteBucketLogging:(OSSDeleteBucketLoggingRequest *)request; + +/** + Set the bucket request Referer white list. + + @param request an OSSPutBucketRefererRequest instance. + @return an OSSTask instance. + */ +- (OSSTask *)putBucketReferer:(OSSPutBucketRefererRequest *)request; + +/** + Get the bucket request Referer white list. + + @param request an OSSGetBucketRefererRequest instance. + @return an OSSTask instance. + */ +- (OSSTask *)getBucketReferer:(OSSGetBucketRefererRequest *)request; + +/** + The bucket owner can set the lifecycle of a bucket with the PutBucketLifecycle request. After Lifecycle is enabled, OSS automatically deletes the objects or transitions the objects (to another storage class) corresponding the lifecycle rules on a regular basis.for more information,please refer to https://www.alibabacloud.com/help/doc-detail/31964.htm + + @param request an OSSPutBucketLifecycleRequest instance. + @return an OSSTask instance. + */ +- (OSSTask *)putBucketLifecycle:(OSSPutBucketLifecycleRequest *)request; + +/** + GetBucketLifecycle is used to view the lifecycle configuration of a bucket.for more information,please refer to https://www.alibabacloud.com/help/doc-detail/31972.htm + + @param request an OSSGetBucketLifecycleRequest instance. + @return an OSSTask instance. + */ +- (OSSTask *)getBucketLifecycle:(OSSGetBucketLifecycleRequest *)request; + +/** + The DeleteBucketLifecycle interface is used to delete the lifecycle configuration of a specified bucket.for more information,please refer to https://www.alibabacloud.com/help/doc-detail/31976.htm + + @param request an OSSDeleteBucketLifecycleRequest instance + @return an OSSTask instance + */ +- (OSSTask *)deleteBucketLifecycle:(OSSDeleteBucketLifecycleRequest *)request; + @end diff --git a/AliyunOSSSDK/OSSClient.m b/AliyunOSSSDK/OSSClient.m index 10a4a37c..c0439849 100644 --- a/AliyunOSSSDK/OSSClient.m +++ b/AliyunOSSSDK/OSSClient.m @@ -16,8 +16,8 @@ #import "OSSXMLDictionary.h" #import "OSSReachabilityManager.h" #import "OSSIPv6Adapter.h" +#import "OSSRequest+Utils.h" -#import "OSSNetworkingRequestDelegate.h" #import "OSSAllRequestNeededMessage.h" #import "OSSURLRequestRetryHandler.h" #import "OSSHttpResponseParser.h" @@ -36,14 +36,9 @@ static NSString * const kClientErrorMessageForEmptyFile = @"the length of file should not be 0!"; static NSString * const kClientErrorMessageForCancelledTask = @"This task has been cancelled!"; -/** - * extend OSSRequest to include the ref to networking request object - */ -@interface OSSRequest () -@property (nonatomic, strong) OSSNetworkingRequestDelegate * requestDelegate; -@end +#pragma mark - OSSClient @interface OSSClient() @@ -504,6 +499,24 @@ - (OSSTask *)getBucketInfo:(OSSGetBucketInfoRequest *)request { return [self invokeRequest:requestDelegate requireAuthentication:request.isAuthenticationRequired]; } +- (OSSTask *)putBucketACL:(OSSPutBucketACLRequest *)request { + OSSNetworkingRequestDelegate * requestDelegate = request.requestDelegate; + + requestDelegate.responseParser = [[OSSHttpResponseParser alloc] initForOperationType:OSSOperationTypePutBucketACL]; + + OSSAllRequestNeededMessage *neededMsg = [[OSSAllRequestNeededMessage alloc] init]; + neededMsg.endpoint = self.endpoint; + neededMsg.httpMethod = OSSHTTPMethodPUT; + neededMsg.bucketName = request.bucketName; + neededMsg.params = request.requestParams; + neededMsg.headerParams = [NSMutableDictionary dictionaryWithObjectsAndKeys:request.acl, OSSHttpHeaderBucketACL, nil]; + requestDelegate.allNeededMessage = neededMsg; + + requestDelegate.operType = OSSOperationTypePutBucketACL; + + return [self invokeRequest:requestDelegate requireAuthentication:request.isAuthenticationRequired]; +} + - (OSSTask *)getBucketACL:(OSSGetBucketACLRequest *)request { OSSNetworkingRequestDelegate * requestDelegate = request.requestDelegate; @@ -521,6 +534,153 @@ - (OSSTask *)getBucketACL:(OSSGetBucketACLRequest *)request { return [self invokeRequest:requestDelegate requireAuthentication:request.isAuthenticationRequired]; } +- (OSSTask *)putBucketLogging:(OSSPutBucketLoggingRequest *)request +{ + OSSNetworkingRequestDelegate * requestDelegate = request.requestDelegate; + + requestDelegate.responseParser = [[OSSHttpResponseParser alloc] initForOperationType:OSSOperationTypePutBucketLogging]; + + OSSAllRequestNeededMessage *neededMsg = [[OSSAllRequestNeededMessage alloc] init]; + neededMsg.endpoint = self.endpoint; + neededMsg.httpMethod = OSSHTTPMethodPUT; + neededMsg.bucketName = request.bucketName; + neededMsg.params = request.requestParams; + requestDelegate.allNeededMessage = neededMsg; + requestDelegate.uploadingData = request.xmlBody; + + requestDelegate.operType = OSSOperationTypePutBucketLogging; + + return [self invokeRequest:requestDelegate requireAuthentication:request.isAuthenticationRequired]; +} + +- (OSSTask *)getBucketLogging:(OSSGetBucketLoggingRequest *)request +{ + OSSNetworkingRequestDelegate * requestDelegate = request.requestDelegate; + + requestDelegate.responseParser = [[OSSHttpResponseParser alloc] initForOperationType:OSSOperationTypeGetBucketLogging]; + + OSSAllRequestNeededMessage *neededMsg = [[OSSAllRequestNeededMessage alloc] init]; + neededMsg.endpoint = self.endpoint; + neededMsg.httpMethod = OSSHTTPMethodGET; + neededMsg.bucketName = request.bucketName; + neededMsg.params = request.requestParams; + requestDelegate.allNeededMessage = neededMsg; + + requestDelegate.operType = OSSOperationTypeGetBucketLogging; + + return [self invokeRequest:requestDelegate requireAuthentication:request.isAuthenticationRequired]; +} + +- (OSSTask *)deleteBucketLogging:(OSSDeleteBucketLoggingRequest *)request +{ + OSSNetworkingRequestDelegate * requestDelegate = request.requestDelegate; + + requestDelegate.responseParser = [[OSSHttpResponseParser alloc] initForOperationType:OSSOperationTypeDeleteBucketLogging]; + + OSSAllRequestNeededMessage *neededMsg = [[OSSAllRequestNeededMessage alloc] init]; + neededMsg.endpoint = self.endpoint; + neededMsg.httpMethod = OSSHTTPMethodDELETE; + neededMsg.bucketName = request.bucketName; + neededMsg.params = request.requestParams; + requestDelegate.allNeededMessage = neededMsg; + + requestDelegate.operType = OSSOperationTypeDeleteBucketLogging; + + return [self invokeRequest:requestDelegate requireAuthentication:request.isAuthenticationRequired]; +} + +- (OSSTask *)putBucketReferer:(OSSPutBucketRefererRequest *)request +{ + OSSNetworkingRequestDelegate * requestDelegate = request.requestDelegate; + + requestDelegate.responseParser = [[OSSHttpResponseParser alloc] initForOperationType:OSSOperationTypePutBucketReferer]; + + OSSAllRequestNeededMessage *neededMsg = [[OSSAllRequestNeededMessage alloc] init]; + neededMsg.endpoint = self.endpoint; + neededMsg.httpMethod = OSSHTTPMethodPUT; + neededMsg.bucketName = request.bucketName; + neededMsg.params = request.requestParams; + requestDelegate.allNeededMessage = neededMsg; + requestDelegate.uploadingData = request.xmlBody; + + requestDelegate.operType = OSSOperationTypePutBucketReferer; + + return [self invokeRequest:requestDelegate requireAuthentication:request.isAuthenticationRequired]; +} + +- (OSSTask *)getBucketReferer:(OSSGetBucketRefererRequest *)request +{ + OSSNetworkingRequestDelegate * requestDelegate = request.requestDelegate; + + requestDelegate.responseParser = [[OSSHttpResponseParser alloc] initForOperationType:OSSOperationTypeGetBucketReferer]; + + OSSAllRequestNeededMessage *neededMsg = [[OSSAllRequestNeededMessage alloc] init]; + neededMsg.endpoint = self.endpoint; + neededMsg.httpMethod = OSSHTTPMethodGET; + neededMsg.bucketName = request.bucketName; + neededMsg.params = request.requestParams; + requestDelegate.allNeededMessage = neededMsg; + + requestDelegate.operType = OSSOperationTypeGetBucketReferer; + + return [self invokeRequest:requestDelegate requireAuthentication:request.isAuthenticationRequired]; +} + +- (OSSTask *)putBucketLifecycle:(OSSPutBucketLifecycleRequest *)request +{ + OSSNetworkingRequestDelegate * requestDelegate = request.requestDelegate; + + requestDelegate.responseParser = [[OSSHttpResponseParser alloc] initForOperationType:OSSOperationTypePutBucketLifecycle]; + + OSSAllRequestNeededMessage *neededMsg = [[OSSAllRequestNeededMessage alloc] init]; + neededMsg.endpoint = self.endpoint; + neededMsg.httpMethod = OSSHTTPMethodPUT; + neededMsg.bucketName = request.bucketName; + neededMsg.params = request.requestParams; + requestDelegate.allNeededMessage = neededMsg; + requestDelegate.uploadingData = request.xmlBody; + + requestDelegate.operType = OSSOperationTypePutBucketLifecycle; + + return [self invokeRequest:requestDelegate requireAuthentication:request.isAuthenticationRequired]; +} + +- (OSSTask *)getBucketLifecycle:(OSSGetBucketLifecycleRequest *)request +{ + OSSNetworkingRequestDelegate * requestDelegate = request.requestDelegate; + + requestDelegate.responseParser = [[OSSHttpResponseParser alloc] initForOperationType:OSSOperationTypeGetBucketLifecycle]; + + OSSAllRequestNeededMessage *neededMsg = [[OSSAllRequestNeededMessage alloc] init]; + neededMsg.endpoint = self.endpoint; + neededMsg.httpMethod = OSSHTTPMethodGET; + neededMsg.bucketName = request.bucketName; + neededMsg.params = request.requestParams; + requestDelegate.allNeededMessage = neededMsg; + + requestDelegate.operType = OSSOperationTypeGetBucketLifecycle; + + return [self invokeRequest:requestDelegate requireAuthentication:request.isAuthenticationRequired]; +} + +- (OSSTask *)deleteBucketLifecycle:(OSSDeleteBucketLifecycleRequest *)request +{ + OSSNetworkingRequestDelegate * requestDelegate = request.requestDelegate; + + requestDelegate.responseParser = [[OSSHttpResponseParser alloc] initForOperationType:OSSOperationTypeDeleteBucketLifecycle]; + + OSSAllRequestNeededMessage *neededMsg = [[OSSAllRequestNeededMessage alloc] init]; + neededMsg.endpoint = self.endpoint; + neededMsg.httpMethod = OSSHTTPMethodDELETE; + neededMsg.bucketName = request.bucketName; + neededMsg.params = request.requestParams; + requestDelegate.allNeededMessage = neededMsg; + + requestDelegate.operType = OSSOperationTypeDeleteBucketLifecycle; + + return [self invokeRequest:requestDelegate requireAuthentication:request.isAuthenticationRequired]; +} + @end @implementation OSSClient (Object) diff --git a/AliyunOSSSDK/OSSConstants.h b/AliyunOSSSDK/OSSConstants.h index aa044c7b..60b121b6 100644 --- a/AliyunOSSSDK/OSSConstants.h +++ b/AliyunOSSSDK/OSSConstants.h @@ -48,7 +48,16 @@ typedef NS_ENUM(NSInteger, OSSOperationType) { OSSOperationTypeDeleteBucket, OSSOperationTypeGetBucket, OSSOperationTypeGetBucketInfo, + OSSOperationTypePutBucketACL, OSSOperationTypeGetBucketACL, + OSSOperationTypePutBucketLogging, + OSSOperationTypeGetBucketLogging, + OSSOperationTypeDeleteBucketLogging, + OSSOperationTypePutBucketReferer, + OSSOperationTypeGetBucketReferer, + OSSOperationTypePutBucketLifecycle, + OSSOperationTypeGetBucketLifecycle, + OSSOperationTypeDeleteBucketLifecycle, OSSOperationTypeHeadObject, OSSOperationTypeGetObject, OSSOperationTypeGetObjectACL, @@ -96,6 +105,18 @@ typedef NS_ENUM(NSInteger, OSSXMLDictionaryAttributesMode) OSSXMLDictionaryAttributesModeDiscard }; +/** + the acl type of OSS resource + + - OSSACLPrivate: private + - OSSACLPublicRead: public-reads + - OSSACLPublicReadAndWrite: public-read-write + */ +typedef NS_ENUM(NSInteger, OSSACLType){ + OSSACLPrivate, // private + OSSACLPublicRead, // public-read + OSSACLPublicReadAndWrite // public-read-write +}; typedef NS_ENUM(NSInteger, OSSXMLDictionaryNodeNameMode) { diff --git a/AliyunOSSSDK/OSSHttpResponseParser.m b/AliyunOSSSDK/OSSHttpResponseParser.m index 5dc4b6db..cdb72699 100644 --- a/AliyunOSSSDK/OSSHttpResponseParser.m +++ b/AliyunOSSSDK/OSSHttpResponseParser.m @@ -225,6 +225,17 @@ - (nullable id)constructResultObject return createBucketResult; } + case OSSOperationTypePutBucketACL: + { + OSSPutBucketACLResult * putBucketACLResult = [OSSPutBucketACLResult new]; + if (_response) + { + [self parseResponseHeader:_response toResultObject:putBucketACLResult]; + } + + return putBucketACLResult; + } + case OSSOperationTypeGetBucketACL: { OSSGetBucketACLResult * getBucketACLResult = [OSSGetBucketACLResult new]; @@ -253,6 +264,159 @@ - (nullable id)constructResultObject return deleteBucketResult; } + case OSSOperationTypePutBucketLogging: + { + OSSPutBucketLoggingResult * putBucketLogging = [OSSPutBucketLoggingResult new]; + if (_response) { + [self parseResponseHeader:_response toResultObject:putBucketLogging]; + } + return putBucketLogging; + } + + case OSSOperationTypeGetBucketLogging: + { + OSSGetBucketLoggingResult * getBucketLogging = [OSSGetBucketLoggingResult new]; + if (_response) { + [self parseResponseHeader:_response toResultObject:getBucketLogging]; + } + + if (_collectingData) { + NSDictionary * parsedDict = [NSDictionary oss_dictionaryWithXMLData:_collectingData]; + OSSLogVerbose(@"Get bucket logging dict: %@", parsedDict); + + NSDictionary *loggingInfo = [parsedDict valueForKey:@"LoggingEnabled"]; + if (loggingInfo) { + getBucketLogging.loggingEnabled = YES; + getBucketLogging.targetBucketName = [loggingInfo objectForKey:@"TargetBucket"]; + getBucketLogging.targetPrefix = [loggingInfo objectForKey:@"TargetPrefix"]; + } else { + getBucketLogging.loggingEnabled = NO; + } + } + + return getBucketLogging; + } + + case OSSOperationTypeDeleteBucketLogging: + { + OSSDeleteBucketLoggingResult * deleteBucketLogging = [OSSDeleteBucketLoggingResult new]; + if (_response) { + [self parseResponseHeader:_response toResultObject:deleteBucketLogging]; + } + + return deleteBucketLogging; + } + + case OSSOperationTypePutBucketReferer: + { + OSSPutBucketRefererResult * putBucketReferer = [OSSPutBucketRefererResult new]; + if (_response) { + [self parseResponseHeader:_response toResultObject:putBucketReferer]; + } + + return putBucketReferer; + } + + case OSSOperationTypeGetBucketReferer: + { + OSSGetBucketRefererResult * getBucketReferer = [OSSGetBucketRefererResult new]; + if (_response) { + [self parseResponseHeader:_response toResultObject:getBucketReferer]; + } + + if (_collectingData) { + NSDictionary * parsedDict = [NSDictionary oss_dictionaryWithXMLData:_collectingData]; + OSSLogVerbose(@"Get bucket logging dict: %@", parsedDict); + + if (parsedDict) { + NSString *sAllowEmpty = [parsedDict objectForKey:@"AllowEmptyReferer"]; + if ([sAllowEmpty isEqual:@"true"]) { + getBucketReferer.allowEmpty = YES; + } else { + getBucketReferer.allowEmpty = NO; + } + + getBucketReferer.referers = [[parsedDict objectForKey:@"RefererList"] objectForKey:@"Referer"]; + } + } + + return getBucketReferer; + } + + case OSSOperationTypePutBucketLifecycle: + { + OSSPutBucketLifecycleResult *putBucketLifecycleRes = [OSSPutBucketLifecycleResult new]; + if (_response) { + [self parseResponseHeader:_response toResultObject:putBucketLifecycleRes]; + } + + return putBucketLifecycleRes; + } + + case OSSOperationTypeGetBucketLifecycle: + { + OSSGetBucketLifecycleResult *getBucketLifecycleRes = [OSSGetBucketLifecycleResult new]; + if (_response) { + [self parseResponseHeader:_response toResultObject:getBucketLifecycleRes]; + } + + if (_collectingData) { + NSDictionary * parsedDict = [NSDictionary oss_dictionaryWithXMLData:_collectingData]; + OSSLogVerbose(@"Get bucket logging dict: %@", parsedDict); + + NSArray *rules = [parsedDict objectForKey:@"Rule"]; + if (rules.count > 0) { + NSMutableArray *ruleArray = [NSMutableArray array]; + for (NSDictionary *ruleInfo in rules) { + OSSBucketLifecycleRule *rule = [[OSSBucketLifecycleRule alloc] init]; + NSString *status = [ruleInfo objectForKey:@"Status"]; + if ([status isEqualToString:@"Enabled"]) { + rule.status = YES; + } else { + rule.status = NO; + } + + rule.identifier = [ruleInfo objectForKey:@"ID"]; + rule.prefix = [ruleInfo objectForKey:@"Prefix"]; + + NSDictionary *expirationInfo = [ruleInfo objectForKey:@"Expiration"]; + rule.days = [expirationInfo objectForKey:@"Days"]; + rule.expireDate = [expirationInfo objectForKey:@"Date"]; + + NSDictionary *multipartInfo = [ruleInfo objectForKey:@"AbortMultipartUpload"]; + rule.multipartDays = [multipartInfo objectForKey:@"Days"]; + rule.multipartExpireDate = [multipartInfo objectForKey:@"Date"]; + + NSDictionary *transitionInfo = [ruleInfo objectForKey:@"Transition"]; + NSString *storageClass = [transitionInfo objectForKey:@"StorageClass"]; + if ([storageClass isEqualToString:@"IA"]) { + rule.iaDays = [transitionInfo objectForKey:@"Days"]; + rule.iaExpireDate = [transitionInfo objectForKey:@"Date"]; + } else if ([storageClass isEqualToString:@"Archive"]) { + rule.archiveDays = [transitionInfo objectForKey:@"Days"]; + rule.archiveExpireDate = [transitionInfo objectForKey:@"Date"]; + } + + [ruleArray addObject:rule]; + } + + getBucketLifecycleRes.rules = [ruleArray copy]; + } + } + + return getBucketLifecycleRes; + } + + case OSSOperationTypeDeleteBucketLifecycle: + { + OSSDeleteBucketLifecycleResult *deleteBucketLifecycleRes = [OSSDeleteBucketLifecycleResult new]; + if (_response) { + [self parseResponseHeader:_response toResultObject:deleteBucketLifecycleRes]; + } + + return deleteBucketLifecycleRes; + } + case OSSOperationTypeGetBucket: { OSSGetBucketResult * getBucketResult = [OSSGetBucketResult new]; diff --git a/AliyunOSSSDK/OSSModel.h b/AliyunOSSSDK/OSSModel.h index a6309581..a454147c 100644 --- a/AliyunOSSSDK/OSSModel.h +++ b/AliyunOSSSDK/OSSModel.h @@ -473,6 +473,31 @@ Sets the session Id for background file transmission @property (nonatomic, strong) NSArray * commentPrefixes; @end +/** + The request class to get the bucket ACL. + */ +@interface OSSPutBucketACLRequest : OSSRequest + +/** + Bucket name + */ +@property (nonatomic, copy) NSString * bucketName; + +/** + acl type + */ +@property (nonatomic, assign) OSSACLType aclType; + +@end + + +/** + The result class to put the bucket's ACL. + */ +@interface OSSPutBucketACLResult : OSSResult + +@end + /** The request class to get the bucket ACL. */ @@ -495,6 +520,242 @@ Sets the session Id for background file transmission @property (nonatomic, copy) NSString * aclGranted; @end +@interface OSSPutBucketLoggingRequest : OSSRequest + +/** + bucket's name + */ +@property (nonatomic, copy) NSString *bucketName; + +/** + target bucket's name + */ +@property (nonatomic, copy) NSString *targetBucketName; + +/** + prefix path name to store the log files + */ +@property (nonatomic, copy) NSString *targetPrefix; + +@end + +@interface OSSPutBucketLoggingResult : OSSResult + +@end + + +@interface OSSGetBucketLoggingRequest : OSSRequest + +/** + bucket name + */ +@property (nonatomic, copy) NSString *bucketName; + +@end + +@interface OSSGetBucketLoggingResult : OSSResult + +/** + enable logging or not. + */ +@property (nonatomic, assign) BOOL loggingEnabled; + +/** + target bucket's name + */ +@property (nonatomic, copy) NSString *targetBucketName; + +/** + prefix path name to store the log files + */ +@property (nonatomic, copy) NSString *targetPrefix; + +@end + + +@interface OSSDeleteBucketLoggingRequest : OSSRequest + +/** + bucket name + */ +@property (nonatomic, copy) NSString *bucketName; + +@end + +@interface OSSDeleteBucketLoggingResult : OSSResult + +@end + +/** + the request of putting bucket referer operation + */ +@interface OSSPutBucketRefererRequest : OSSRequest + +/** + bucket name + */ +@property (nonatomic, copy) NSString *bucketName; + +/** + allow empty request referer or not.default value is YES. + */ +@property (nonatomic, assign) BOOL allowEmpty; + +/** + Referer white list, e.g.:['https://npm.taobao.org','http://cnpmjs.org'] + */ +@property (nonatomic, copy) NSArray *referers; + +@end + +/** + the result of putting bucket referer operation + */ +@interface OSSPutBucketRefererResult : OSSResult + +@end + +/** + the request for getting the bucket request Referer white list. + */ +@interface OSSGetBucketRefererRequest : OSSRequest + +/** + bucket name + */ +@property (nonatomic, copy) NSString *bucketName; + +@end + +/** + the result of getting bucket referer operation + */ +@interface OSSGetBucketRefererResult : OSSResult + +/** + allow empty request referer or not. + */ +@property (nonatomic, assign) BOOL allowEmpty; + +/** + Referer white list + */ +@property (nonatomic, copy) NSArray *referers; + +@end + + +@interface OSSBucketLifecycleRule : NSObject + +/** + rule id, if not set, OSS will auto create it with random string. + */ +@property (nonatomic, copy) NSString *identifier; + +/** + store prefix + */ +@property (nonatomic, copy) NSString *prefix; + +/** + rule status, whether use this rule.default value is YES. + */ +@property (nonatomic, assign) BOOL status; + +/** + expire after the days + */ +@property (nonatomic, copy) NSString *days; + +/** + expire date, e.g.: 2022-10-11T00:00:00.000Z date and days only set one. + */ +@property (nonatomic, copy) NSString *expireDate; + +/** + expire after the days for multipart + */ +@property (nonatomic, copy) NSString *multipartDays; + +/** + expire date for multipart, e.g.: 2022-10-11T00:00:00.000Z date and days only set one. + */ +@property (nonatomic, copy) NSString *multipartExpireDate; + +/** + expire after the days for bucket storage class IA + */ +@property (nonatomic, copy) NSString *iaDays; + +/** + expire date for bucket storage class IA, e.g.: 2022-10-11T00:00:00.000Z date and days only set one. + */ +@property (nonatomic, copy) NSString *iaExpireDate; + +/** + expire after the days for bucket storage class archive + */ +@property (nonatomic, copy) NSString *archiveDays; + +/** + expire date for bucket storage class archive, e.g.: 2022-10-11T00:00:00.000Z date and days only set one. + */ +@property (nonatomic, copy) NSString *archiveExpireDate; + +@end + + +@interface OSSPutBucketLifecycleRequest : OSSRequest + +/** + bucket name + */ +@property (nonatomic, copy) NSString *bucketName; + +/** + rule config list, each Rule is an instance of OSSBucketLifecycleRule. + */ +@property (nonatomic, copy) NSArray *rules; + +@end + +@interface OSSPutBucketLifecycleResult : OSSResult + +@end + + +@interface OSSGetBucketLifecycleRequest : OSSRequest + +/** + bucket name + */ +@property (nonatomic, copy) NSString *bucketName; + +@end + + +@interface OSSGetBucketLifecycleResult : OSSResult + +/** + rule config list, each Rule is an instance of OSSBucketLifecycleRule. + */ +@property (nonatomic, copy) NSArray *rules; + +@end + +@interface OSSDeleteBucketLifecycleRequest : OSSRequest + +/** + bucket name + */ +@property (nonatomic, copy) NSString *bucketName; + +@end + +@interface OSSDeleteBucketLifecycleResult : OSSResult + +@end + /** The request class to get object metadata */ diff --git a/AliyunOSSSDK/OSSModel.m b/AliyunOSSSDK/OSSModel.m index ca09c0d9..1e4253a3 100644 --- a/AliyunOSSSDK/OSSModel.m +++ b/AliyunOSSSDK/OSSModel.m @@ -629,6 +629,18 @@ @implementation OSSListMultipartUploadsResult @implementation OSSGetBucketResult @end +@implementation OSSPutBucketACLRequest + +- (NSDictionary *)requestParams { + return @{@"acl": @""}; +} + +@end + +@implementation OSSPutBucketACLResult + +@end + @implementation OSSGetBucketACLRequest - (NSDictionary *)requestParams { @@ -640,6 +652,143 @@ - (NSDictionary *)requestParams { @implementation OSSGetBucketACLResult @end +@implementation OSSPutBucketLoggingRequest + +- (NSDictionary *)requestParams +{ + return @{@"logging": @""}; +} + +@end + +@implementation OSSPutBucketLoggingResult + +@end + +@implementation OSSGetBucketLoggingRequest + +- (NSDictionary *)requestParams +{ + return @{@"logging": @""}; +} + +@end + +@implementation OSSGetBucketLoggingResult + +@end + +@implementation OSSDeleteBucketLoggingRequest + +- (NSDictionary *)requestParams +{ + return @{@"logging": @""}; +} + +@end + +@implementation OSSDeleteBucketLoggingResult + +@end + +@implementation OSSPutBucketRefererRequest + +- (instancetype)init +{ + self = [super init]; + if (self) { + _allowEmpty = YES; + } + return self; +} + +- (NSDictionary *)requestParams +{ + return @{@"referer" : @""}; +} + +@end + +@implementation OSSPutBucketRefererResult + +@end + +@implementation OSSGetBucketRefererRequest + +- (NSDictionary *)requestParams +{ + return @{@"referer" : @""}; +} + +@end + +@implementation OSSGetBucketRefererResult + +@end + +@implementation OSSBucketLifecycleRule + +- (instancetype)init +{ + self = [super init]; + if (self) { + _status = YES; + } + return self; +} + +- (id)copyWithZone:(NSZone *)zone { + OSSBucketLifecycleRule *other = [[[self class] allocWithZone:zone] init]; + other.identifier = self.identifier; + other.expireDate = self.expireDate; + other.prefix = self.prefix; + other.status = self.status; + other.days = self.days; + + return other; +} + +@end + +@implementation OSSPutBucketLifecycleRequest + +- (NSDictionary *)requestParams +{ + return @{@"lifecycle" : @""}; +} + +@end + +@implementation OSSPutBucketLifecycleResult + +@end + +@implementation OSSGetBucketLifecycleRequest + +- (NSDictionary *)requestParams +{ + return @{@"lifecycle" : @""}; +} + +@end + +@implementation OSSGetBucketLifecycleResult + +@end + +@implementation OSSDeleteBucketLifecycleRequest + +- (NSDictionary *)requestParams +{ + return @{@"lifecycle" : @""}; +} + +@end + +@implementation OSSDeleteBucketLifecycleResult + +@end + @implementation OSSHeadObjectRequest @end diff --git a/AliyunOSSSDK/OSSRequest+Utils.h b/AliyunOSSSDK/OSSRequest+Utils.h new file mode 100644 index 00000000..f88b93b4 --- /dev/null +++ b/AliyunOSSSDK/OSSRequest+Utils.h @@ -0,0 +1,52 @@ +// +// OSSRequest+Utils.h +// AliyunOSSSDK +// +// Created by huaixu on 2018/11/19. +// Copyright © 2018 aliyun. All rights reserved. +// + +#import "OSSModel.h" +#import "OSSNetworkingRequestDelegate.h" + +NS_ASSUME_NONNULL_BEGIN + +#pragma mark - OSSRequest and its subClasses's category + +/** + * extend OSSRequest to include the ref to networking request object + */ +@interface OSSRequest () + +@property (nonatomic, strong) OSSNetworkingRequestDelegate * requestDelegate; + +@end + + +@interface OSSPutBucketACLRequest (ACL) + +@property (nonatomic, copy, readonly) NSString *acl; + +@end + + +@interface OSSPutBucketLoggingRequest (Logging) + +@property (nonatomic, copy, readonly) NSData *xmlBody; + +@end + +@interface OSSPutBucketRefererRequest (Referer) + +@property (nonatomic, copy, readonly) NSData *xmlBody; + +@end + +@interface OSSPutBucketLifecycleRequest (Lifecycle) + +@property (nonatomic, copy, readonly) NSData *xmlBody; + +@end + + +NS_ASSUME_NONNULL_END diff --git a/AliyunOSSSDK/OSSRequest+Utils.m b/AliyunOSSSDK/OSSRequest+Utils.m new file mode 100644 index 00000000..72a5d793 --- /dev/null +++ b/AliyunOSSSDK/OSSRequest+Utils.m @@ -0,0 +1,104 @@ +// +// OSSRequest+Utils.m +// AliyunOSSSDK +// +// Created by huaixu on 2018/11/19. +// Copyright © 2018 aliyun. All rights reserved. +// + +#import "OSSRequest+Utils.h" + +@implementation OSSPutBucketACLRequest (ACL) + +- (NSString *)acl { + NSString *rAcl = nil; + switch (self.aclType) { + case OSSACLPublicRead: + rAcl = @"public-read"; + break; + case OSSACLPublicReadAndWrite: + rAcl = @"public-read-write"; + break; + + default: + rAcl = @"private"; + break; + } + + return rAcl; +} + +@end + +@implementation OSSPutBucketLoggingRequest (Logging) + +- (NSData *)xmlBody +{ + NSMutableString *sRetBody = [NSMutableString string]; + [sRetBody appendFormat:@"\n\n\n%@\n%@\n\n", self.targetBucketName, self.targetPrefix]; + return [sRetBody dataUsingEncoding:NSUTF8StringEncoding]; +} + +@end + + +@implementation OSSPutBucketRefererRequest (Referer) + +- (NSData *)xmlBody +{ + NSString *s_allowEmpty = self.allowEmpty ? @"true" : @"false"; + NSMutableString *sRetBody = [NSMutableString string]; + [sRetBody appendFormat:@"\n\n%@", s_allowEmpty]; + + if (self.referers.count > 0) { + [sRetBody appendFormat:@"\n"]; + for (NSString *referer in self.referers) { + [sRetBody appendFormat:@"\n%@", referer]; + } + [sRetBody appendFormat:@"\n"]; + } + [sRetBody appendFormat:@"\n"]; + + return [sRetBody dataUsingEncoding:NSUTF8StringEncoding]; +} + +@end + + +@implementation OSSPutBucketLifecycleRequest (Lifecycle) + +- (NSData *)xmlBody +{ + NSMutableString *sRetBody = [NSMutableString string]; + [sRetBody appendFormat:@"\n"]; + + if (self.rules.count > 0) { + for (OSSBucketLifecycleRule *rule in self.rules) { + NSString *s_status = rule.status ? @"Enabled" : @"Disabled"; + NSString *s_expiration = rule.days ? [NSString stringWithFormat:@"%@", rule.days] : [NSString stringWithFormat:@"%@", rule.expireDate]; + + [sRetBody appendFormat:@"\n\n%@\n%@\n%@\n\n%@\n", rule.identifier, rule.prefix, s_status, s_expiration]; + + if (rule.multipartDays || rule.multipartExpireDate) { + NSString *s_expirationForMultipart = rule.multipartDays ? [NSString stringWithFormat:@"\n%@\n", rule.multipartDays] : [NSString stringWithFormat:@"\n%@\n", rule.multipartExpireDate]; + [sRetBody appendString:s_expirationForMultipart]; + } + + if (rule.iaDays || rule.iaExpireDate) { + NSString *s_expirationForMultipart = rule.iaDays ? [NSString stringWithFormat:@"\n\n%@\nIA\n", rule.iaDays] : [NSString stringWithFormat:@"\n%@\nIA\n", rule.iaExpireDate]; + [sRetBody appendString:s_expirationForMultipart]; + } else if (rule.archiveDays || rule.archiveExpireDate) { + NSString *s_expirationForMultipart = rule.archiveDays ? [NSString stringWithFormat:@"\n%@\nArchive\n", rule.archiveDays] : [NSString stringWithFormat:@"\n%@\nArchive\n", rule.archiveExpireDate]; + [sRetBody appendString:s_expirationForMultipart]; + } + + [sRetBody appendString:@"\n"]; + } + + } + [sRetBody appendFormat:@"\n"]; + + return [sRetBody dataUsingEncoding:NSUTF8StringEncoding]; +} + +@end diff --git a/AliyunOSSiOSTests/OSSBucketTests.m b/AliyunOSSiOSTests/OSSBucketTests.m index 9a35d7b8..72090c40 100644 --- a/AliyunOSSiOSTests/OSSBucketTests.m +++ b/AliyunOSSiOSTests/OSSBucketTests.m @@ -148,4 +148,174 @@ - (void)testListMultipartUploads [OSSTestUtils cleanBucket:@"oss-ios-bucket-list-multipart-uploads-test" with:_client]; } +- (void)testPutBucketACL +{ + OSSCreateBucketRequest *req = [OSSCreateBucketRequest new]; + req.bucketName = @"oss-ios-bucket-put-bucket-acl"; + [[_client createBucket:req] waitUntilFinished]; + + OSSPutBucketACLRequest *putBucketACLReq = [[OSSPutBucketACLRequest alloc] init]; + putBucketACLReq.bucketName = @"oss-ios-bucket-put-bucket-acl"; + putBucketACLReq.aclType = OSSACLPublicRead; + + OSSTask *putBucketACLTask = [_client putBucketACL:putBucketACLReq]; + + [[putBucketACLTask continueWithBlock:^id(OSSTask *task) { + XCTAssertNil(task.error); + return nil; + }] waitUntilFinished]; + + [OSSTestUtils cleanBucket:@"oss-ios-bucket-put-bucket-acl" with:_client]; +} + +- (void)testBucketLogging +{ + OSSCreateBucketRequest *createBucketSrcReq = [OSSCreateBucketRequest new]; + createBucketSrcReq.bucketName = @"oss-ios-bucket-logging-source"; + [[_client createBucket:createBucketSrcReq] waitUntilFinished]; + + OSSCreateBucketRequest *createBucketTargetReq = [OSSCreateBucketRequest new]; + createBucketTargetReq.bucketName = @"oss-ios-bucket-logging-bucket"; + [[_client createBucket:createBucketTargetReq] waitUntilFinished]; + + OSSPutBucketLoggingRequest *putBucketLoggingReq = [[OSSPutBucketLoggingRequest alloc] init]; + putBucketLoggingReq.bucketName = @"oss-ios-bucket-logging-source"; + putBucketLoggingReq.targetBucketName = @"oss-ios-bucket-logging-bucket"; + putBucketLoggingReq.targetPrefix = @"oss-ios-bucket-logging-prefix"; + + OSSTask *putBucketLoggingTask = [_client putBucketLogging:putBucketLoggingReq]; + + [[putBucketLoggingTask continueWithBlock:^id(OSSTask *task) { + XCTAssertNil(task.error); + return nil; + }] waitUntilFinished]; + + OSSGetBucketLoggingRequest *getBucketLoggingReq = [[OSSGetBucketLoggingRequest alloc] init]; + getBucketLoggingReq.bucketName = @"oss-ios-bucket-logging-source"; + + OSSTask *getBucketLoggingTask = [_client getBucketLogging:getBucketLoggingReq]; + + [[getBucketLoggingTask continueWithBlock:^id(OSSTask *task) { + XCTAssertNil(task.error); + XCTAssertNotNil(task.result); + OSSGetBucketLoggingResult *result = (OSSGetBucketLoggingResult *)task.result; + XCTAssertTrue(result.loggingEnabled); + XCTAssertTrue([result.targetPrefix isEqualToString:@"oss-ios-bucket-logging-prefix"]); + XCTAssertTrue([result.targetBucketName isEqualToString:@"oss-ios-bucket-logging-bucket"]); + + return nil; + }] waitUntilFinished]; + + OSSDeleteBucketLoggingRequest *delBucketLoggingReq = [[OSSDeleteBucketLoggingRequest alloc] init]; + delBucketLoggingReq.bucketName = @"oss-ios-bucket-logging-source"; + + OSSTask *delBucketLoggingTask = [_client deleteBucketLogging:delBucketLoggingReq]; + + [[delBucketLoggingTask continueWithBlock:^id(OSSTask *task) { + XCTAssertNil(task.error); + return nil; + }] waitUntilFinished]; + + [OSSTestUtils cleanBucket:@"oss-ios-bucket-logging-bucket" with:_client]; + [OSSTestUtils cleanBucket:@"oss-ios-bucket-logging-source" with:_client]; +} + +- (void)testBucketReferer +{ + OSSCreateBucketRequest *createBucketSrcReq = [OSSCreateBucketRequest new]; + createBucketSrcReq.bucketName = @"oss-ios-sdk-test-bucket-referer"; + [[_client createBucket:createBucketSrcReq] waitUntilFinished]; + + OSSPutBucketRefererRequest *putBucketRefererReq = [[OSSPutBucketRefererRequest alloc] init]; + putBucketRefererReq.bucketName = @"oss-ios-sdk-test-bucket-referer"; + putBucketRefererReq.allowEmpty = YES; + putBucketRefererReq.referers = @[@"http://www.aliyun.com", @"http://www.taobao.com"]; + + OSSTask *putBucketRefererTask = [_client putBucketReferer:putBucketRefererReq]; + + [[putBucketRefererTask continueWithBlock:^id(OSSTask *task) { + XCTAssertNil(task.error); + return nil; + }] waitUntilFinished]; + + OSSGetBucketRefererRequest *getBucketRefererReq = [[OSSGetBucketRefererRequest alloc] init]; + getBucketRefererReq.bucketName = @"oss-ios-sdk-test-bucket-referer"; + + OSSTask *getBucketRefererTask = [_client getBucketReferer:getBucketRefererReq]; + + [[getBucketRefererTask continueWithBlock:^id(OSSTask *task) { + XCTAssertNil(task.error); + XCTAssertNotNil(task.result); + OSSGetBucketRefererResult *result = (OSSGetBucketRefererResult *)task.result; + XCTAssertTrue(result.allowEmpty); + XCTAssertTrue([result.referers containsObject:@"http://www.aliyun.com"]); + XCTAssertTrue([result.referers containsObject:@"http://www.taobao.com"]); + + return nil; + }] waitUntilFinished]; + + [OSSTestUtils cleanBucket:@"oss-ios-sdk-test-bucket-referer" with:_client]; +} + +- (void)testBucketLifecycle +{ + NSString *lifecycle_bucket_name = @"oss-ios-sdk-test-bucket-lifecycle"; + OSSCreateBucketRequest *createBucketSrcReq = [OSSCreateBucketRequest new]; + createBucketSrcReq.bucketName = lifecycle_bucket_name; + [[_client createBucket:createBucketSrcReq] waitUntilFinished]; + + OSSPutBucketLifecycleRequest *putBucketLifecycleReq = [[OSSPutBucketLifecycleRequest alloc] init]; + putBucketLifecycleReq.bucketName = lifecycle_bucket_name; + + OSSBucketLifecycleRule *rule1 = [[OSSBucketLifecycleRule alloc] init]; + + rule1.identifier = @"1"; + rule1.status = YES; + rule1.prefix = @"rule1prefix"; + rule1.days = @"2"; + rule1.iaDays = @"1"; + rule1.multipartDays = @"1"; + + OSSBucketLifecycleRule *rule2 = [[OSSBucketLifecycleRule alloc] init]; + + rule2.identifier = @"2"; + rule2.status = YES; + rule2.prefix = @"rule2prefix"; + rule2.days = @"3"; + rule2.iaDays = @"2"; + rule2.multipartDays = @"2"; + + putBucketLifecycleReq.rules = @[rule1, rule2]; + + OSSTask *putBucketLifecycleTask = [_client putBucketLifecycle:putBucketLifecycleReq]; + + [[putBucketLifecycleTask continueWithBlock:^id(OSSTask *task) { + XCTAssertNil(task.error); + return nil; + }] waitUntilFinished]; + + OSSGetBucketLifecycleRequest *getBucketLifecycleReq = [[OSSGetBucketLifecycleRequest alloc] init]; + getBucketLifecycleReq.bucketName = lifecycle_bucket_name; + + OSSTask *getBucketLifecycleTask = [_client getBucketLifecycle:getBucketLifecycleReq]; + + [[getBucketLifecycleTask continueWithBlock:^id(OSSTask *task) { + XCTAssertNil(task.error); + + return nil; + }] waitUntilFinished]; + + OSSDeleteBucketLifecycleRequest *deleteBucketLifecycleReq = [[OSSDeleteBucketLifecycleRequest alloc] init]; + deleteBucketLifecycleReq.bucketName = lifecycle_bucket_name; + + OSSTask *deleteBucketLifecycleTask = [_client deleteBucketLifecycle:deleteBucketLifecycleReq]; + [[deleteBucketLifecycleTask continueWithBlock:^id(OSSTask *task) { + XCTAssertNil(task.error); + + return nil; + }] waitUntilFinished]; + + [OSSTestUtils cleanBucket:lifecycle_bucket_name with:_client]; +} + @end