Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

More work on S3 refactor

  • Loading branch information...
commit f3b6bc49bd34de91e69f4d2b978be3f078f23c70 1 parent 198761b
@pokeb authored
View
2  Classes/ASIHTTPRequest.m
@@ -21,7 +21,7 @@
#import "ASIInputStream.h"
// Automatically set on build
-NSString *ASIHTTPRequestVersion = @"v1.6-6 2010-03-16";
+NSString *ASIHTTPRequestVersion = @"v1.6-7 2010-03-16";
NSString* const NetworkRequestErrorDomain = @"ASIHTTPRequestErrorDomain";
View
34 Classes/ASIS3Bucket.h
@@ -0,0 +1,34 @@
+//
+// ASIS3Bucket.h
+// Part of ASIHTTPRequest -> http://allseeing-i.com/ASIHTTPRequest
+//
+// Created by Ben Copsey on 16/03/2010.
+// Copyright 2010 All-Seeing Interactive. All rights reserved.
+//
+// Instances of this class represent buckets stored on S3
+// ASIS3ServiceRequests return an array of ASIS3Buckets when you perform a service GET query
+// You'll probably never need to create instances of ASIS3Bucket yourself
+
+#import <Foundation/Foundation.h>
+
+
+@interface ASIS3Bucket : NSObject {
+
+ // The name of this bucket (will be unique throughout S3)
+ NSString *name;
+
+ // The date this bucket was created
+ NSDate *creationDate;
+
+ // Information about the owner of this bucket
+ NSString *ownerID;
+ NSString *ownerName;
+}
+
++ (id)bucketWithOwnerID:(NSString *)ownerID ownerName:(NSString *)ownerName;
+
+@property (retain) NSString *name;
+@property (retain) NSDate *creationDate;
+@property (retain) NSString *ownerID;
+@property (retain) NSString *ownerName;
+@end
View
32 Classes/ASIS3Bucket.m
@@ -0,0 +1,32 @@
+//
+// ASIS3Bucket.m
+// Part of ASIHTTPRequest -> http://allseeing-i.com/ASIHTTPRequest
+//
+// Created by Ben Copsey on 16/03/2010.
+// Copyright 2010 All-Seeing Interactive. All rights reserved.
+//
+
+#import "ASIS3Bucket.h"
+
+
+@implementation ASIS3Bucket
+
++ (id)bucketWithOwnerID:(NSString *)ownerID ownerName:(NSString *)ownerName
+{
+ ASIS3Bucket *bucket = [[[self alloc] init] autorelease];
+ [bucket setOwnerID:ownerID];
+ [bucket setOwnerName:ownerName];
+ return bucket;
+}
+
+- (NSString *)description
+{
+ return [NSString stringWithFormat:@"Name: %@ creationDate: %@ ownerID: %@ ownerName: %@",[self name],[self creationDate],[self ownerID],[self ownerName]];
+}
+
+
+@synthesize name;
+@synthesize creationDate;
+@synthesize ownerID;
+@synthesize ownerName;
+@end
View
8 Classes/ASIS3BucketRequest.h
@@ -13,8 +13,12 @@
@class ASIS3BucketObject;
@interface ASIS3BucketRequest : ASIS3Request {
+
// Name of the bucket to talk to
NSString *bucket;
+
+ // A parameter passed to S3 in the query string to tell it to return specialised information
+ // Consult the S3 REST API documentation for more info
NSString *subResource;
// Options for filtering GET requests
@@ -56,10 +60,6 @@
//Builds a query string out of the list parameters we supplied
- (void)createQueryString;
-// Returns a date formatter than can be used to parse a date from S3
-+ (NSDateFormatter *)dateFormatter;
-
-
@property (retain) NSString *bucket;
@property (retain) NSString *subResource;
@property (retain) NSString *prefix;
View
19 Classes/ASIS3BucketRequest.m
@@ -9,8 +9,6 @@
#import "ASIS3BucketRequest.h"
#import "ASIS3BucketObject.h"
-static NSDateFormatter *dateFormatter = nil;
-
// Private stuff
@interface ASIS3BucketRequest ()
@@ -22,18 +20,6 @@ @interface ASIS3BucketRequest ()
@implementation ASIS3BucketRequest
-+ (NSDateFormatter *)dateFormatter
-{
- if (!dateFormatter) {
- dateFormatter = [[NSDateFormatter alloc] init];
- [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
- [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
- [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'.000Z'"];
- }
- return dateFormatter;
-}
-
-
+ (id)requestWithBucket:(NSString *)bucket
{
ASIS3ObjectRequest *request = [[[self alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://%@.s3.amazonaws.com",bucket]]] autorelease];
@@ -87,9 +73,6 @@ - (NSString *)canonicalizedResource
return [NSString stringWithFormat:@"/%@/",[self bucket]];
}
-
-
-
- (void)createQueryString
{
NSMutableArray *queryParts = [[[NSMutableArray alloc] init] autorelease];
@@ -149,7 +132,7 @@ - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName names
} else if ([elementName isEqualToString:@"Key"]) {
[[self currentObject] setKey:[self currentContent]];
} else if ([elementName isEqualToString:@"LastModified"]) {
- [[self currentObject] setLastModified:[[ASIS3BucketRequest dateFormatter] dateFromString:[self currentContent]]];
+ [[self currentObject] setLastModified:[[ASIS3Request dateFormatter] dateFromString:[self currentContent]]];
} else if ([elementName isEqualToString:@"ETag"]) {
[[self currentObject] setETag:[self currentContent]];
} else if ([elementName isEqualToString:@"Size"]) {
View
2  Classes/ASIS3ObjectRequest.h
@@ -5,7 +5,7 @@
// Created by Ben Copsey on 16/03/2010.
// Copyright 2010 All-Seeing Interactive. All rights reserved.
//
-// Use this class to fetch, upload, copy and delete objects on Amazon S3
+// Use an ASIS3ObjectRequest to fetch, upload, copy and delete objects on Amazon S3
#import <Foundation/Foundation.h>
#import "ASIS3Request.h"
View
7 Classes/ASIS3ObjectRequest.m
@@ -99,7 +99,6 @@ - (void)dealloc
[mimeType release];
[sourceKey release];
[sourceBucket release];
- [accessPolicy release];
[super dealloc];
}
@@ -120,10 +119,7 @@ - (NSString *)canonicalizedResource
- (NSMutableDictionary *)S3Headers
{
- NSMutableDictionary *headers = [NSMutableDictionary dictionary];
- if ([self accessPolicy]) {
- [headers setObject:[self accessPolicy] forKey:@"x-amz-acl"];
- }
+ NSMutableDictionary *headers = [super S3Headers];
if ([self sourceKey]) {
NSString *path = [ASIS3Request stringByURLEncodingForS3Path:[self sourceKey]];
[headers setObject:[[self sourceBucket] stringByAppendingString:path] forKey:@"x-amz-copy-source"];
@@ -146,5 +142,4 @@ - (NSString *)stringToSignForHeaders:(NSString *)canonicalizedAmzHeaders resourc
@synthesize sourceBucket;
@synthesize sourceKey;
@synthesize mimeType;
-@synthesize accessPolicy;
@end
View
16 Classes/ASIS3ServiceRequest.h
@@ -10,10 +10,24 @@
#import <Foundation/Foundation.h>
#import "ASIS3Request.h"
-@interface ASIS3ServiceRequest : ASIS3Request {
+@class ASIS3Bucket;
+@interface ASIS3ServiceRequest : ASIS3Request {
+
+ // Internally used while parsing the response
+ NSString *currentContent;
+ NSString *currentElement;
+ ASIS3Bucket *currentBucket;
+ NSMutableArray *buckets;
+ NSString *ownerName;
+ NSString *ownerID;
}
+// Perform a GET request on the S3 service
+// This will fetch a list of the buckets attached to the S3 account
+ (id)serviceRequest;
+// Parse the XML response from S3, and return an array of ASIS3Bucket objects
+- (NSArray *)allBuckets;
+
@end
View
72 Classes/ASIS3ServiceRequest.m
@@ -7,7 +7,17 @@
//
#import "ASIS3ServiceRequest.h"
+#import "ASIS3Bucket.h"
+// Private stuff
+@interface ASIS3ServiceRequest ()
+@property (retain, nonatomic) NSMutableArray *buckets;
+@property (retain, nonatomic) NSString *currentContent;
+@property (retain, nonatomic) NSString *currentElement;
+@property (retain, nonatomic) ASIS3Bucket *currentBucket;
+@property (retain, nonatomic) NSString *ownerID;
+@property (retain, nonatomic) NSString *ownerName;
+@end
@implementation ASIS3ServiceRequest
@@ -16,5 +26,67 @@ + (id)serviceRequest
return [[[self alloc] initWithURL:[NSURL URLWithString:@"http://s3.amazonaws.com"]] autorelease];
}
+- (void)dealloc
+{
+ [buckets release];
+ [currentContent release];
+ [currentElement release];
+ [currentBucket release];
+ [ownerID release];
+ [ownerName release];
+ [super dealloc];
+}
+
+- (NSArray *)allBuckets
+{
+ if ([self buckets]) {
+ return [self buckets];
+ }
+ [self setBuckets:[[[NSMutableArray alloc] init] autorelease]];
+ NSXMLParser *parser = [[[NSXMLParser alloc] initWithData:[self responseData]] autorelease];
+ [parser setDelegate:self];
+ [parser setShouldProcessNamespaces:NO];
+ [parser setShouldReportNamespacePrefixes:NO];
+ [parser setShouldResolveExternalEntities:NO];
+ [parser parse];
+ return [self buckets];
+}
+
+- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
+{
+ [self setCurrentElement:elementName];
+
+ if ([elementName isEqualToString:@"Bucket"]) {
+ [self setCurrentBucket:[ASIS3Bucket bucketWithOwnerID:[self ownerID] ownerName:[self ownerName]]];
+ }
+ [self setCurrentContent:@""];
+}
+
+- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
+{
+ if ([elementName isEqualToString:@"Bucket"]) {
+ [[self buckets] addObject:[self currentBucket]];
+ [self setCurrentBucket:nil];
+ } else if ([elementName isEqualToString:@"Name"]) {
+ [[self currentBucket] setName:[self currentContent]];
+ } else if ([elementName isEqualToString:@"CreationDate"]) {
+ [[self currentBucket] setCreationDate:[[ASIS3Request dateFormatter] dateFromString:[self currentContent]]];
+ } else if ([elementName isEqualToString:@"ID"]) {
+ [self setOwnerID:[self currentContent]];
+ } else if ([elementName isEqualToString:@"DisplayName"]) {
+ [self setOwnerName:[self currentContent]];
+ }
+}
+
+- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
+{
+ [self setCurrentContent:[[self currentContent] stringByAppendingString:string]];
+}
+@synthesize buckets;
+@synthesize currentContent;
+@synthesize currentElement;
+@synthesize currentBucket;
+@synthesize ownerID;
+@synthesize ownerName;
@end
View
2  Classes/S3/ASIS3BucketObject.h
@@ -6,7 +6,7 @@
// Copyright 2009 All-Seeing Interactive. All rights reserved.
//
// Instances of this class represent objects stored in a bucket on S3
-// ASIS3BucketRequests return an array of ASIS3BucketObject when you perform a list query
+// ASIS3BucketRequests return an array of ASIS3BucketObjects when you perform a list query
#import <Foundation/Foundation.h>
@class ASIS3ObjectRequest;
View
31 Classes/S3/ASIS3Request.h
@@ -43,31 +43,40 @@ typedef enum _ASIS3ErrorType {
// Internally used while parsing errors
NSString *currentErrorString;
-
}
-#pragma mark Constructors
-
-
// Uses the supplied date to create a Date header string
- (void)setDate:(NSDate *)date;
+// Will return a dictionary of the 'amz-' headers that wil be sent to S3
+// Override in subclasses to add new ones
- (NSMutableDictionary *)S3Headers;
+
+// Returns the string that will used to create a signature for this request
+// Is overridden in ASIS3ObjectRequest
- (NSString *)stringToSignForHeaders:(NSString *)canonicalizedAmzHeaders resource:(NSString *)canonicalizedResource;
-
-# pragma mark encoding S3 key
-
-+ (NSString *)stringByURLEncodingForS3Path:(NSString *)key;
-
-#pragma mark Shared access keys
+// Parses the response to work out if S3 returned an error
+- (void)parseResponseXML;
+
+#pragma mark shared access keys
// Get and set the global access key, this will be used for all requests the access key hasn't been set for
+ (NSString *)sharedAccessKey;
+ (void)setSharedAccessKey:(NSString *)newAccessKey;
+ (NSString *)sharedSecretAccessKey;
+ (void)setSharedSecretAccessKey:(NSString *)newAccessKey;
-- (void)parseResponseXML;
+
+# pragma mark helpers
+
+// Returns a date formatter than can be used to parse a date from S3
++ (NSDateFormatter *)dateFormatter;
+
+// URL-encodes an S3 key so it can be used in a url
+// You shouldn't normally need to use this yourself
++ (NSString *)stringByURLEncodingForS3Path:(NSString *)key;
+
+
@property (retain) NSString *dateString;
@property (retain) NSString *accessKey;
View
62 Classes/S3/ASIS3Request.m
@@ -17,6 +17,10 @@
static NSString *sharedAccessKey = nil;
static NSString *sharedSecretAccessKey = nil;
+static NSDateFormatter *dateFormatter = nil;
+
+
+
// Private stuff
@interface ASIS3Request ()
+ (NSData *)HMACSHA1withKey:(NSString *)key forString:(NSString *)string;
@@ -25,36 +29,23 @@ + (NSData *)HMACSHA1withKey:(NSString *)key forString:(NSString *)string;
@implementation ASIS3Request
-#pragma mark Constructors
-
-+ (NSString *)stringByURLEncodingForS3Path:(NSString *)key
-{
- if (!key) {
- return @"/";
- }
- NSString *path = [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)key, NULL, CFSTR(":?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)) autorelease];
- if (![[path substringWithRange:NSMakeRange(0, 1)] isEqualToString:@"/"]) {
- path = [@"/" stringByAppendingString:path];
- }
- return path;
-}
-
- (void)dealloc
{
[dateString release];
[accessKey release];
[secretAccessKey release];
+ [accessPolicy release];
[super dealloc];
}
- (void)setDate:(NSDate *)date
{
- NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
+ NSDateFormatter *headerDateFormatter = [[[NSDateFormatter alloc] init] autorelease];
// Prevent problems with dates generated by other locales (tip from: http://rel.me/t/date/)
- [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
- [dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss Z"];
- [self setDateString:[dateFormatter stringFromDate:date]];
+ [headerDateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
+ [headerDateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss Z"];
+ [self setDateString:[headerDateFormatter stringFromDate:date]];
}
- (ASIHTTPRequest *)HEADRequest
@@ -67,7 +58,11 @@ - (ASIHTTPRequest *)HEADRequest
- (NSMutableDictionary *)S3Headers
{
- return [NSMutableDictionary dictionary];
+ NSMutableDictionary *headers = [NSMutableDictionary dictionary];
+ if ([self accessPolicy]) {
+ [headers setObject:[self accessPolicy] forKey:@"x-amz-acl"];
+ }
+ return headers;
}
- (NSString *)canonicalizedResource
@@ -108,17 +103,14 @@ - (void)buildRequestHeaders
[self addRequestHeader:header value:[amzHeaders objectForKey:header]];
}
-
// Jump through hoops while eating hot food
NSString *stringToSign = [self stringToSignForHeaders:canonicalizedAmzHeaders resource:canonicalizedResource];
NSString *signature = [ASIHTTPRequest base64forData:[ASIS3Request HMACSHA1withKey:[self secretAccessKey] forString:stringToSign]];
NSString *authorizationString = [NSString stringWithFormat:@"AWS %@:%@",[self accessKey],signature];
[self addRequestHeader:@"Authorization" value:authorizationString];
-
}
-
- (void)requestFinished
{
if ([self responseStatusCode] < 207) {
@@ -197,7 +189,31 @@ + (void)setSharedSecretAccessKey:(NSString *)newAccessKey
}
-#pragma mark S3 Authentication helpers
+#pragma mark helpers
+
++ (NSString *)stringByURLEncodingForS3Path:(NSString *)key
+{
+ if (!key) {
+ return @"/";
+ }
+ NSString *path = [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)key, NULL, CFSTR(":?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)) autorelease];
+ if (![[path substringWithRange:NSMakeRange(0, 1)] isEqualToString:@"/"]) {
+ path = [@"/" stringByAppendingString:path];
+ }
+ return path;
+}
+
++ (NSDateFormatter *)dateFormatter
+{
+ if (!dateFormatter) {
+ dateFormatter = [[NSDateFormatter alloc] init];
+ [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
+ [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
+ [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'.000Z'"];
+ }
+ return dateFormatter;
+}
+
// From: http://stackoverflow.com/questions/476455/is-there-a-library-for-iphone-to-work-with-hmac-sha-1-encoding
View
45 Classes/Tests/ASIS3RequestTests.m
@@ -16,6 +16,10 @@
// Fill in these to run the tests that actually connect and manipulate objects on S3
static NSString *secretAccessKey = @"";
static NSString *accessKey = @"";
+
+// ********IMPORTANT***********************************************
+// Invent a new bucket name when running these tests
+// ***** NEVER USE AN EXISTING BUCKET - IT WILL BE DELETED! *******
static NSString *bucket = @"";
@@ -36,16 +40,6 @@ @implementation ASIS3BucketObjectSubclass;
@implementation ASIS3RequestTests
-
-- (void)testASIS3ServiceRequest
-{
- ASIS3ServiceRequest *request = [ASIS3ServiceRequest serviceRequest];
- [request setSecretAccessKey:secretAccessKey];
- [request setAccessKey:accessKey];
- [request startSynchronous];
- GHAssertNil([request error],@"Failed to fetch the list of buckets from S3");
-}
-
// All these tests are based on Amazon's examples at: http://docs.amazonwebservices.com/AmazonS3/2006-03-01/
- (void)testAuthenticationHeaderGeneration
{
@@ -101,7 +95,6 @@ - (void)testAuthenticationHeaderGeneration
GHAssertTrue(success,@"Failed to generate the correct authorisation header for a list request");
// Test fetch ACL
- key = @"?acl";
dateString = @"Tue, 27 Mar 2007 19:44:46 +0000";
listRequest = [ASIS3BucketRequest requestWithBucket:exampleBucket subResource:@"acl"];
[listRequest setDateString:dateString];
@@ -158,6 +151,29 @@ - (void)testREST
BOOL success = (![secretAccessKey isEqualToString:@""] && ![accessKey isEqualToString:@""] && ![bucket isEqualToString:@""]);
GHAssertTrue(success,@"You need to supply your S3 access details to run the REST test (see the top of ASIS3RequestTests.m)");
+ // Test creating a bucket
+ ASIS3BucketRequest *bucketRequest = [ASIS3BucketRequest PUTRequestWithBucket:bucket];
+ [bucketRequest setSecretAccessKey:secretAccessKey];
+ [bucketRequest setAccessKey:accessKey];
+ [bucketRequest startSynchronous];
+ GHAssertNil([bucketRequest error],@"Failed to create a bucket");
+
+ // List buckets to make sure the bucket is there
+ ASIS3ServiceRequest *serviceRequest = [ASIS3ServiceRequest serviceRequest];
+ [serviceRequest setSecretAccessKey:secretAccessKey];
+ [serviceRequest setAccessKey:accessKey];
+ [serviceRequest startSynchronous];
+ GHAssertNil([serviceRequest error],@"Failed to fetch the list of buckets from S3");
+
+ BOOL foundBucket = NO;
+ for (ASIS3Bucket *theBucket in [serviceRequest allBuckets]) {
+ if ([[theBucket name] isEqualToString:bucket]) {
+ foundBucket = YES;
+ break;
+ }
+ }
+ GHAssertTrue(foundBucket,@"Failed to retrive the newly-created bucket in a list of buckets");
+
NSString *key = @"test";
// Create the file
@@ -279,6 +295,13 @@ - (void)testREST
success = [[request responseString] isEqualToString:@""];
GHAssertTrue(success,@"Failed to DELETE the file from S3");
+ // Delete the bucket
+ bucketRequest = [ASIS3BucketRequest DELETERequestWithBucket:bucket];
+ [bucketRequest setSecretAccessKey:secretAccessKey];
+ [bucketRequest setAccessKey:accessKey];
+ [bucketRequest startSynchronous];
+ GHAssertNil([bucketRequest error],@"Failed to create a bucket");
+
}
View
6 Mac.xcodeproj/project.pbxproj
@@ -49,6 +49,7 @@
B5F92D18114FB3BD00070E84 /* ASIS3ServiceRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F92D17114FB3BD00070E84 /* ASIS3ServiceRequest.m */; };
B5F92D49114FB62C00070E84 /* ASIS3ObjectRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F92D48114FB62C00070E84 /* ASIS3ObjectRequest.m */; };
B5F92DFD114FC9E100070E84 /* ASIS3BucketRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F92DFC114FC9E100070E84 /* ASIS3BucketRequest.m */; };
+ B5F92FD7114FFA9700070E84 /* ASIS3Bucket.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F92FD6114FFA9700070E84 /* ASIS3Bucket.m */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@@ -138,6 +139,8 @@
B5F92D48114FB62C00070E84 /* ASIS3ObjectRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASIS3ObjectRequest.m; sourceTree = "<group>"; };
B5F92DFB114FC9E100070E84 /* ASIS3BucketRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASIS3BucketRequest.h; sourceTree = "<group>"; };
B5F92DFC114FC9E100070E84 /* ASIS3BucketRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASIS3BucketRequest.m; sourceTree = "<group>"; };
+ B5F92FD5114FFA9700070E84 /* ASIS3Bucket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASIS3Bucket.h; sourceTree = "<group>"; };
+ B5F92FD6114FFA9700070E84 /* ASIS3Bucket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASIS3Bucket.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -250,6 +253,8 @@
B5F92D48114FB62C00070E84 /* ASIS3ObjectRequest.m */,
B5873F8610FF2884001E145F /* ASIS3BucketObject.h */,
B5873F8710FF2884001E145F /* ASIS3BucketObject.m */,
+ B5F92FD5114FFA9700070E84 /* ASIS3Bucket.h */,
+ B5F92FD6114FFA9700070E84 /* ASIS3Bucket.m */,
B5873F8A10FF2884001E145F /* ASIS3Request.h */,
B5873F8B10FF2884001E145F /* ASIS3Request.m */,
);
@@ -476,6 +481,7 @@
B5F92D18114FB3BD00070E84 /* ASIS3ServiceRequest.m in Sources */,
B5F92D49114FB62C00070E84 /* ASIS3ObjectRequest.m in Sources */,
B5F92DFD114FC9E100070E84 /* ASIS3BucketRequest.m in Sources */,
+ B5F92FD7114FFA9700070E84 /* ASIS3Bucket.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Please sign in to comment.
Something went wrong with that request. Please try again.