Revision 6d3af6ef
b/asi-http-request-with-pithos/Classes/Pithos/ASIPithosAccountRequest.h | ||
---|---|---|
51 | 51 |
|
52 | 52 |
// Internally used while parsing the response |
53 | 53 |
ASIPithosContainer *currentContainer; |
54 |
NSMutableDictionary *currentDictionary; |
|
55 |
NSString *currentKey; |
|
54 | 56 |
} |
55 | 57 |
|
56 | 58 |
@property (retain) ASIPithosContainer *currentContainer; |
59 |
@property (assign) NSMutableDictionary *currentDictionary; |
|
60 |
@property (retain) NSString *currentKey; |
|
57 | 61 |
|
58 | 62 |
// HEAD storageURL |
59 | 63 |
+ (id)accountMetadataRequest; |
b/asi-http-request-with-pithos/Classes/Pithos/ASIPithosAccountRequest.m | ||
---|---|---|
39 | 39 |
#import "ASIPithosContainer.h" |
40 | 40 |
|
41 | 41 |
@implementation ASIPithosAccountRequest |
42 |
@synthesize currentContainer; |
|
42 |
@synthesize currentContainer, currentDictionary, currentKey;
|
|
43 | 43 |
|
44 | 44 |
#pragma mark - |
45 | 45 |
#pragma mark Constructors |
... | ... | |
63 | 63 |
#pragma mark Memory Management |
64 | 64 |
|
65 | 65 |
- (void)dealloc { |
66 |
[currentKey release]; |
|
66 | 67 |
[currentContainer release]; |
67 | 68 |
[containers release]; |
68 | 69 |
[metadata release]; |
... | ... | |
177 | 178 |
if (limit && (limit > 0)) |
178 | 179 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&limit=%lu", limit]]; |
179 | 180 |
if (marker) |
180 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&marker=%@", [marker stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
|
|
181 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&marker=%@", [self encodeToPercentEscape:marker]]];
|
|
181 | 182 |
if (shared) |
182 | 183 |
queryString = [queryString stringByAppendingString:@"&shared="]; |
183 | 184 |
if (untilTimestamp) |
... | ... | |
241 | 242 |
|
242 | 243 |
if (groups) { |
243 | 244 |
for (NSString *key in [groups keyEnumerator]) { |
244 |
[request addRequestHeader:[[NSString stringWithFormat:@"X-Account-Group-%@", key] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
|
|
245 |
value:[[groups objectForKey:key] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
245 |
[request addRequestHeader:[self encodeToPercentEscape:[NSString stringWithFormat:@"X-Account-Group-%@", key]]
|
|
246 |
value:[self encodeToPercentEscape:[groups objectForKey:key]]];
|
|
246 | 247 |
} |
247 | 248 |
} |
248 | 249 |
|
249 | 250 |
if (metadata) { |
250 | 251 |
for (NSString *key in [metadata keyEnumerator]) { |
251 |
[request addRequestHeader:[[NSString stringWithFormat:@"X-Account-Meta-%@", key] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
|
|
252 |
value:[[metadata objectForKey:key] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
252 |
[request addRequestHeader:[self encodeToPercentEscape:[NSString stringWithFormat:@"X-Account-Meta-%@", key]]
|
|
253 |
value:[self encodeToPercentEscape:[metadata objectForKey:key]]];
|
|
253 | 254 |
} |
254 | 255 |
} |
255 | 256 |
|
... | ... | |
263 | 264 |
self.currentElement = elementName; |
264 | 265 |
if ([elementName isEqualToString:@"container"]) { |
265 | 266 |
self.currentContainer = [ASIPithosContainer container]; |
266 |
} |
|
267 |
} else if ([elementName isEqualToString:@"x_container_policy"]) { |
|
268 |
if (currentContainer.policy == nil) |
|
269 |
currentContainer.policy = [NSMutableDictionary dictionary]; |
|
270 |
self.currentDictionary = currentContainer.policy; |
|
271 |
} else if ([elementName isEqualToString:@"x_container_meta"]) { |
|
272 |
if (currentContainer.metadata == nil) |
|
273 |
currentContainer.metadata = [NSMutableDictionary dictionary]; |
|
274 |
self.currentDictionary = currentContainer.metadata; |
|
275 |
} |
|
267 | 276 |
self.currentContent = @""; |
268 | 277 |
} |
269 | 278 |
|
... | ... | |
282 | 291 |
range:NSMakeRange(([currentContent length] - 3), 1)]]; |
283 | 292 |
} else if ([elementName isEqualToString:@"x_container_until_timestamp"]) { |
284 | 293 |
currentContainer.untilTimestamp = [NSDate dateWithTimeIntervalSince1970:[currentContent doubleValue]]; |
285 |
} else if ([elementName rangeOfString:@"x_container_policy_"].location == 0) { |
|
286 |
if (currentContainer.policy == nil) |
|
287 |
currentContainer.policy = [NSMutableDictionary dictionary]; |
|
288 |
[currentContainer.policy setObject:currentContent forKey:[elementName substringFromIndex:19]]; |
|
289 |
} else if ([elementName rangeOfString:@"x_container_meta_"].location == 0) { |
|
290 |
if (currentContainer.metadata == nil) |
|
291 |
currentContainer.metadata = [NSMutableDictionary dictionary]; |
|
292 |
[currentContainer.metadata setObject:currentContent forKey:[elementName substringFromIndex:17]]; |
|
294 |
} else if ([elementName isEqualToString:@"key"]) { |
|
295 |
self.currentKey = currentContent; |
|
296 |
} else if ([elementName isEqualToString:@"value"]) { |
|
297 |
[currentDictionary setObject:currentContent forKey:currentKey]; |
|
298 |
self.currentKey = nil; |
|
299 |
} else if ([elementName isEqualToString:@"x_container_policy"] || [elementName isEqualToString:@"x_container_meta"]) { |
|
300 |
self.currentDictionary = nil; |
|
293 | 301 |
} else if ([elementName isEqualToString:@"container"]) { |
294 | 302 |
[containers addObject:currentContainer]; |
295 | 303 |
self.currentContainer = nil; |
b/asi-http-request-with-pithos/Classes/Pithos/ASIPithosContainerRequest.h | ||
---|---|---|
53 | 53 |
|
54 | 54 |
// Internally used while parsing the response |
55 | 55 |
ASIPithosObject *currentObject; |
56 |
NSString *currentKey; |
|
56 | 57 |
} |
57 | 58 |
|
58 | 59 |
@property (retain) NSString *containerName; |
59 | 60 |
@property (retain) ASIPithosObject *currentObject; |
61 |
@property (retain) NSString *currentKey; |
|
60 | 62 |
|
61 | 63 |
// HEAD storageURL/container |
62 | 64 |
+ (id)containerMetadataRequestWithContainerName:(NSString *)containerName; |
b/asi-http-request-with-pithos/Classes/Pithos/ASIPithosContainerRequest.m | ||
---|---|---|
40 | 40 |
|
41 | 41 |
@implementation ASIPithosContainerRequest |
42 | 42 |
@synthesize containerName; |
43 |
@synthesize currentObject; |
|
43 |
@synthesize currentObject, currentKey;
|
|
44 | 44 |
|
45 | 45 |
#pragma mark - |
46 | 46 |
#pragma mark Constructors |
47 | 47 |
|
48 | 48 |
+ (id)storageRequestWithMethod:(NSString *)method containerName:(NSString *)containerName queryString:(NSString *)queryString { |
49 |
NSString *urlString = [NSString stringWithFormat:@"%@/%@", |
|
50 |
[self storageURL], |
|
51 |
[containerName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; |
|
49 |
NSString *urlString = [NSString stringWithFormat:@"%@/%@", [self storageURL], [self encodeToPercentEscape:containerName]]; |
|
52 | 50 |
if (queryString) |
53 | 51 |
urlString = [urlString stringByAppendingString:queryString]; |
54 | 52 |
|
... | ... | |
67 | 65 |
#pragma mark Memory Management |
68 | 66 |
|
69 | 67 |
- (void)dealloc { |
68 |
[currentKey release]; |
|
70 | 69 |
[currentObject release]; |
71 | 70 |
[objects release]; |
72 | 71 |
[metadata release]; |
... | ... | |
127 | 126 |
} |
128 | 127 |
|
129 | 128 |
- (NSArray *)objectMeta { |
130 |
return [[[[self responseHeaders] objectForKey:@"X-Container-Object-Meta"] |
|
131 |
stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] |
|
129 |
return [[self decodeFromPercentEscape:[[self responseHeaders] objectForKey:@"X-Container-Object-Meta"]] |
|
132 | 130 |
componentsSeparatedByString:@","]; |
133 | 131 |
} |
134 | 132 |
|
... | ... | |
199 | 197 |
if (limit && (limit > 0)) |
200 | 198 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&limit=%lu", limit]]; |
201 | 199 |
if (marker) |
202 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&marker=%@", [marker stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
|
|
200 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&marker=%@", [self encodeToPercentEscape:marker]]];
|
|
203 | 201 |
if (prefix) |
204 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&prefix=%@", [prefix stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
|
|
202 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&prefix=%@", [self encodeToPercentEscape:prefix]]];
|
|
205 | 203 |
if (delimiter) |
206 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&delimiter=%@", [delimiter stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
|
|
204 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&delimiter=%@", [self encodeToPercentEscape:delimiter]]];
|
|
207 | 205 |
if (path) |
208 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&path=%@", [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
|
|
206 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&path=%@", [self encodeToPercentEscape:path]]];
|
|
209 | 207 |
if (meta) |
210 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&meta=%@", [[meta componentsJoinedByString:@","] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
|
|
208 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&meta=%@", [self encodeToPercentEscape:[meta componentsJoinedByString:@","]]]];
|
|
211 | 209 |
if (shared) |
212 | 210 |
queryString = [queryString stringByAppendingString:@"&shared="]; |
213 | 211 |
if (untilTimestamp) |
... | ... | |
299 | 297 |
|
300 | 298 |
if (metadata) { |
301 | 299 |
for (NSString *key in [metadata keyEnumerator]) { |
302 |
[request addRequestHeader:[[NSString stringWithFormat:@"X-Container-Meta-%@", key] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
|
|
303 |
value:[[metadata objectForKey:key] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
300 |
[request addRequestHeader:[self encodeToPercentEscape:[NSString stringWithFormat:@"X-Container-Meta-%@", key]]
|
|
301 |
value:[self encodeToPercentEscape:[metadata objectForKey:key]]];
|
|
304 | 302 |
} |
305 | 303 |
} |
306 | 304 |
|
... | ... | |
334 | 332 |
|
335 | 333 |
if (metadata) { |
336 | 334 |
for (NSString *key in [metadata keyEnumerator]) { |
337 |
[request addRequestHeader:[[NSString stringWithFormat:@"X-Container-Meta-%@", key] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
|
|
338 |
value:[[metadata objectForKey:key] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
335 |
[request addRequestHeader:[self encodeToPercentEscape:[NSString stringWithFormat:@"X-Container-Meta-%@", key]]
|
|
336 |
value:[self encodeToPercentEscape:[metadata objectForKey:key]]];
|
|
339 | 337 |
} |
340 | 338 |
} |
341 | 339 |
|
... | ... | |
411 | 409 |
self.currentObject = [ASIPithosObject object]; |
412 | 410 |
} else if ([elementName isEqualToString:@"subdir"]) { |
413 | 411 |
[objects addObject:[ASIPithosObject subdirWithName:[attributeDict valueForKey:@"name"]]]; |
412 |
} else if ([elementName isEqualToString:@"x_object_meta"]) { |
|
413 |
if (currentObject.metadata == nil) |
|
414 |
currentObject.metadata = [NSMutableDictionary dictionary]; |
|
414 | 415 |
} |
415 | 416 |
|
416 | 417 |
self.currentContent = @""; |
... | ... | |
449 | 450 |
currentObject.sharedBy = currentContent; |
450 | 451 |
} else if ([elementName isEqualToString:@"x_object_public"]) { |
451 | 452 |
currentObject.publicURI = currentContent; |
452 |
} else if ([elementName rangeOfString:@"x_object_meta_"].location == 0) { |
|
453 |
if (currentObject.metadata == nil) |
|
454 |
currentObject.metadata = [NSMutableDictionary dictionary]; |
|
455 |
[currentObject.metadata setObject:currentContent forKey:[elementName substringFromIndex:14]]; |
|
453 |
} else if ([elementName isEqualToString:@"key"]) { |
|
454 |
self.currentKey = currentContent; |
|
455 |
} else if ([elementName isEqualToString:@"value"]) { |
|
456 |
[currentObject.metadata setObject:currentContent forKey:currentKey]; |
|
457 |
self.currentKey = nil; |
|
456 | 458 |
} else if ([elementName isEqualToString:@"x_object_allowed_to"]) { |
457 | 459 |
currentObject.allowedTo = currentContent; |
458 | 460 |
} else if ([elementName isEqualToString:@"object"]) { |
b/asi-http-request-with-pithos/Classes/Pithos/ASIPithosObjectRequest.m | ||
---|---|---|
60 | 60 |
+ (id)storageRequestWithMethod:(NSString *)method containerName:(NSString *)containerName objectName:(NSString *)objectName queryString:(NSString *)queryString { |
61 | 61 |
NSString *urlString = [NSString stringWithFormat:@"%@/%@/%@", |
62 | 62 |
[self storageURL], |
63 |
[containerName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], |
|
64 |
[objectName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; |
|
63 |
[self encodeToPercentEscape:containerName], |
|
64 |
[((NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, |
|
65 |
(CFStringRef)objectName, |
|
66 |
NULL, |
|
67 |
(CFStringRef)@"!*'();:@&=+$,?%#[]", |
|
68 |
kCFStringEncodingUTF8)) autorelease]]; |
|
65 | 69 |
if (queryString) |
66 | 70 |
urlString = [urlString stringByAppendingString:queryString]; |
67 | 71 |
|
... | ... | |
121 | 125 |
if (contentType) |
122 | 126 |
[self addRequestHeader:@"Content-Type" value:contentType]; |
123 | 127 |
if (contentEncoding) |
124 |
[self addRequestHeader:@"Content-Encoding" value:contentEncoding];
|
|
128 |
[self addRequestHeader:@"Content-Encoding" value:[self encodeToPercentEscape:contentEncoding]];
|
|
125 | 129 |
if (contentDisposition) |
126 |
[self addRequestHeader:@"Content-Disposition" value:contentDisposition];
|
|
130 |
[self addRequestHeader:@"Content-Disposition" value:[self encodeToPercentEscape:contentDisposition]];
|
|
127 | 131 |
if (manifest) |
128 |
[self addRequestHeader:@"X-Object-Manifest" |
|
129 |
value:[manifest stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; |
|
132 |
[self addRequestHeader:@"X-Object-Manifest" value:[self encodeToPercentEscape:manifest]]; |
|
130 | 133 |
if (sharing) |
131 |
[self addRequestHeader:@"X-Object-Sharing" |
|
132 |
value:[sharing stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; |
|
134 |
[self addRequestHeader:@"X-Object-Sharing" value:[self encodeToPercentEscape:sharing]]; |
|
133 | 135 |
if (isPublic == ASIPithosObjectRequestPublicTrue) { |
134 | 136 |
[self addRequestHeader:@"X-Object-Public" value:@"true"]; |
135 | 137 |
} else if (isPublic == ASIPithosObjectRequestPublicFalse) { |
... | ... | |
138 | 140 |
|
139 | 141 |
if (newMetadata) { |
140 | 142 |
for (NSString *key in [newMetadata keyEnumerator]) { |
141 |
[self addRequestHeader:[[NSString stringWithFormat:@"X-Object-Meta-%@", key] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
|
|
142 |
value:[[newMetadata objectForKey:key] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
143 |
[self addRequestHeader:[self encodeToPercentEscape:[NSString stringWithFormat:@"X-Object-Meta-%@", key]]
|
|
144 |
value:[self encodeToPercentEscape:[newMetadata objectForKey:key]]];
|
|
143 | 145 |
} |
144 | 146 |
} |
145 | 147 |
} |
... | ... | |
221 | 223 |
} |
222 | 224 |
|
223 | 225 |
- (NSString *)contentEncoding { |
224 |
return [[self responseHeaders] objectForKey:@"Content-Encoding"];
|
|
226 |
return [self decodeFromPercentEscape:[[self responseHeaders] objectForKey:@"Content-Encoding"]];
|
|
225 | 227 |
} |
226 | 228 |
|
227 | 229 |
- (NSString *)contentDisposition { |
228 |
return [[self responseHeaders] objectForKey:@"Content-Disposition"];
|
|
230 |
return [self decodeFromPercentEscape:[[self responseHeaders] objectForKey:@"Content-Disposition"]];
|
|
229 | 231 |
} |
230 | 232 |
|
231 | 233 |
- (NSString *)version { |
... | ... | |
244 | 246 |
} |
245 | 247 |
|
246 | 248 |
- (NSString *)manifest { |
247 |
return [[[self responseHeaders] objectForKey:@"X-Object-Manifest"] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
|
|
249 |
return [self decodeFromPercentEscape:[[self responseHeaders] objectForKey:@"X-Object-Manifest"]];
|
|
248 | 250 |
} |
249 | 251 |
|
250 | 252 |
- (NSString *)sharing { |
251 |
return [[[self responseHeaders] objectForKey:@"X-Object-Sharing"] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
|
|
253 |
return [self decodeFromPercentEscape:[[self responseHeaders] objectForKey:@"X-Object-Sharing"]];
|
|
252 | 254 |
} |
253 | 255 |
|
254 | 256 |
- (NSString *)sharedBy { |
255 |
return [[[self responseHeaders] objectForKey:@"X-Object-Shared-By"] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
|
|
257 |
return [self decodeFromPercentEscape:[[self responseHeaders] objectForKey:@"X-Object-Shared-By"]];
|
|
256 | 258 |
} |
257 | 259 |
|
258 | 260 |
- (NSString *)publicURI { |
... | ... | |
844 | 846 |
metadata:metadata]; |
845 | 847 |
[request addRequestHeader:@"Content-Length" value:@"0"]; |
846 | 848 |
[request addRequestHeader:@"X-Copy-From" |
847 |
value:[[NSString stringWithFormat:@"/%@/%@", sourceContainerName, sourceObjectName] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
849 |
value:[self encodeToPercentEscape:[NSString stringWithFormat:@"/%@/%@", sourceContainerName, sourceObjectName]]];
|
|
848 | 850 |
if (sourceAccount) |
849 | 851 |
[request addRequestHeader:@"X-Source-Account" |
850 |
value:[sourceAccount stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
852 |
value:[self encodeToPercentEscape:sourceAccount]];
|
|
851 | 853 |
if (sourceVersion) |
852 | 854 |
[request addRequestHeader:@"X-Source-Version" value:sourceVersion]; |
853 | 855 |
return request; |
... | ... | |
939 | 941 |
isPublic:isPublic |
940 | 942 |
metadata:metadata]; |
941 | 943 |
[request addRequestHeader:@"Destination" |
942 |
value:[[NSString stringWithFormat:@"/%@/%@", destinationContainerName, destinationObjectName] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
944 |
value:[self encodeToPercentEscape:[NSString stringWithFormat:@"/%@/%@", destinationContainerName, destinationObjectName]]];
|
|
943 | 945 |
if (destinationAccount) |
944 | 946 |
[request addRequestHeader:@"Destination-Account" |
945 |
value:[destinationAccount stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
947 |
value:[self encodeToPercentEscape:destinationAccount]];
|
|
946 | 948 |
if (sourceVersion) |
947 | 949 |
[request addRequestHeader:@"X-Source-Version" value:sourceVersion]; |
948 | 950 |
return request; |
... | ... | |
1034 | 1036 |
metadata:metadata]; |
1035 | 1037 |
[request addRequestHeader:@"Content-Length" value:@"0"]; |
1036 | 1038 |
[request addRequestHeader:@"X-Move-From" |
1037 |
value:[[NSString stringWithFormat:@"/%@/%@", sourceContainerName, sourceObjectName] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
1039 |
value:[self encodeToPercentEscape:[NSString stringWithFormat:@"/%@/%@", sourceContainerName, sourceObjectName]]];
|
|
1038 | 1040 |
if (sourceAccount) |
1039 | 1041 |
[request addRequestHeader:@"X-Source-Account" |
1040 |
value:[sourceAccount stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
1042 |
value:[self encodeToPercentEscape:sourceAccount]];
|
|
1041 | 1043 |
return request; |
1042 | 1044 |
} |
1043 | 1045 |
|
... | ... | |
1122 | 1124 |
isPublic:isPublic |
1123 | 1125 |
metadata:metadata]; |
1124 | 1126 |
[request addRequestHeader:@"Destination" |
1125 |
value:[[NSString stringWithFormat:@"/%@/%@", destinationContainerName, destinationObjectName] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
1127 |
value:[self encodeToPercentEscape:[NSString stringWithFormat:@"/%@/%@", destinationContainerName, destinationObjectName]]];
|
|
1126 | 1128 |
if (destinationAccount) |
1127 | 1129 |
[request addRequestHeader:@"Destination-Account" |
1128 |
value:[destinationAccount stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
1130 |
value:[self encodeToPercentEscape:destinationAccount]];
|
|
1129 | 1131 |
return request; |
1130 | 1132 |
} |
1131 | 1133 |
|
... | ... | |
1540 | 1542 |
if (bytes) |
1541 | 1543 |
[request addRequestHeader:@"X-Object-Bytes" value:[NSString stringWithFormat:@"%lu", [bytes unsignedLongValue]]]; |
1542 | 1544 |
[request addRequestHeader:@"X-Source-Object" |
1543 |
value:[[NSString stringWithFormat:@"/%@/%@", sourceContainerName, sourceObjectName] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
1545 |
value:[self encodeToPercentEscape:[NSString stringWithFormat:@"/%@/%@", sourceContainerName, sourceObjectName]]];
|
|
1544 | 1546 |
if (sourceAccount) |
1545 | 1547 |
[request addRequestHeader:@"X-Source-Account" |
1546 |
value:[sourceAccount stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
1548 |
value:[self encodeToPercentEscape:sourceAccount]];
|
|
1547 | 1549 |
if (sourceVersion) |
1548 | 1550 |
[request addRequestHeader:@"X-Source-Version" value:sourceVersion]; |
1549 | 1551 |
return request; |
b/asi-http-request-with-pithos/Classes/Pithos/ASIPithosRequest.h | ||
---|---|---|
104 | 104 |
- (void)changeRequestUserFrom:(NSString *)oldAuthUser To:(NSString *)newAuthUser; |
105 | 105 |
|
106 | 106 |
- (NSMutableDictionary *)getHeadersDictionaryForPrefix:(NSString *)prefix; |
107 |
+ (NSString *)encodeToPercentEscape:(NSString *)string; |
|
108 |
+ (NSString *)decodeFromPercentEscape:(NSString *)string; |
|
109 |
- (NSString *)encodeToPercentEscape:(NSString *)string; |
|
110 |
- (NSString *)decodeFromPercentEscape:(NSString *)string; |
|
107 | 111 |
|
108 | 112 |
@end |
b/asi-http-request-with-pithos/Classes/Pithos/ASIPithosRequest.m | ||
---|---|---|
140 | 140 |
if (storageURL) |
141 | 141 |
return storageURL; |
142 | 142 |
else if (storageURLPrefix && authUser) |
143 |
return [NSString stringWithFormat:@"%@/%@", storageURLPrefix, [authUser stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
143 |
return [NSString stringWithFormat:@"%@/%@", storageURLPrefix, [self encodeToPercentEscape:authUser]];
|
|
144 | 144 |
return nil; |
145 | 145 |
} |
146 | 146 |
|
... | ... | |
164 | 164 |
|
165 | 165 |
+ (NSString *)storageURLWithAuthUser:(NSString *)anAuthUser { |
166 | 166 |
if (storageURLPrefix) |
167 |
return [NSString stringWithFormat:@"%@/%@", storageURLPrefix, [anAuthUser stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
|
|
167 |
return [NSString stringWithFormat:@"%@/%@", storageURLPrefix, [self encodeToPercentEscape:anAuthUser]];
|
|
168 | 168 |
return nil; |
169 | 169 |
} |
170 | 170 |
|
... | ... | |
219 | 219 |
if (limit && (limit > 0)) |
220 | 220 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&limit=%lu", limit]]; |
221 | 221 |
if (marker) |
222 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&marker=%@", [marker stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
|
|
222 |
queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&marker=%@", [self encodeToPercentEscape:marker]]];
|
|
223 | 223 |
|
224 | 224 |
return [self authRequestWithMethod:@"GET" queryString:queryString useAuthToken:YES]; |
225 | 225 |
} |
... | ... | |
383 | 383 |
for (NSString *key in [[self responseHeaders] keyEnumerator]) { |
384 | 384 |
NSRange prefixRange = [key rangeOfString:prefix]; |
385 | 385 |
if (prefixRange.location == 0) { |
386 |
[headersDictionary setObject:[[[self responseHeaders] objectForKey:key] |
|
387 |
stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] |
|
388 |
forKey:[[[[key substringFromIndex:prefix.length] |
|
389 |
stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] |
|
386 |
[headersDictionary setObject:[self decodeFromPercentEscape:[[self responseHeaders] objectForKey:key]] |
|
387 |
forKey:[[[self decodeFromPercentEscape:[key substringFromIndex:prefix.length]] |
|
390 | 388 |
stringByReplacingOccurrencesOfString:@"-" withString:@"_"] |
391 | 389 |
lowercaseString]]; |
392 | 390 |
} |
... | ... | |
394 | 392 |
return headersDictionary; |
395 | 393 |
} |
396 | 394 |
|
395 |
// http://cybersam.com/programming/proper-url-percent-encoding-in-ios |
|
396 |
+ (NSString *)encodeToPercentEscape:(NSString *)string { |
|
397 |
return [((NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, |
|
398 |
(CFStringRef)string, |
|
399 |
NULL, |
|
400 |
(CFStringRef)@"!*'();:@&=+$,/?%#[]", |
|
401 |
kCFStringEncodingUTF8)) autorelease]; |
|
402 |
} |
|
403 |
|
|
404 |
+ (NSString *)decodeFromPercentEscape:(NSString *)string { |
|
405 |
return [((NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, |
|
406 |
(CFStringRef)string, |
|
407 |
(CFStringRef)@"", |
|
408 |
kCFStringEncodingUTF8)) autorelease]; |
|
409 |
} |
|
410 |
|
|
411 |
- (NSString *)encodeToPercentEscape:(NSString *)string { |
|
412 |
return [ASIPithosRequest encodeToPercentEscape:string]; |
|
413 |
} |
|
414 |
|
|
415 |
- (NSString *)decodeFromPercentEscape:(NSString *)string { |
|
416 |
return [ASIPithosRequest decodeFromPercentEscape:string]; |
|
417 |
} |
|
418 |
|
|
397 | 419 |
@end |
Also available in: Unified diff