Michael Mayo

full cdn management support

... ... @@ -8,14 +8,18 @@
#import "ASICloudFilesRequest.h"
@class ASICloudFilesContainerXMLParserDelegate;
@interface ASICloudFilesCDNRequest : ASICloudFilesRequest {
NSString *accountName;
NSString *containerName;
ASICloudFilesContainerXMLParserDelegate *xmlParserDelegate;
}
@property (nonatomic, retain) NSString *accountName;
@property (nonatomic, retain) NSString *containerName;
@property (nonatomic, retain) ASICloudFilesContainerXMLParserDelegate *xmlParserDelegate;
// HEAD /<api version>/<account>/<container>
... ... @@ -39,12 +43,18 @@
// PUT /<api version>/<account>/<container>
// PUT operations against a Container are used to CDN-enable that Container.
// Include an HTTP header of X-TTL to specify a custom TTL.
+ (id)putRequestWithContainer:(NSString *)containerName;
+ (id)putRequestWithContainer:(NSString *)containerName ttl:(NSUInteger)ttl;
// returns: - (NSString *)cdnURI;
// POST /<api version>/<account>/<container>
// POST operations against a CDN-enabled Container are used to adjust CDN attributes.
// The POST operation can be used to set a new TTL cache expiration or to enable/disable public sharing over the CDN.
// X-TTL: 86400
// X-CDN-Enabled: True
+ (id)postRequestWithContainer:(NSString *)containerName;
+ (id)postRequestWithContainer:(NSString *)containerName cdnEnabled:(BOOL)cdnEnabled ttl:(NSUInteger)ttl;
// returns: - (NSString *)cdnURI;
@end
... ...
... ... @@ -7,11 +7,12 @@
//
#import "ASICloudFilesCDNRequest.h"
#import "ASICloudFilesContainerXMLParserDelegate.h"
@implementation ASICloudFilesCDNRequest
@synthesize accountName, containerName;
@synthesize accountName, containerName, xmlParserDelegate;
+ (id)cdnRequestWithMethod:(NSString *)method query:(NSString *)query {
NSString *urlString = [NSString stringWithFormat:@"%@%@", [ASICloudFilesRequest cdnManagementURL], query];
... ... @@ -55,7 +56,7 @@
#pragma mark GET - CDN Container Lists
+ (id)listRequest {
ASICloudFilesCDNRequest *request = [ASICloudFilesCDNRequest cdnRequestWithMethod:@"GET" query:nil];
ASICloudFilesCDNRequest *request = [ASICloudFilesCDNRequest cdnRequestWithMethod:@"GET" query:@"?format=xml"];
return request;
}
... ... @@ -79,24 +80,64 @@
}
- (NSArray *)containers {
return nil;
if (xmlParserDelegate.containerObjects) {
return xmlParserDelegate.containerObjects;
}
NSLog(@"list response data: %@", [self responseString]);
NSXMLParser *parser = [[[NSXMLParser alloc] initWithData:[self responseData]] autorelease];
if (xmlParserDelegate == nil) {
xmlParserDelegate = [[ASICloudFilesContainerXMLParserDelegate alloc] init];
}
[parser setDelegate:xmlParserDelegate];
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
[parser parse];
return xmlParserDelegate.containerObjects;
}
// GET /<api version>/<account>
// limit, marker, format, enabled_only=true
// + (id)getObjectRequestWithContainer:(NSString *)containerName objectPath:(NSString *)objectPath;
#pragma mark -
#pragma mark PUT - CDN Enable Container
// PUT /<api version>/<account>/<container>
// PUT operations against a Container are used to CDN-enable that Container.
// Include an HTTP header of X-TTL to specify a custom TTL.
+ (id)putRequestWithContainer:(NSString *)containerName {
ASICloudFilesCDNRequest *request = [ASICloudFilesCDNRequest cdnRequestWithMethod:@"PUT" containerName:containerName];
return request;
}
+ (id)putRequestWithContainer:(NSString *)containerName ttl:(NSUInteger)ttl {
ASICloudFilesCDNRequest *request = [ASICloudFilesCDNRequest cdnRequestWithMethod:@"PUT" containerName:containerName];
[request addRequestHeader:@"X-Ttl" value:[NSString stringWithFormat:@"%i", ttl]];
return request;
}
#pragma mark -
#pragma mark POST - Adjust CDN Attributes
// POST /<api version>/<account>/<container>
// POST operations against a CDN-enabled Container are used to adjust CDN attributes.
// The POST operation can be used to set a new TTL cache expiration or to enable/disable public sharing over the CDN.
// X-TTL: 86400
// X-CDN-Enabled: True
+ (id)postRequestWithContainer:(NSString *)containerName {
ASICloudFilesCDNRequest *request = [ASICloudFilesCDNRequest cdnRequestWithMethod:@"POST" containerName:containerName];
return request;
}
+ (id)postRequestWithContainer:(NSString *)containerName cdnEnabled:(BOOL)cdnEnabled ttl:(NSUInteger)ttl {
ASICloudFilesCDNRequest *request = [ASICloudFilesCDNRequest cdnRequestWithMethod:@"POST" containerName:containerName];
if (ttl > 0) {
[request addRequestHeader:@"X-Ttl" value:[NSString stringWithFormat:@"%i", ttl]];
}
[request addRequestHeader:@"X-Ttl" value:cdnEnabled ? @"True" : @"False"];
return request;
}
#pragma mark -
#pragma mark Memory Management
... ... @@ -104,6 +145,7 @@
-(void)dealloc {
[accountName release];
[containerName release];
[xmlParserDelegate release];
[super dealloc];
}
... ...
... ... @@ -11,9 +11,6 @@
@class ASICloudFilesContainer, ASICloudFilesContainerXMLParserDelegate;
@interface ASICloudFilesContainerRequest : ASICloudFilesRequest {
NSMutableArray *containerObjects;
//NSUInteger containerCount;
//NSUInteger bytesUsed;
// Internally used while parsing the response
NSString *currentContent;
... ...
... ... @@ -111,10 +111,9 @@
#pragma mark Container List
- (NSArray *)containers {
if (containerObjects) {
return containerObjects;
if (xmlParserDelegate.containerObjects) {
return xmlParserDelegate.containerObjects;
}
containerObjects = [[[NSMutableArray alloc] init] autorelease];
//NSLog(@"list response data: %@", [self responseString]);
... ... @@ -133,68 +132,7 @@
}
#pragma mark -
#pragma mark XML Parser Delegate
/*
<container>
<name>playground</name>
<cdn_enabled>True</cdn_enabled>
<ttl>259200</ttl>
<cdn_url>http://c0023891.cdn.cloudfiles.rackspacecloud.com</cdn_url>
<log_retention>True</log_retention>
<referrer_acl></referrer_acl>
<useragent_acl></useragent_acl>
</container>
<account name="MossoCloudFS_56ad0327-43d6-4ac4-9883-797f5690238e">
<container><name>bigdir</name><count>1536</count><bytes>10752</bytes></container>
<container><name>cf_service</name><count>35</count><bytes>66151933</bytes></container>
<container><name>elcamino</name><count>15</count><bytes>162457114</bytes></container>
<container><name>laptop&#32;migration</name><count>15</count><bytes>225656510</bytes></container>
<container><name>mike&#32;mayo</name><count>2</count><bytes>499581</bytes></container>
<container><name>overhrd.com</name><count>12</count><bytes>205775052</bytes></container>
<container><name>personal</name><count>2</count><bytes>14158285</bytes></container>
<container><name>playground</name><count>4</count><bytes>2040999</bytes></container>
<container><name>pubcamino</name><count>1</count><bytes>219946</bytes></container>
<container><name>pubtest2</name><count>0</count><bytes>0</bytes></container>
<container><name>refreshtest</name><count>0</count><bytes>0</bytes></container>
<container><name>testfromapp</name><count>1</count><bytes>234288</bytes></container>
<container><name>wadecrash</name><count>5</count><bytes>19839804</bytes></container>
</account>
*/
/*
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
[self setCurrentElement:elementName];
if ([elementName isEqualToString:@"container"]) {
[self setCurrentObject:[ASICloudFilesContainer container]];
}
[self setCurrentContent:@""];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"name"]) {
[self currentObject].name = [self currentContent];
} else if ([elementName isEqualToString:@"count"]) {
//[[self currentObject] setKey:[self currentContent]];
[self currentObject].count = [[self currentContent] intValue];
} else if ([elementName isEqualToString:@"bytes"]) {
[self currentObject].bytes = [[self currentContent] intValue];
} else if ([elementName isEqualToString:@"container"]) {
// we're done with this container. time to move on to the next
[containerObjects addObject:currentObject];
[self setCurrentObject:nil];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
[self setCurrentContent:[[self currentContent] stringByAppendingString:string]];
}
*/
#pragma mark Memory Management
- (void)dealloc {
[currentElement release];
... ...
... ... @@ -17,40 +17,9 @@
#pragma mark -
#pragma mark XML Parser Delegate
/*
<container>
<name>playground</name>
<cdn_enabled>True</cdn_enabled>
<ttl>259200</ttl>
<cdn_url>http://c0023891.cdn.cloudfiles.rackspacecloud.com</cdn_url>
<log_retention>True</log_retention>
<referrer_acl></referrer_acl>
<useragent_acl></useragent_acl>
</container>
<account name="MossoCloudFS_56ad0327-43d6-4ac4-9883-797f5690238e">
<container><name>bigdir</name><count>1536</count><bytes>10752</bytes></container>
<container><name>cf_service</name><count>35</count><bytes>66151933</bytes></container>
<container><name>elcamino</name><count>15</count><bytes>162457114</bytes></container>
<container><name>laptop&#32;migration</name><count>15</count><bytes>225656510</bytes></container>
<container><name>mike&#32;mayo</name><count>2</count><bytes>499581</bytes></container>
<container><name>overhrd.com</name><count>12</count><bytes>205775052</bytes></container>
<container><name>personal</name><count>2</count><bytes>14158285</bytes></container>
<container><name>playground</name><count>4</count><bytes>2040999</bytes></container>
<container><name>pubcamino</name><count>1</count><bytes>219946</bytes></container>
<container><name>pubtest2</name><count>0</count><bytes>0</bytes></container>
<container><name>refreshtest</name><count>0</count><bytes>0</bytes></container>
<container><name>testfromapp</name><count>1</count><bytes>234288</bytes></container>
<container><name>wadecrash</name><count>5</count><bytes>19839804</bytes></container>
</account>
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
[self setCurrentElement:elementName];
NSLog(@"start %@", elementName);
if ([elementName isEqualToString:@"container"]) {
[self setCurrentObject:[ASICloudFilesContainer container]];
}
... ... @@ -59,15 +28,24 @@
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
NSLog(@"end %@", elementName);
if ([elementName isEqualToString:@"name"]) {
[self currentObject].name = [self currentContent];
} else if ([elementName isEqualToString:@"count"]) {
//[[self currentObject] setKey:[self currentContent]];
[self currentObject].count = [[self currentContent] intValue];
} else if ([elementName isEqualToString:@"bytes"]) {
[self currentObject].bytes = [[self currentContent] intValue];
} else if ([elementName isEqualToString:@"cdn_enabled"]) {
[self currentObject].cdnEnabled = [[self currentObject] isEqual:@"True"];
} else if ([elementName isEqualToString:@"ttl"]) {
[self currentObject].ttl = [[self currentContent] intValue];
} else if ([elementName isEqualToString:@"cdn_url"]) {
[self currentObject].cdnURL = [self currentContent];
} else if ([elementName isEqualToString:@"log_retention"]) {
[self currentObject].logRetention = [[self currentObject] isEqual:@"True"];
} else if ([elementName isEqualToString:@"referrer_acl"]) {
[self currentObject].referrerACL = [self currentContent];
} else if ([elementName isEqualToString:@"useragent_acl"]) {
[self currentObject].useragentACL = [self currentContent];
} else if ([elementName isEqualToString:@"container"]) {
// we're done with this container. time to move on to the next
if (containerObjects == nil) {
... ...
... ... @@ -21,7 +21,7 @@
#import "ASIInputStream.h"
// Automatically set on build
NSString *ASIHTTPRequestVersion = @"v1.2-29 2010-01-10";
NSString *ASIHTTPRequestVersion = @"v1.2-30 2010-01-10";
// We use our own custom run loop mode as CoreAnimation seems to want to hijack our threads otherwise
static CFStringRef ASIHTTPRequestRunMode = CFSTR("ASIHTTPRequest");
... ...