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