Statistics
| Branch: | Revision:

root / asi-http-request-with-pithos / Classes / Pithos / ASIPithosObjectRequest.m @ 78355da3

History | View | Annotate | Download (98.8 kB)

1
//  ASIPithosObjectRequest.m
2
//  Based on ASICloudFilesObjectRequest.m
3
//
4
// Copyright 2011 GRNET S.A. All rights reserved.
5
//
6
// Redistribution and use in source and binary forms, with or
7
// without modification, are permitted provided that the following
8
// conditions are met:
9
// 
10
//   1. Redistributions of source code must retain the above
11
//      copyright notice, this list of conditions and the following
12
//      disclaimer.
13
// 
14
//   2. Redistributions in binary form must reproduce the above
15
//      copyright notice, this list of conditions and the following
16
//      disclaimer in the documentation and/or other materials
17
//      provided with the distribution.
18
// 
19
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
20
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
23
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
// POSSIBILITY OF SUCH DAMAGE.
31
// 
32
// The views and conclusions contained in the software and
33
// documentation are those of the authors and should not be
34
// interpreted as representing official policies, either expressed
35
// or implied, of GRNET S.A.
36

    
37
#import "ASIPithosObjectRequest.h"
38
#import "ASIPithosObject.h"
39

    
40
@interface ASIPithosObjectRequest (Private)
41
- (void)parseXMLData;
42
- (void)prepareObjectRequestWithETag:(NSString *)eTag 
43
                         contentType:(NSString *)contentType 
44
                     contentEncoding:(NSString *)contentEncoding 
45
                  contentDisposition:(NSString *)contentDisposition 
46
                            manifest:(NSString *)manifest 
47
                             sharing:(NSString *)sharing 
48
                            isPublic:(NSUInteger)isPublic 
49
                            metadata:(NSDictionary *)newMetadata;
50
@end
51

    
52
@implementation ASIPithosObjectRequest
53
@synthesize objectRequestType;
54
@synthesize containerName, objectName;
55
@synthesize currentObject;
56

    
57
#pragma mark -
58
#pragma mark Constructors
59

    
60
+ (id)storageRequestWithMethod:(NSString *)method containerName:(NSString *)containerName objectName:(NSString *)objectName queryString:(NSString *)queryString {
61
    NSString *urlString = [NSString stringWithFormat:@"%@/%@/%@", 
62
                           [self storageURL], 
63
                           [containerName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], 
64
                           [objectName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
65
    if (queryString)
66
        urlString = [urlString stringByAppendingString:queryString];
67
    
68
	ASIPithosObjectRequest *request = [[[self alloc] initWithURL:[NSURL URLWithString:urlString]] autorelease];
69
	[request setRequestMethod:method];
70
	[request addRequestHeader:@"X-Auth-Token" value:[self authToken]];
71
    request.containerName = containerName;
72
    request.objectName = objectName;
73
	return request;
74
}
75

    
76
+ (id)storageRequestWithMethod:(NSString *)method containerName:(NSString *)containerName objectName:(NSString *)objectName {
77
	return [self storageRequestWithMethod:method containerName:containerName objectName:(NSString *)objectName queryString:nil];
78
}
79

    
80
#pragma mark -
81
#pragma mark Memory Management
82

    
83
- (void)dealloc {
84
    [currentObject release];
85
    [versions release];
86
    [hashes release];
87
    [blockHash release];
88
    [objectName release];
89
    [containerName release];
90
	[super dealloc];
91
}
92

    
93
#pragma mark -
94
#pragma mark Internal
95

    
96
- (void)parseXMLData {
97
    if (objectRequestType == ASIPithosObjectRequestHashmap) {
98
        hashes = [[NSMutableArray alloc] init];
99
    } else if (objectRequestType == ASIPithosObjectRequestVersions) {
100
        versions = [[NSMutableArray alloc] init];
101
    }
102
    
103
    NSXMLParser *parser = [[[NSXMLParser alloc] initWithData:[self responseData]] autorelease];
104
    [parser setDelegate:self];
105
    [parser setShouldProcessNamespaces:NO];
106
    [parser setShouldReportNamespacePrefixes:NO];
107
    [parser setShouldResolveExternalEntities:NO];
108
    [parser parse];
109
}
110

    
111
- (void)prepareObjectRequestWithETag:(NSString *)eTag 
112
                         contentType:(NSString *)contentType 
113
                     contentEncoding:(NSString *)contentEncoding 
114
                  contentDisposition:(NSString *)contentDisposition 
115
                            manifest:(NSString *)manifest 
116
                             sharing:(NSString *)sharing 
117
                            isPublic:(NSUInteger)isPublic 
118
                            metadata:(NSDictionary *)newMetadata {
119
    if (eTag)
120
        [self addRequestHeader:@"ETag" value:eTag];
121
    if (contentType)
122
        [self addRequestHeader:@"Content-Type" value:contentType];
123
    if (contentEncoding)
124
        [self addRequestHeader:@"Content-Encoding" value:contentEncoding];
125
    if (contentDisposition)
126
        [self addRequestHeader:@"Content-Disposition" value:contentDisposition];
127
    if (manifest)
128
        [self addRequestHeader:@"X-Object-Manifest" value:manifest];
129
    if (sharing)
130
        [self addRequestHeader:@"X-Object-Sharing" value:sharing];
131
    if (isPublic == ASIPithosObjectRequestPublicTrue) {
132
        [self addRequestHeader:@"X-Object-Public" value:@"true"];
133
    } else if (isPublic == ASIPithosObjectRequestPublicFalse) {
134
        [self addRequestHeader:@"X-Object-Public" value:@"false"];
135
    }
136
    
137
    if (newMetadata) {
138
        for (NSString *key in [newMetadata keyEnumerator]) {
139
            [self addRequestHeader:[NSString stringWithFormat:@"X-Object-Meta-%@", key] value:[newMetadata objectForKey:key]];
140
        }
141
    }
142
}
143

    
144
#pragma mark -
145
#pragma mark HEAD
146

    
147
// HEAD storageURL/container/object
148
+ (id)objectMetadataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName {
149
    return [self storageRequestWithMethod:@"HEAD" containerName:containerName objectName:objectName];
150
}
151

    
152
// HEAD storageURL/container/object?[version=version]
153
+ (id)objectMetadataRequestWithContainerName:(NSString *)containerName  objectName:(NSString *)objectName version:(NSString *)version {
154
    NSString *queryString = nil;
155
    if (version)
156
        queryString = [NSString stringWithFormat:@"?version=%@", version];
157
	return [self storageRequestWithMethod:@"HEAD" containerName:containerName objectName:objectName queryString:queryString];
158
}
159

    
160
// HEAD storageURL/container/object?[version=version] [If-Match]
161
+ (id)objectMetadataRequestWithContainerName:(NSString *)containerName  objectName:(NSString *)objectName 
162
                                     version:(NSString *)version 
163
                                     ifMatch:(NSString *)matchETag {
164
    ASIPithosObjectRequest *request = [self objectMetadataRequestWithContainerName:containerName objectName:objectName version:version];
165
    [request addRequestIfMatchHeader:matchETag];
166
    return request;
167
}
168

    
169
// HEAD storageURL/container/object?[version=version] [If-None-Match]
170
+ (id)objectMetadataRequestWithContainerName:(NSString *)containerName  objectName:(NSString *)objectName 
171
                                     version:(NSString *)version 
172
                                 ifNoneMatch:(NSString *)matchETag {
173
    ASIPithosObjectRequest *request = [self objectMetadataRequestWithContainerName:containerName objectName:objectName version:version];
174
    [request addRequestIfNoneMatchHeader:matchETag];
175
    return request;
176
}
177

    
178
// HEAD storageURL/container/object?[version=version] [If-Modified-Since]
179
+ (id)objectMetadataRequestWithContainerName:(NSString *)containerName  objectName:(NSString *)objectName 
180
                                     version:(NSString *)version 
181
                             ifModifiedSince:(NSDate *)sinceTimestamp {
182
    ASIPithosObjectRequest *request = [self objectMetadataRequestWithContainerName:containerName objectName:objectName version:version];
183
    [request addRequestIfModifiedSinceHeader:sinceTimestamp];
184
    return request;
185
}
186

    
187
// HEAD storageURL/container/object?[version=version] [If-Unmodified-Since]
188
+ (id)objectMetadataRequestWithContainerName:(NSString *)containerName  objectName:(NSString *)objectName 
189
                                     version:(NSString *)version 
190
                           ifUnmodifiedSince:(NSDate *)sinceTimestamp {
191
    ASIPithosObjectRequest *request = [self objectMetadataRequestWithContainerName:containerName objectName:objectName version:version];
192
    [request addRequestIfUnmodifiedSinceHeader:sinceTimestamp];
193
    return request;
194
}
195

    
196
- (NSString *)eTag {
197
    // Etag, instead of ETag, because CFNetwork changes it
198
    // http://groups.google.com/group/asihttprequest/browse_thread/thread/7119f1a0ccf26fdf
199
	return [[self responseHeaders] objectForKey:@"Etag"];
200
}
201

    
202
- (NSUInteger)objectContentLength {
203
    NSString *objectContentLengthString = [[self responseHeaders] objectForKey:@"Content-Length"];
204
    if (objectContentLengthString)
205
        return [objectContentLengthString intValue];
206
    return 0;
207
}
208

    
209
- (NSString *)contentType {
210
	return [[self responseHeaders] objectForKey:@"Content-Type"];
211
}
212

    
213
- (NSDate *)lastModified {
214
    NSString *lastModifiedString = [[self responseHeaders] objectForKey:@"Last-Modified"];
215
    if (lastModifiedString)
216
        return [[self dateFormatterWithFormatId:1] dateFromString:lastModifiedString];
217
    return nil;
218
}
219

    
220
- (NSString *)contentEncoding {
221
	return [[self responseHeaders] objectForKey:@"Content-Encoding"];
222
}
223

    
224
- (NSString *)contentDisposition {
225
	return [[self responseHeaders] objectForKey:@"Content-Disposition"];
226
}
227

    
228
- (NSString *)version {
229
	return [[self responseHeaders] objectForKey:@"X-Object-Version"];
230
}
231

    
232
- (NSDate *)versionTimestamp {
233
    NSString *versionTimestampString = [[self responseHeaders] objectForKey:@"X-Object-Version-Timestamp"];
234
    if (versionTimestampString)
235
        return [[self dateFormatterWithFormatId:1] dateFromString:versionTimestampString];
236
    return nil;
237
}
238

    
239
- (NSString *)modifiedBy {
240
	return [[self responseHeaders] objectForKey:@"X-Object-Modified-By"];
241
}
242

    
243
- (NSString *)manifest {
244
	return [[self responseHeaders] objectForKey:@"X-Object-Manifest"];
245
}
246

    
247
- (NSString *)sharing {
248
	return [[self responseHeaders] objectForKey:@"X-Object-Sharing"];
249
}
250

    
251
- (NSString *)sharedBy {
252
	return [[self responseHeaders] objectForKey:@"X-Object-Shared-By"];
253
}
254

    
255
- (NSString *)publicURI {
256
	return [[self responseHeaders] objectForKey:@"X-Object-Public"];
257
}
258

    
259
- (NSDictionary *)metadata {
260
    if (metadata == nil) {
261
        metadata = [self getHeadersDictionaryForPrefix:@"X-Object-Meta-"];
262
        [metadata retain];
263
    }
264
    return metadata;
265
}
266

    
267
- (NSString *)allowedTo {
268
    return [[self responseHeaders] objectForKey:@"X-Object-Allowed-To"];
269
}
270

    
271
- (ASIPithosObject *)object {
272
    ASIPithosObject *object = [ASIPithosObject object];
273
    object.name = objectName;
274
    object.hash = [self eTag];
275
    object.contentType = [self contentType];
276
    object.contentEncoding = [self contentEncoding];
277
    object.contentDisposition = [self contentDisposition];
278
    object.lastModified = [self lastModified];
279
    object.version = [self version];
280
    object.versionTimestamp = [self versionTimestamp];
281
    object.modifiedBy = [self modifiedBy];
282
    object.manifest = [self manifest];
283
    object.sharing = [self sharing];
284
    object.sharedBy = [self sharedBy];
285
    object.publicURI = [self publicURI];
286
    object.metadata = (NSMutableDictionary *)[self metadata];
287
    object.allowedTo = [self allowedTo];
288
    
289
    if (objectRequestType == ASIPithosObjectRequestData) {
290
        object.bytes = [self objectContentLength];
291
        object.data = [self responseData];
292
    } else if (objectRequestType == ASIPithosObjectRequestHashmap) {
293
        object.bytes = [self bytes];
294
    }
295
    
296
    return object;
297
}
298

    
299
#pragma mark -
300
#pragma mark GET
301

    
302
// GET storageURL/container/object
303
+ (id)objectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName {
304
    return [self storageRequestWithMethod:@"GET" containerName:containerName objectName:objectName];
305
}
306

    
307
// GET storageURL/container/object?[version=version]
308
+ (id)objectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName version:(NSString *)version {
309
    NSString *queryString = nil;
310
    if (version)
311
        queryString = [NSString stringWithFormat:@"?version=%@", version];
312
	return [self storageRequestWithMethod:@"GET" containerName:containerName objectName:objectName queryString:queryString];
313
}
314

    
315
// GET storageURL/container/object?[version=version] [If-Match]
316
+ (id)objectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
317
                                 version:(NSString *)version 
318
                                 ifMatch:(NSString *)matchETag {
319
    ASIPithosObjectRequest *request = [self objectDataRequestWithContainerName:containerName objectName:objectName version:version];
320
    [request addRequestIfMatchHeader:matchETag];
321
    return request;
322
}
323

    
324
// GET storageURL/container/object?[version=version] [If-None-Match]
325
+ (id)objectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
326
                                 version:(NSString *)version 
327
                             ifNoneMatch:(NSString *)matchETag {
328
    ASIPithosObjectRequest *request = [self objectDataRequestWithContainerName:containerName objectName:objectName version:version];
329
    [request addRequestIfNoneMatchHeader:matchETag];
330
    return request;
331
}
332

    
333
// GET storageURL/container/object?[version=version] [If-Modified-Since]
334
+ (id)objectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
335
                                 version:(NSString *)version 
336
                         ifModifiedSince:(NSDate *)sinceTimestamp {
337
    ASIPithosObjectRequest *request = [self objectDataRequestWithContainerName:containerName objectName:objectName version:version];
338
    [request addRequestIfModifiedSinceHeader:sinceTimestamp];
339
    return request;
340
}
341

    
342
// GET storageURL/container/object?[version=version] [If-Unmodified-Since]
343
+ (id)objectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
344
                                 version:(NSString *)version 
345
                       ifUnmodifiedSince:(NSDate *)sinceTimestamp {
346
    ASIPithosObjectRequest *request = [self objectDataRequestWithContainerName:containerName objectName:objectName version:version];
347
    [request addRequestIfUnmodifiedSinceHeader:sinceTimestamp];
348
    return request;
349
}
350

    
351
// GET storageURL/container/object?[version=version] [Range [If-Range]]
352
+ (id)objectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
353
                                 version:(NSString *)version 
354
                                   range:(NSString *)rangeString {
355
    ASIPithosObjectRequest *request = [self objectDataRequestWithContainerName:containerName objectName:objectName version:version];
356
    [request addRequestRangeHeader:rangeString];
357
    return request;
358
}
359

    
360
+ (id)objectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
361
                                 version:(NSString *)version 
362
                                   range:(NSString *)rangeString 
363
                             ifRangeETag:(NSString *)rangeETag {
364
    ASIPithosObjectRequest *request = [self objectDataRequestWithContainerName:containerName objectName:objectName version:version];
365
    [request addRequestRangeHeader:rangeString ifRangeETag:rangeETag];
366
    return request;
367
}
368

    
369
+ (id)objectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
370
                                 version:(NSString *)version 
371
                                   range:(NSString *)rangeString 
372
                        ifRangeTimestamp:(NSDate *)rangeTimestamp {
373
    ASIPithosObjectRequest *request = [self objectDataRequestWithContainerName:containerName objectName:objectName version:version];
374
    [request addRequestRangeHeader:rangeString ifRangeTimestamp:rangeTimestamp];
375
    return request;
376
}
377

    
378
- (NSData *)data {
379
    return [self responseData];
380
}
381

    
382
// GET storageURL/container/object?format=xml&hashmap=
383
+ (id)objectHashmapRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName {
384
    ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"GET" containerName:containerName objectName:objectName queryString:@"?format=xml&hashmap="];
385
    request.objectRequestType = ASIPithosObjectRequestHashmap;
386
    return request;
387
}
388

    
389
// GET storageURL/container/object?format=xml&hashmap=[&version=version]
390
+ (id)objectHashmapRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName version:(NSString *)version {
391
    NSString *queryString = @"?format=xml&hashmap=";
392
    if (version)
393
        queryString = [queryString stringByAppendingString:[NSString stringWithFormat:@"&version=%@", version]];
394
	ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"GET" containerName:containerName objectName:objectName queryString:queryString];
395
    request.objectRequestType = ASIPithosObjectRequestHashmap;
396
    return request;
397
}
398

    
399
// GET storageURL/container/object?format=xml&hashmap=[&version=version] [If-Match]
400
+ (id)objectHashmapRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
401
                                    version:(NSString *)version 
402
                                    ifMatch:(NSString *)matchETag {
403
    ASIPithosObjectRequest *request = [self objectHashmapRequestWithContainerName:containerName objectName:objectName version:version];
404
    [request addRequestIfMatchHeader:matchETag];
405
    return request;
406
}
407

    
408
// GET storageURL/container/object?format=xml&hashmap=[&version=version] [If-NoneMatch]
409
+ (id)objectHashmapRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
410
                                    version:(NSString *)version 
411
                                ifNoneMatch:(NSString *)matchETag {
412
    ASIPithosObjectRequest *request = [self objectHashmapRequestWithContainerName:containerName objectName:objectName version:version];
413
    [request addRequestIfNoneMatchHeader:matchETag];
414
    return request;
415
}
416

    
417
// GET storageURL/container/object?format=xml&hashmap=[&version=version] [If-Modified-Since]
418
+ (id)objectHashmapRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
419
                                    version:(NSString *)version 
420
                            ifModifiedSince:(NSDate *)sinceTimestamp {
421
    ASIPithosObjectRequest *request = [self objectHashmapRequestWithContainerName:containerName objectName:objectName version:version];
422
    [request addRequestIfModifiedSinceHeader:sinceTimestamp];
423
    return request;
424
}
425

    
426
// GET storageURL/container/object?format=xml&hashmap=[&version=version] [If-Unmodified-Since]
427
+ (id)objectHashmapRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
428
                                    version:(NSString *)version 
429
                          ifUnmodifiedSince:(NSDate *)sinceTimestamp {
430
    ASIPithosObjectRequest *request = [self objectHashmapRequestWithContainerName:containerName objectName:objectName version:version];
431
    [request addRequestIfUnmodifiedSinceHeader:sinceTimestamp];
432
    return request;
433
}
434

    
435
- (NSUInteger)blockSize {
436
    if (hashes == nil)
437
        [self parseXMLData];
438
    return blockSize;
439
}
440

    
441
- (NSString *)blockHash {
442
    if (hashes == nil)
443
        [self parseXMLData];
444
    return blockHash;
445
}
446

    
447
- (NSArray *)hashes {
448
    if (hashes == nil)
449
        [self parseXMLData];
450
    return hashes;
451
}
452

    
453
- (NSUInteger)bytes {
454
    if (hashes == nil)
455
        [self parseXMLData];
456
    return bytes;
457
}
458

    
459
// GET storageURL/container/object?format=xml&version=list
460
+ (id)objectVersionsRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName {
461
    ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"GET" containerName:containerName objectName:objectName queryString:@"?format=xml&version=list"];
462
    request.objectRequestType = ASIPithosObjectRequestVersions;
463
    return request;
464
}
465

    
466
// GET storageURL/container/object?format=xml&version=list [If-Match]
467
+ (id)objectVersionsRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName ifMatch:(NSString *)matchETag {
468
    ASIPithosObjectRequest *request = [self objectVersionsRequestWithContainerName:containerName objectName:objectName];
469
    [request addRequestIfMatchHeader:matchETag];
470
    return request;
471
}
472

    
473
// GET storageURL/container/object?format=xml&version=list [If-None-Match]
474
+ (id)objectVersionsRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName ifNoneMatch:(NSString *)matchETag {
475
    ASIPithosObjectRequest *request = [self objectVersionsRequestWithContainerName:containerName objectName:objectName];
476
    [request addRequestIfNoneMatchHeader:matchETag];
477
    return request;
478
}
479

    
480
// GET storageURL/container/object?format=xml&version=list [If-Modified-Since]
481
+ (id)objectVersionsRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName ifModifiedSince:(NSDate *)sinceTimestamp {
482
    ASIPithosObjectRequest *request = [self objectVersionsRequestWithContainerName:containerName objectName:objectName];
483
    [request addRequestIfModifiedSinceHeader:sinceTimestamp];
484
    return request;
485
}
486

    
487
// GET storageURL/container/object?format=xml&version=list [If-Unmodified-Since]
488
+ (id)objectVersionsRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName ifUnmodifiedSince:(NSDate *)sinceTimestamp {
489
    ASIPithosObjectRequest *request = [self objectVersionsRequestWithContainerName:containerName objectName:objectName];
490
    [request addRequestIfUnmodifiedSinceHeader:sinceTimestamp];
491
    return request;
492
}
493

    
494
- (NSArray *)versions {
495
    if (versions == nil)
496
        [self parseXMLData];
497
    return versions;
498
}
499

    
500
#pragma mark -
501
#pragma mark PUT, COPY, MOVE
502

    
503
// PUT storageURL/container/object (from ASIPithosObject with data)
504
+ (id)writeObjectDataRequestWithContainerName:(NSString *)containerName object:(ASIPithosObject *)object {
505
    NSUInteger isPublic = ASIPithosObjectRequestPublicIgnore;
506
    if (object.publicURI) {
507
        isPublic = ASIPithosObjectRequestPublicTrue;
508
        if ([object.publicURI isEqualToString:@""])
509
            isPublic = ASIPithosObjectRequestPublicFalse;
510
    }
511
    return [self writeObjectDataRequestWithContainerName:containerName 
512
                                              objectName:object.name 
513
                                                    eTag:object.hash 
514
                                             contentType:object.contentType 
515
                                         contentEncoding:object.contentEncoding 
516
                                      contentDisposition:object.contentDisposition 
517
                                                manifest:object.manifest 
518
                                                 sharing:object.sharing 
519
                                                isPublic:isPublic
520
                                                metadata:object.metadata 
521
                                                    data:object.data];
522
}
523

    
524
// PUT storageURL/container/object (from ASIPithosObject with data) [If-Match]
525
+ (id)writeObjectDataRequestWithContainerName:(NSString *)containerName object:(ASIPithosObject *)object ifMatch:(NSString *)matchETag {
526
    ASIPithosObjectRequest *request = [self writeObjectDataRequestWithContainerName:containerName object:object];
527
    [request addRequestIfMatchHeader:matchETag];
528
    return request;
529
}
530

    
531
// PUT storageURL/container/object (from ASIPithosObject with data) [If-None-Match]
532
+ (id)writeObjectDataRequestWithContainerName:(NSString *)containerName object:(ASIPithosObject *)object ifNoneMatch:(NSString *)matchETag  {
533
    ASIPithosObjectRequest *request = [self writeObjectDataRequestWithContainerName:containerName object:object];
534
    [request addRequestIfNoneMatchHeader:matchETag];
535
    return request;
536
}
537

    
538
// PUT storageURL/container/object (from NSData)
539
+ (id)writeObjectDataRequestWithContainerName:(NSString *)containerName 
540
                                   objectName:(NSString *)objectName 
541
                                         eTag:(NSString *)eTag 
542
                                  contentType:(NSString *)contentType 
543
                              contentEncoding:(NSString *)contentEncoding 
544
                           contentDisposition:(NSString *)contentDisposition 
545
                                     manifest:(NSString *)manifest 
546
                                      sharing:(NSString *)sharing 
547
                                     isPublic:(NSUInteger)isPublic 
548
                                     metadata:(NSDictionary *)metadata 
549
                                         data:(NSData *)data {
550
	ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"PUT" containerName:containerName objectName:objectName];
551
    [request prepareObjectRequestWithETag:eTag 
552
                              contentType:contentType 
553
                          contentEncoding:contentEncoding 
554
                       contentDisposition:contentDisposition 
555
                                 manifest:manifest 
556
                                  sharing:sharing 
557
                                 isPublic:isPublic 
558
                                 metadata:metadata];
559
	[request appendPostData:data];
560
    request.requestMethod = @"PUT";
561
	return request;
562
}
563

    
564
// PUT storageURL/container/object (from NSData) [If-Match]
565
+ (id)writeObjectDataRequestWithContainerName:(NSString *)containerName 
566
                                   objectName:(NSString *)objectName 
567
                                         eTag:(NSString *)eTag 
568
                                  contentType:(NSString *)contentType 
569
                              contentEncoding:(NSString *)contentEncoding 
570
                           contentDisposition:(NSString *)contentDisposition 
571
                                     manifest:(NSString *)manifest 
572
                                      sharing:(NSString *)sharing 
573
                                     isPublic:(NSUInteger)isPublic 
574
                                     metadata:(NSDictionary *)metadata 
575
                                         data:(NSData *)data 
576
                                      ifMatch:(NSString *)matchETag {
577
    ASIPithosObjectRequest *request = [self writeObjectDataRequestWithContainerName:containerName objectName:objectName 
578
                                                                               eTag:eTag 
579
                                                                        contentType:contentType 
580
                                                                    contentEncoding:contentEncoding 
581
                                                                 contentDisposition:contentDisposition 
582
                                                                           manifest:manifest 
583
                                                                            sharing:sharing 
584
                                                                           isPublic:isPublic 
585
                                                                           metadata:metadata 
586
                                                                               data:data];
587
    [request addRequestIfMatchHeader:matchETag];
588
    return request;                                                                          
589
}
590

    
591
// PUT storageURL/container/object (from NSData) [If-None-Match]
592
+ (id)writeObjectDataRequestWithContainerName:(NSString *)containerName 
593
                                   objectName:(NSString *)objectName 
594
                                         eTag:(NSString *)eTag 
595
                                  contentType:(NSString *)contentType 
596
                              contentEncoding:(NSString *)contentEncoding 
597
                           contentDisposition:(NSString *)contentDisposition 
598
                                     manifest:(NSString *)manifest 
599
                                      sharing:(NSString *)sharing 
600
                                     isPublic:(NSUInteger)isPublic 
601
                                     metadata:(NSDictionary *)metadata 
602
                                         data:(NSData *)data 
603
                                  ifNoneMatch:(NSString *)matchETag {
604
    ASIPithosObjectRequest *request = [self writeObjectDataRequestWithContainerName:containerName objectName:objectName 
605
                                                                               eTag:eTag 
606
                                                                        contentType:contentType 
607
                                                                    contentEncoding:contentEncoding 
608
                                                                 contentDisposition:contentDisposition 
609
                                                                           manifest:manifest 
610
                                                                            sharing:sharing 
611
                                                                           isPublic:isPublic 
612
                                                                           metadata:metadata 
613
                                                                               data:data];
614
    [request addRequestIfNoneMatchHeader:matchETag];
615
    return request;                                                                          
616
}
617

    
618
// PUT storageURL/container/object (from file)
619
+ (id)writeObjectDataRequestWithContainerName:(NSString *)containerName 
620
                                   objectName:(NSString *)objectName 
621
                                         eTag:(NSString *)eTag 
622
                                  contentType:(NSString *)contentType 
623
                              contentEncoding:(NSString *)contentEncoding 
624
                           contentDisposition:(NSString *)contentDisposition 
625
                                     manifest:(NSString *)manifest 
626
                                      sharing:(NSString *)sharing 
627
                                     isPublic:(NSUInteger)isPublic 
628
                                     metadata:(NSDictionary *)metadata 
629
                                         file:(NSString *)filePath {
630
	ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"PUT" containerName:containerName objectName:objectName];
631
    [request prepareObjectRequestWithETag:eTag 
632
                              contentType:contentType 
633
                          contentEncoding:contentEncoding 
634
                       contentDisposition:contentDisposition 
635
                                 manifest:manifest 
636
                                  sharing:sharing 
637
                                 isPublic:isPublic 
638
                                 metadata:metadata];
639
	request.shouldStreamPostDataFromDisk = YES;
640
    request.postBodyFilePath = filePath;
641
    request.requestMethod = @"PUT";
642
	return request;    
643
}
644

    
645
// PUT storageURL/container/object (from file) [If-Match]
646
+ (id)writeObjectDataRequestWithContainerName:(NSString *)containerName 
647
                                   objectName:(NSString *)objectName 
648
                                         eTag:(NSString *)eTag 
649
                                  contentType:(NSString *)contentType 
650
                              contentEncoding:(NSString *)contentEncoding 
651
                           contentDisposition:(NSString *)contentDisposition 
652
                                     manifest:(NSString *)manifest 
653
                                      sharing:(NSString *)sharing 
654
                                     isPublic:(NSUInteger)isPublic 
655
                                     metadata:(NSDictionary *)metadata 
656
                                         file:(NSString *)filePath 
657
                                      ifMatch:(NSString *)matchETag {
658
    ASIPithosObjectRequest *request = [self writeObjectDataRequestWithContainerName:containerName objectName:objectName 
659
                                                                               eTag:eTag 
660
                                                                        contentType:contentType 
661
                                                                    contentEncoding:contentEncoding 
662
                                                                 contentDisposition:contentDisposition 
663
                                                                           manifest:manifest 
664
                                                                            sharing:sharing 
665
                                                                           isPublic:isPublic 
666
                                                                           metadata:metadata 
667
                                                                               file:filePath];
668
    [request addRequestIfMatchHeader:matchETag];
669
    return request;                                                                          
670
}
671

    
672
// PUT storageURL/container/object (from file) [If-None-Match]
673
+ (id)writeObjectDataRequestWithContainerName:(NSString *)containerName 
674
                                   objectName:(NSString *)objectName 
675
                                         eTag:(NSString *)eTag 
676
                                  contentType:(NSString *)contentType 
677
                              contentEncoding:(NSString *)contentEncoding 
678
                           contentDisposition:(NSString *)contentDisposition 
679
                                     manifest:(NSString *)manifest 
680
                                      sharing:(NSString *)sharing 
681
                                     isPublic:(NSUInteger)isPublic 
682
                                     metadata:(NSDictionary *)metadata 
683
                                         file:(NSString *)filePath 
684
                                  ifNoneMatch:(NSString *)matchETag {
685
    ASIPithosObjectRequest *request = [self writeObjectDataRequestWithContainerName:containerName objectName:objectName 
686
                                                                               eTag:eTag 
687
                                                                        contentType:contentType 
688
                                                                    contentEncoding:contentEncoding 
689
                                                                 contentDisposition:contentDisposition 
690
                                                                           manifest:manifest 
691
                                                                            sharing:sharing 
692
                                                                           isPublic:isPublic 
693
                                                                           metadata:metadata 
694
                                                                               file:filePath];
695
    [request addRequestIfNoneMatchHeader:matchETag];
696
    return request;                                                                          
697
}
698

    
699
// PUT storageURL/container/object (from hashes)
700
+ (id)writeObjectDataRequestWithContainerName:(NSString *)containerName 
701
                                   objectName:(NSString *)objectName 
702
                                  contentType:(NSString *)contentType 
703
                              contentEncoding:(NSString *)contentEncoding 
704
                           contentDisposition:(NSString *)contentDisposition 
705
                                     manifest:(NSString *)manifest 
706
                                      sharing:(NSString *)sharing 
707
                                     isPublic:(NSUInteger)isPublic 
708
                                     metadata:(NSDictionary *)metadata 
709
                                    blockSize:(NSUInteger)blockSize 
710
                                    blockHash:(NSString *)blockHash 
711
                                       hashes:(NSArray *)hashes 
712
                                        bytes:(NSUInteger)bytes {
713
	ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"PUT" containerName:containerName objectName:objectName queryString:@"?format=xml&hashmap="];
714
    [request prepareObjectRequestWithETag:nil 
715
                              contentType:contentType 
716
                          contentEncoding:contentEncoding 
717
                       contentDisposition:contentDisposition 
718
                                 manifest:manifest 
719
                                  sharing:sharing 
720
                                 isPublic:isPublic 
721
                                 metadata:metadata];
722
    NSString *dataString = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?><object name=\"%@\" bytes=\"%lu\" block_size=\"%lu\" block_hash=\"%@\">", 
723
                            (NSString *)CFXMLCreateStringByEscapingEntities(NULL, (CFStringRef)objectName , NULL), 
724
                            bytes, blockSize, blockHash];
725
    for (NSString *hash in hashes) {
726
        dataString = [dataString stringByAppendingFormat:@"<hash>%@</hash>", hash];
727
    }
728
    dataString = [dataString stringByAppendingString:@"</object>"];
729
	[request appendPostData:[dataString dataUsingEncoding:NSUTF8StringEncoding]];
730
    request.requestMethod = @"PUT";
731
	return request;    
732
}
733

    
734
// PUT storageURL/container/object (from hashes) [If-Match]
735
+ (id)writeObjectDataRequestWithContainerName:(NSString *)containerName 
736
                                   objectName:(NSString *)objectName 
737
                                  contentType:(NSString *)contentType 
738
                              contentEncoding:(NSString *)contentEncoding 
739
                           contentDisposition:(NSString *)contentDisposition 
740
                                     manifest:(NSString *)manifest 
741
                                      sharing:(NSString *)sharing 
742
                                     isPublic:(NSUInteger)isPublic 
743
                                     metadata:(NSDictionary *)metadata 
744
                                    blockSize:(NSUInteger)blockSize 
745
                                    blockHash:(NSString *)blockHash 
746
                                       hashes:(NSArray *)hashes 
747
                                        bytes:(NSUInteger)bytes 
748
                                      ifMatch:(NSString *)matchETag {
749
    ASIPithosObjectRequest *request = [self writeObjectDataRequestWithContainerName:containerName objectName:objectName 
750
                                                                        contentType:contentType 
751
                                                                    contentEncoding:contentEncoding 
752
                                                                 contentDisposition:contentDisposition 
753
                                                                           manifest:manifest 
754
                                                                            sharing:sharing 
755
                                                                           isPublic:isPublic 
756
                                                                           metadata:metadata 
757
                                                                          blockSize:blockSize 
758
                                                                          blockHash:blockHash 
759
                                                                             hashes:hashes 
760
                                                                              bytes:bytes];
761
    [request addRequestIfMatchHeader:matchETag];
762
    return request;                                                                          
763
}
764

    
765
// PUT storageURL/container/object (from hashes) [If-None-Match]
766
+ (id)writeObjectDataRequestWithContainerName:(NSString *)containerName 
767
                                   objectName:(NSString *)objectName 
768
                                  contentType:(NSString *)contentType 
769
                              contentEncoding:(NSString *)contentEncoding 
770
                           contentDisposition:(NSString *)contentDisposition 
771
                                     manifest:(NSString *)manifest 
772
                                      sharing:(NSString *)sharing 
773
                                     isPublic:(NSUInteger)isPublic 
774
                                     metadata:(NSDictionary *)metadata 
775
                                    blockSize:(NSUInteger)blockSize 
776
                                    blockHash:(NSString *)blockHash 
777
                                       hashes:(NSArray *)hashes 
778
                                        bytes:(NSUInteger)bytes 
779
                                  ifNoneMatch:(NSString *)matchETag {
780
    ASIPithosObjectRequest *request = [self writeObjectDataRequestWithContainerName:containerName objectName:objectName 
781
                                                                        contentType:contentType 
782
                                                                    contentEncoding:contentEncoding 
783
                                                                 contentDisposition:contentDisposition 
784
                                                                           manifest:manifest 
785
                                                                            sharing:sharing 
786
                                                                           isPublic:isPublic 
787
                                                                           metadata:metadata 
788
                                                                          blockSize:blockSize 
789
                                                                          blockHash:blockHash 
790
                                                                             hashes:hashes 
791
                                                                              bytes:bytes];
792
    [request addRequestIfNoneMatchHeader:matchETag];
793
    return request;                                                                          
794
}
795

    
796
// PUT storageURL/container/object (copy from source)
797
+ (id)copyObjectDataRequestWithContainerName:(NSString *)containerName 
798
                                  objectName:(NSString *)objectName 
799
                                 contentType:(NSString *)contentType 
800
                             contentEncoding:(NSString *)contentEncoding 
801
                          contentDisposition:(NSString *)contentDisposition 
802
                                    manifest:(NSString *)manifest 
803
                                     sharing:(NSString *)sharing 
804
                                    isPublic:(NSUInteger)isPublic 
805
                                    metadata:(NSDictionary *)metadata 
806
                         sourceContainerName:(NSString *)sourceContainerName 
807
                            sourceObjectName:(NSString *)sourceObjectName
808
                               sourceAccount:(NSString *)sourceAccount
809
                               sourceVersion:(NSString *)sourceVersion {
810
	ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"PUT" containerName:containerName objectName:objectName];
811
    [request prepareObjectRequestWithETag:nil 
812
                              contentType:contentType 
813
                          contentEncoding:contentEncoding 
814
                       contentDisposition:contentDisposition 
815
                                 manifest:manifest 
816
                                  sharing:sharing 
817
                                 isPublic:isPublic 
818
                                 metadata:metadata];
819
    [request addRequestHeader:@"Content-Length" value:@"0"];
820
    [request addRequestHeader:@"X-Copy-From" value:[NSString stringWithFormat:@"/%@/%@", sourceContainerName, sourceObjectName]];
821
    if (sourceAccount)
822
        [request addRequestHeader:@"X-Source-Account" value:sourceAccount];
823
    if (sourceVersion)
824
        [request addRequestHeader:@"X-Source-Version" value:sourceVersion];
825
    return request;
826
}
827

    
828
// PUT storageURL/container/object (copy from source) [If-Match]
829
+ (id)copyObjectDataRequestWithContainerName:(NSString *)containerName 
830
                                  objectName:(NSString *)objectName 
831
                                 contentType:(NSString *)contentType 
832
                             contentEncoding:(NSString *)contentEncoding 
833
                          contentDisposition:(NSString *)contentDisposition 
834
                                    manifest:(NSString *)manifest 
835
                                     sharing:(NSString *)sharing 
836
                                    isPublic:(NSUInteger)isPublic 
837
                                    metadata:(NSDictionary *)metadata 
838
                         sourceContainerName:(NSString *)sourceContainerName 
839
                            sourceObjectName:(NSString *)sourceObjectName
840
                               sourceAccount:(NSString *)sourceAccount
841
                               sourceVersion:(NSString *)sourceVersion 
842
                                     ifMatch:(NSString *)matchETag {
843
    ASIPithosObjectRequest *request = [self copyObjectDataRequestWithContainerName:containerName objectName:objectName 
844
                                                                       contentType:contentType 
845
                                                                   contentEncoding:contentEncoding 
846
                                                                contentDisposition:contentDisposition 
847
                                                                          manifest:manifest 
848
                                                                           sharing:sharing 
849
                                                                          isPublic:isPublic 
850
                                                                          metadata:metadata 
851
                                                               sourceContainerName:sourceContainerName 
852
                                                                  sourceObjectName:sourceObjectName 
853
                                                                     sourceAccount:sourceAccount
854
                                                                     sourceVersion:sourceVersion];
855
    [request addRequestIfMatchHeader:matchETag];
856
    return request;                                                                          
857
}
858

    
859
// PUT storageURL/container/object (copy from source) [If-None-Match]
860
+ (id)copyObjectDataRequestWithContainerName:(NSString *)containerName 
861
                                  objectName:(NSString *)objectName 
862
                                 contentType:(NSString *)contentType 
863
                             contentEncoding:(NSString *)contentEncoding 
864
                          contentDisposition:(NSString *)contentDisposition 
865
                                    manifest:(NSString *)manifest 
866
                                     sharing:(NSString *)sharing 
867
                                    isPublic:(NSUInteger)isPublic 
868
                                    metadata:(NSDictionary *)metadata 
869
                         sourceContainerName:(NSString *)sourceContainerName 
870
                            sourceObjectName:(NSString *)sourceObjectName
871
                               sourceAccount:(NSString *)sourceAccount
872
                               sourceVersion:(NSString *)sourceVersion 
873
                                 ifNoneMatch:(NSString *)matchETag {
874
    ASIPithosObjectRequest *request = [self copyObjectDataRequestWithContainerName:containerName objectName:objectName 
875
                                                                       contentType:contentType 
876
                                                                   contentEncoding:contentEncoding 
877
                                                                contentDisposition:contentDisposition 
878
                                                                          manifest:manifest 
879
                                                                           sharing:sharing 
880
                                                                          isPublic:isPublic 
881
                                                                          metadata:metadata 
882
                                                               sourceContainerName:sourceContainerName 
883
                                                                  sourceObjectName:sourceObjectName 
884
                                                                     sourceAccount:sourceAccount
885
                                                                     sourceVersion:sourceVersion];
886
    [request addRequestIfNoneMatchHeader:matchETag];
887
    return request;                                                                          
888
}
889

    
890
// COPY storageURL/container/object (copy to destination)
891
+ (id)copyObjectDataRequestWithContainerName:(NSString *)containerName 
892
                                  objectName:(NSString *)objectName 
893
                                 contentType:(NSString *)contentType 
894
                             contentEncoding:(NSString *)contentEncoding 
895
                          contentDisposition:(NSString *)contentDisposition 
896
                                    manifest:(NSString *)manifest 
897
                                     sharing:(NSString *)sharing 
898
                                    isPublic:(NSUInteger)isPublic 
899
                                    metadata:(NSDictionary *)metadata 
900
                    destinationContainerName:(NSString *)destinationContainerName 
901
                       destinationObjectName:(NSString *)destinationObjectName
902
                          destinationAccount:(NSString *)destinationAccount
903
                               sourceVersion:(NSString *)sourceVersion {
904
	ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"COPY" containerName:containerName objectName:objectName];
905
    [request prepareObjectRequestWithETag:nil 
906
                              contentType:contentType 
907
                          contentEncoding:contentEncoding 
908
                       contentDisposition:contentDisposition 
909
                                 manifest:manifest 
910
                                  sharing:sharing 
911
                                 isPublic:isPublic 
912
                                 metadata:metadata];
913
    [request addRequestHeader:@"Destination" value:[NSString stringWithFormat:@"/%@/%@", destinationContainerName, destinationObjectName]];
914
    if (destinationAccount)
915
        [request addRequestHeader:@"Destination-Account" value:destinationAccount];
916
    if (sourceVersion)
917
        [request addRequestHeader:@"X-Source-Version" value:sourceVersion];
918
    return request;
919
}
920

    
921
// COPY storageURL/container/object (copy to destination) [If-Match]
922
+ (id)copyObjectDataRequestWithContainerName:(NSString *)containerName 
923
                                  objectName:(NSString *)objectName 
924
                                 contentType:(NSString *)contentType 
925
                             contentEncoding:(NSString *)contentEncoding 
926
                          contentDisposition:(NSString *)contentDisposition 
927
                                    manifest:(NSString *)manifest 
928
                                     sharing:(NSString *)sharing 
929
                                    isPublic:(NSUInteger)isPublic 
930
                                    metadata:(NSDictionary *)metadata 
931
                    destinationContainerName:(NSString *)destinationContainerName 
932
                       destinationObjectName:(NSString *)destinationObjectName
933
                          destinationAccount:(NSString *)destinationAccount
934
                               sourceVersion:(NSString *)sourceVersion 
935
                                     ifMatch:(NSString *)matchETag {
936
    ASIPithosObjectRequest *request = [self copyObjectDataRequestWithContainerName:containerName objectName:objectName 
937
                                                                       contentType:contentType 
938
                                                                   contentEncoding:contentEncoding 
939
                                                                contentDisposition:contentDisposition 
940
                                                                          manifest:manifest 
941
                                                                           sharing:sharing 
942
                                                                          isPublic:isPublic 
943
                                                                          metadata:metadata 
944
                                                          destinationContainerName:destinationContainerName 
945
                                                             destinationObjectName:destinationObjectName 
946
                                                                destinationAccount:destinationAccount
947
                                                                     sourceVersion:sourceVersion];
948
    [request addRequestIfMatchHeader:matchETag];
949
    return request;                                                                          
950
}
951

    
952
// COPY storageURL/container/object (copy to destination) [If-None-Match]
953
+ (id)copyObjectDataRequestWithContainerName:(NSString *)containerName 
954
                                  objectName:(NSString *)objectName 
955
                                 contentType:(NSString *)contentType 
956
                             contentEncoding:(NSString *)contentEncoding 
957
                          contentDisposition:(NSString *)contentDisposition 
958
                                    manifest:(NSString *)manifest 
959
                                     sharing:(NSString *)sharing 
960
                                    isPublic:(NSUInteger)isPublic 
961
                                    metadata:(NSDictionary *)metadata 
962
                    destinationContainerName:(NSString *)destinationContainerName 
963
                       destinationObjectName:(NSString *)destinationObjectName
964
                          destinationAccount:(NSString *)destinationAccount
965
                               sourceVersion:(NSString *)sourceVersion 
966
                                 ifNoneMatch:(NSString *)matchETag {
967
    ASIPithosObjectRequest *request = [self copyObjectDataRequestWithContainerName:containerName objectName:objectName 
968
                                                                       contentType:contentType 
969
                                                                   contentEncoding:contentEncoding 
970
                                                                contentDisposition:contentDisposition 
971
                                                                          manifest:manifest 
972
                                                                           sharing:sharing 
973
                                                                          isPublic:isPublic 
974
                                                                          metadata:metadata 
975
                                                          destinationContainerName:destinationContainerName 
976
                                                             destinationObjectName:destinationObjectName 
977
                                                                destinationAccount:destinationAccount
978
                                                                     sourceVersion:sourceVersion];
979
    [request addRequestIfNoneMatchHeader:matchETag];
980
    return request;                                                                          
981
}
982

    
983
// PUT storageURL/container/object (move from source)
984
+ (id)moveObjectDataRequestWithContainerName:(NSString *)containerName 
985
                                  objectName:(NSString *)objectName 
986
                                 contentType:(NSString *)contentType 
987
                             contentEncoding:(NSString *)contentEncoding 
988
                          contentDisposition:(NSString *)contentDisposition 
989
                                    manifest:(NSString *)manifest 
990
                                     sharing:(NSString *)sharing 
991
                                    isPublic:(NSUInteger)isPublic 
992
                                    metadata:(NSDictionary *)metadata 
993
                         sourceContainerName:(NSString *)sourceContainerName 
994
                            sourceObjectName:(NSString *)sourceObjectName 
995
                               sourceAccount:(NSString *)sourceAccount { 
996
	ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"PUT" containerName:containerName objectName:objectName];
997
    [request prepareObjectRequestWithETag:nil 
998
                              contentType:contentType 
999
                          contentEncoding:contentEncoding 
1000
                       contentDisposition:contentDisposition 
1001
                                 manifest:manifest 
1002
                                  sharing:sharing 
1003
                                 isPublic:isPublic 
1004
                                 metadata:metadata];
1005
    [request addRequestHeader:@"Content-Length" value:@"0"];
1006
    [request addRequestHeader:@"X-Move-From" value:[NSString stringWithFormat:@"/%@/%@", sourceContainerName, sourceObjectName]];
1007
    if (sourceAccount)
1008
        [request addRequestHeader:@"X-Source-Account" value:sourceAccount];
1009
    return request;
1010
}
1011

    
1012
// PUT storageURL/container/object (move from source) [If-Match]
1013
+ (id)moveObjectDataRequestWithContainerName:(NSString *)containerName 
1014
                                  objectName:(NSString *)objectName 
1015
                                 contentType:(NSString *)contentType 
1016
                             contentEncoding:(NSString *)contentEncoding 
1017
                          contentDisposition:(NSString *)contentDisposition 
1018
                                    manifest:(NSString *)manifest 
1019
                                     sharing:(NSString *)sharing 
1020
                                    isPublic:(NSUInteger)isPublic 
1021
                                    metadata:(NSDictionary *)metadata 
1022
                         sourceContainerName:(NSString *)sourceContainerName 
1023
                            sourceObjectName:(NSString *)sourceObjectName
1024
                               sourceAccount:(NSString *)sourceAccount
1025
                                     ifMatch:(NSString *)matchETag {
1026
    ASIPithosObjectRequest *request = [self moveObjectDataRequestWithContainerName:containerName objectName:objectName 
1027
                                                                       contentType:contentType 
1028
                                                                   contentEncoding:contentEncoding 
1029
                                                                contentDisposition:contentDisposition 
1030
                                                                          manifest:manifest 
1031
                                                                           sharing:sharing 
1032
                                                                          isPublic:isPublic 
1033
                                                                          metadata:metadata 
1034
                                                               sourceContainerName:sourceContainerName 
1035
                                                                  sourceObjectName:sourceObjectName 
1036
                                                                     sourceAccount:sourceAccount];
1037
    [request addRequestIfMatchHeader:matchETag];
1038
    return request;                                               
1039
}
1040

    
1041
// PUT storageURL/container/object (move from source) [If-None-Match]
1042
+ (id)moveObjectDataRequestWithContainerName:(NSString *)containerName 
1043
                                  objectName:(NSString *)objectName 
1044
                                 contentType:(NSString *)contentType 
1045
                             contentEncoding:(NSString *)contentEncoding 
1046
                          contentDisposition:(NSString *)contentDisposition 
1047
                                    manifest:(NSString *)manifest 
1048
                                     sharing:(NSString *)sharing 
1049
                                    isPublic:(NSUInteger)isPublic 
1050
                                    metadata:(NSDictionary *)metadata 
1051
                         sourceContainerName:(NSString *)sourceContainerName 
1052
                            sourceObjectName:(NSString *)sourceObjectName
1053
                               sourceAccount:(NSString *)sourceAccount
1054
                                 ifNoneMatch:(NSString *)matchETag {
1055
    ASIPithosObjectRequest *request = [self moveObjectDataRequestWithContainerName:containerName objectName:objectName 
1056
                                                                       contentType:contentType 
1057
                                                                   contentEncoding:contentEncoding 
1058
                                                                contentDisposition:contentDisposition 
1059
                                                                          manifest:manifest 
1060
                                                                           sharing:sharing 
1061
                                                                          isPublic:isPublic 
1062
                                                                          metadata:metadata 
1063
                                                               sourceContainerName:sourceContainerName 
1064
                                                                  sourceObjectName:sourceObjectName 
1065
                                                                     sourceAccount:sourceAccount];
1066
    [request addRequestIfNoneMatchHeader:matchETag];
1067
    return request;                                               
1068
}
1069

    
1070
// MOVE storageURL/container/object (move to destination)
1071
+ (id)moveObjectDataRequestWithContainerName:(NSString *)containerName 
1072
                                  objectName:(NSString *)objectName 
1073
                                 contentType:(NSString *)contentType 
1074
                             contentEncoding:(NSString *)contentEncoding 
1075
                          contentDisposition:(NSString *)contentDisposition 
1076
                                    manifest:(NSString *)manifest 
1077
                                     sharing:(NSString *)sharing 
1078
                                    isPublic:(NSUInteger)isPublic 
1079
                                    metadata:(NSDictionary *)metadata 
1080
                    destinationContainerName:(NSString *)destinationContainerName 
1081
                       destinationObjectName:(NSString *)destinationObjectName 
1082
                          destinationAccount:(NSString *)destinationAccount {
1083
	ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"MOVE" containerName:containerName objectName:objectName];
1084
    [request prepareObjectRequestWithETag:nil 
1085
                              contentType:contentType 
1086
                          contentEncoding:contentEncoding 
1087
                       contentDisposition:contentDisposition 
1088
                                 manifest:manifest 
1089
                                  sharing:sharing 
1090
                                 isPublic:isPublic 
1091
                                 metadata:metadata];
1092
    [request addRequestHeader:@"Destination" value:[NSString stringWithFormat:@"/%@/%@", destinationContainerName, destinationObjectName]];
1093
    if (destinationAccount)
1094
        [request addRequestHeader:@"Destination-Account" value:destinationAccount];
1095
    return request;
1096
}
1097

    
1098
// MOVE storageURL/container/object (move to destination) [If-Match]
1099
+ (id)moveObjectDataRequestWithContainerName:(NSString *)containerName 
1100
                                  objectName:(NSString *)objectName 
1101
                                 contentType:(NSString *)contentType 
1102
                             contentEncoding:(NSString *)contentEncoding 
1103
                          contentDisposition:(NSString *)contentDisposition 
1104
                                    manifest:(NSString *)manifest 
1105
                                     sharing:(NSString *)sharing 
1106
                                    isPublic:(NSUInteger)isPublic 
1107
                                    metadata:(NSDictionary *)metadata 
1108
                    destinationContainerName:(NSString *)destinationContainerName 
1109
                       destinationObjectName:(NSString *)destinationObjectName
1110
                          destinationAccount:(NSString *)destinationAccount
1111
                                     ifMatch:(NSString *)matchETag {
1112
    ASIPithosObjectRequest *request = [self moveObjectDataRequestWithContainerName:containerName objectName:objectName 
1113
                                                                       contentType:contentType 
1114
                                                                   contentEncoding:contentEncoding 
1115
                                                                contentDisposition:contentDisposition 
1116
                                                                          manifest:manifest 
1117
                                                                           sharing:sharing 
1118
                                                                          isPublic:isPublic 
1119
                                                                          metadata:metadata 
1120
                                                          destinationContainerName:destinationContainerName 
1121
                                                             destinationObjectName:destinationObjectName 
1122
                                                                destinationAccount:destinationAccount];
1123
    [request addRequestIfMatchHeader:matchETag];
1124
    return request;                                                                          
1125
}
1126

    
1127
// MOVE storageURL/container/object (move to destination) [If-None-Match]
1128
+ (id)moveObjectDataRequestWithContainerName:(NSString *)containerName 
1129
                                  objectName:(NSString *)objectName 
1130
                                 contentType:(NSString *)contentType 
1131
                             contentEncoding:(NSString *)contentEncoding 
1132
                          contentDisposition:(NSString *)contentDisposition 
1133
                                    manifest:(NSString *)manifest 
1134
                                     sharing:(NSString *)sharing 
1135
                                    isPublic:(NSUInteger)isPublic 
1136
                                    metadata:(NSDictionary *)metadata 
1137
                    destinationContainerName:(NSString *)destinationContainerName 
1138
                       destinationObjectName:(NSString *)destinationObjectName
1139
                          destinationAccount:(NSString *)destinationAccount
1140
                                 ifNoneMatch:(NSString *)matchETag {
1141
    ASIPithosObjectRequest *request = [self moveObjectDataRequestWithContainerName:containerName objectName:objectName 
1142
                                                                       contentType:contentType 
1143
                                                                   contentEncoding:contentEncoding 
1144
                                                                contentDisposition:contentDisposition 
1145
                                                                          manifest:manifest 
1146
                                                                           sharing:sharing 
1147
                                                                          isPublic:isPublic 
1148
                                                                          metadata:metadata 
1149
                                                          destinationContainerName:destinationContainerName 
1150
                                                             destinationObjectName:destinationObjectName 
1151
                                                                destinationAccount:destinationAccount];
1152
    [request addRequestIfNoneMatchHeader:matchETag];
1153
    return request;                                                                          
1154
}
1155

    
1156
#pragma mark -
1157
#pragma mark POST
1158

    
1159
// POST storageURL/container/object?[update=] (update metadata)
1160
+ (id)updateObjectMetadataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName update:(BOOL)update {
1161
    NSString *queryString = nil;
1162
    if (update)
1163
        queryString = @"?update=";
1164
	return [self storageRequestWithMethod:@"POST" containerName:containerName objectName:objectName queryString:queryString];
1165
}
1166

    
1167
// POST storageURL/container/object?[update=] (update metadata) [If-Match]
1168
+ (id)updateObjectMetadataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1169
                                            update:(BOOL)update 
1170
                                           ifMatch:(NSString *)matchETag {
1171
    ASIPithosObjectRequest *request = [self updateObjectMetadataRequestWithContainerName:containerName objectName:objectName update:update];
1172
    [request addRequestIfMatchHeader:matchETag];
1173
    return request;                                                                          
1174
}
1175

    
1176
// POST storageURL/container/object?[update=] (update metadata) [If-None-Match]
1177
+ (id)updateObjectMetadataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1178
                                            update:(BOOL)update 
1179
                                       ifNoneMatch:(NSString *)matchETag {
1180
    ASIPithosObjectRequest *request = [self updateObjectMetadataRequestWithContainerName:containerName objectName:objectName update:update];
1181
    [request addRequestIfNoneMatchHeader:matchETag];
1182
    return request;                                                                          
1183
}
1184

    
1185
// POST storageURL/container/object?[update=] (update metadata)
1186
+ (id)updateObjectMetadataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1187
                                   contentEncoding:(NSString *)contentEncoding 
1188
                                contentDisposition:(NSString *)contentDisposition 
1189
                                          manifest:(NSString *)manifest 
1190
                                           sharing:(NSString *)sharing 
1191
                                          isPublic:(NSUInteger)isPublic 
1192
                                          metadata:(NSDictionary *)metadata 
1193
                                            update:(BOOL)update {
1194
    NSString *queryString = nil;
1195
    if (update)
1196
        queryString = @"?update=";
1197
	ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"POST" containerName:containerName objectName:objectName queryString:queryString];
1198
    [request prepareObjectRequestWithETag:nil 
1199
                              contentType:nil 
1200
                          contentEncoding:contentEncoding 
1201
                       contentDisposition:contentDisposition 
1202
                                 manifest:manifest 
1203
                                  sharing:sharing 
1204
                                 isPublic:isPublic 
1205
                                 metadata:metadata];
1206
    return request;
1207
}
1208

    
1209
// POST storageURL/container/object?[update=] (update metadata) [If-Match]
1210
+ (id)updateObjectMetadataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1211
                                   contentEncoding:(NSString *)contentEncoding 
1212
                                contentDisposition:(NSString *)contentDisposition 
1213
                                          manifest:(NSString *)manifest 
1214
                                           sharing:(NSString *)sharing 
1215
                                          isPublic:(NSUInteger)isPublic 
1216
                                          metadata:(NSDictionary *)metadata 
1217
                                            update:(BOOL)update 
1218
                                           ifMatch:(NSString *)matchETag {
1219
    ASIPithosObjectRequest *request = [self updateObjectMetadataRequestWithContainerName:containerName objectName:objectName 
1220
                                                                         contentEncoding:contentEncoding 
1221
                                                                      contentDisposition:contentDisposition 
1222
                                                                                manifest:manifest 
1223
                                                                                 sharing:sharing 
1224
                                                                                isPublic:isPublic 
1225
                                                                                metadata:metadata 
1226
                                                                                  update:update];
1227
    [request addRequestIfMatchHeader:matchETag];
1228
    return request;                                                                          
1229
}
1230

    
1231
// POST storageURL/container/object?[update=] (update metadata) [If-None-Match]
1232
+ (id)updateObjectMetadataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1233
                                   contentEncoding:(NSString *)contentEncoding 
1234
                                contentDisposition:(NSString *)contentDisposition 
1235
                                          manifest:(NSString *)manifest 
1236
                                           sharing:(NSString *)sharing 
1237
                                          isPublic:(NSUInteger)isPublic 
1238
                                          metadata:(NSDictionary *)metadata 
1239
                                            update:(BOOL)update 
1240
                                       ifNoneMatch:(NSString *)matchETag {
1241
    ASIPithosObjectRequest *request = [self updateObjectMetadataRequestWithContainerName:containerName objectName:objectName 
1242
                                                                         contentEncoding:contentEncoding 
1243
                                                                      contentDisposition:contentDisposition 
1244
                                                                                manifest:manifest 
1245
                                                                                 sharing:sharing 
1246
                                                                                isPublic:isPublic 
1247
                                                                                metadata:metadata 
1248
                                                                                  update:update];
1249
    [request addRequestIfNoneMatchHeader:matchETag];
1250
    return request;                                                                          
1251
}
1252

    
1253
// POST storageURL/container/object?[update=] (update data from ASIPithosObject with data)
1254
+ (id)updateObjectDataRequestWithContainerName:(NSString *)containerName object:(ASIPithosObject *)object 
1255
                                        update:(BOOL)update 
1256
                                  contentRange:(NSString *)contentRange {
1257
    NSUInteger isPublic = ASIPithosObjectRequestPublicIgnore;
1258
    if (object.publicURI) {
1259
        isPublic = ASIPithosObjectRequestPublicTrue;
1260
        if ([object.publicURI isEqualToString:@""])
1261
            isPublic = ASIPithosObjectRequestPublicFalse;
1262
    }
1263
    return [self updateObjectDataRequestWithContainerName:containerName objectName:object.name 
1264
                                          contentEncoding:object.contentEncoding 
1265
                                       contentDisposition:object.contentDisposition 
1266
                                                 manifest:object.manifest 
1267
                                                  sharing:object.sharing 
1268
                                                 isPublic:isPublic
1269
                                                 metadata:object.metadata 
1270
                                                   update:update 
1271
                                             contentRange:contentRange 
1272
                                                    bytes:[NSNumber numberWithUnsignedLong:object.bytes]
1273
                                                    data:object.data];
1274
}
1275

    
1276
// POST storageURL/container/object?[update=] (update data from ASIPithosObject with data) [If-Match]
1277
+ (id)updateObjectDataRequestWithContainerName:(NSString *)containerName object:(ASIPithosObject *)object 
1278
                                        update:(BOOL)update 
1279
                                  contentRange:(NSString *)contentRange 
1280
                                       ifMatch:(NSString *)matchETag {
1281
    ASIPithosObjectRequest *request = [self updateObjectDataRequestWithContainerName:containerName object:object 
1282
                                                                              update:update 
1283
                                                                        contentRange:contentRange];
1284
    [request addRequestIfMatchHeader:matchETag];
1285
    return request;                                                                          
1286
}
1287

    
1288
// POST storageURL/container/object?[update=] (update data from ASIPithosObject with data) [If-None-Match]
1289
+ (id)updateObjectDataRequestWithContainerName:(NSString *)containerName object:(ASIPithosObject *)object 
1290
                                        update:(BOOL)update 
1291
                                  contentRange:(NSString *)contentRange 
1292
                                   ifNoneMatch:(NSString *)matchETag {
1293
    ASIPithosObjectRequest *request = [self updateObjectDataRequestWithContainerName:containerName object:object 
1294
                                                                              update:update 
1295
                                                                        contentRange:contentRange];
1296
    [request addRequestIfNoneMatchHeader:matchETag];
1297
    return request;                                                                          
1298
}
1299

    
1300
// POST storageURL/container/object?[update=] (update data from NSData)
1301
+ (id)updateObjectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1302
                               contentEncoding:(NSString *)contentEncoding 
1303
                            contentDisposition:(NSString *)contentDisposition 
1304
                                      manifest:(NSString *)manifest 
1305
                                       sharing:(NSString *)sharing 
1306
                                      isPublic:(NSUInteger)isPublic 
1307
                                      metadata:(NSDictionary *)metadata 
1308
                                        update:(BOOL)update 
1309
                                  contentRange:(NSString *)contentRange 
1310
                                         bytes:(NSNumber *)bytes 
1311
                                          data:(NSData *)data {
1312
    NSString *queryString = nil;
1313
    if (update)
1314
        queryString = @"?update=";
1315
	ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"POST" containerName:containerName objectName:objectName queryString:queryString];
1316
    [request prepareObjectRequestWithETag:nil
1317
                              contentType:@"application/octet-stream"
1318
                          contentEncoding:contentEncoding 
1319
                       contentDisposition:contentDisposition 
1320
                                 manifest:manifest 
1321
                                  sharing:sharing 
1322
                                 isPublic:isPublic 
1323
                                 metadata:metadata];
1324
    if (contentRange)
1325
        [request addRequestHeader:@"Content-Range" value:contentRange];
1326
    if (bytes)
1327
        [request addRequestHeader:@"X-Object-Bytes" value:[NSString stringWithFormat:@"%lu", [bytes unsignedLongValue]]];
1328
	[request appendPostData:data];
1329
	return request;
1330
}
1331

    
1332
// POST storageURL/container/object?[update=] (update data from NSData) [If-Match]
1333
+ (id)updateObjectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1334
                               contentEncoding:(NSString *)contentEncoding 
1335
                            contentDisposition:(NSString *)contentDisposition 
1336
                                      manifest:(NSString *)manifest 
1337
                                       sharing:(NSString *)sharing 
1338
                                      isPublic:(NSUInteger)isPublic 
1339
                                      metadata:(NSDictionary *)metadata 
1340
                                        update:(BOOL)update 
1341
                                  contentRange:(NSString *)contentRange 
1342
                                         bytes:(NSNumber *)bytes 
1343
                                          data:(NSData *)data 
1344
                                       ifMatch:(NSString *)matchETag {
1345
    ASIPithosObjectRequest *request = [self updateObjectDataRequestWithContainerName:containerName objectName:objectName 
1346
                                                                     contentEncoding:contentEncoding 
1347
                                                                  contentDisposition:contentDisposition 
1348
                                                                            manifest:manifest 
1349
                                                                             sharing:sharing 
1350
                                                                            isPublic:isPublic 
1351
                                                                            metadata:metadata 
1352
                                                                              update:update 
1353
                                                                        contentRange:contentRange 
1354
                                                                               bytes:bytes 
1355
                                                                                data:data];
1356
    [request addRequestIfMatchHeader:matchETag];
1357
    return request;                                                                          
1358
}
1359

    
1360
// POST storageURL/container/object?[update=] (update data from NSData) [If-None-Match]
1361
+ (id)updateObjectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1362
                               contentEncoding:(NSString *)contentEncoding 
1363
                            contentDisposition:(NSString *)contentDisposition 
1364
                                      manifest:(NSString *)manifest 
1365
                                       sharing:(NSString *)sharing 
1366
                                      isPublic:(NSUInteger)isPublic 
1367
                                      metadata:(NSDictionary *)metadata 
1368
                                        update:(BOOL)update 
1369
                                  contentRange:(NSString *)contentRange 
1370
                                         bytes:(NSNumber *)bytes 
1371
                                          data:(NSData *)data 
1372
                                   ifNoneMatch:(NSString *)matchETag {
1373
    ASIPithosObjectRequest *request = [self updateObjectDataRequestWithContainerName:containerName objectName:objectName 
1374
                                                                     contentEncoding:contentEncoding 
1375
                                                                  contentDisposition:contentDisposition 
1376
                                                                            manifest:manifest 
1377
                                                                             sharing:sharing 
1378
                                                                            isPublic:isPublic 
1379
                                                                            metadata:metadata 
1380
                                                                              update:update 
1381
                                                                        contentRange:contentRange 
1382
                                                                               bytes:bytes 
1383
                                                                                data:data];
1384
    [request addRequestIfNoneMatchHeader:matchETag];
1385
    return request;                                                                          
1386
}
1387

    
1388
// POST storageURL/container/object?[update=] (update data from file)
1389
+ (id)updateObjectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1390
                               contentEncoding:(NSString *)contentEncoding 
1391
                            contentDisposition:(NSString *)contentDisposition 
1392
                                      manifest:(NSString *)manifest 
1393
                                       sharing:(NSString *)sharing 
1394
                                      isPublic:(NSUInteger)isPublic 
1395
                                      metadata:(NSDictionary *)metadata 
1396
                                        update:(BOOL)update 
1397
                                  contentRange:(NSString *)contentRange 
1398
                                         bytes:(NSNumber *)bytes 
1399
                                          file:(NSString *)filePath {
1400
    NSString *queryString = nil;
1401
    if (update)
1402
        queryString = @"?update=";
1403
	ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"POST" containerName:containerName objectName:objectName queryString:queryString];
1404
    [request prepareObjectRequestWithETag:nil
1405
                              contentType:@"application/octet-stream"
1406
                          contentEncoding:contentEncoding 
1407
                       contentDisposition:contentDisposition 
1408
                                 manifest:manifest 
1409
                                  sharing:sharing 
1410
                                 isPublic:isPublic 
1411
                                 metadata:metadata];
1412
    if (contentRange)
1413
        [request addRequestHeader:@"Content-Range" value:contentRange];
1414
    if (bytes)
1415
        [request addRequestHeader:@"X-Object-Bytes" value:[NSString stringWithFormat:@"%lu", [bytes unsignedLongValue]]];
1416
	request.shouldStreamPostDataFromDisk = YES;
1417
    request.postBodyFilePath = filePath;
1418
	return request;
1419
}
1420

    
1421
// POST storageURL/container/object?[update=] (update data from file) [If-Match]
1422
+ (id)updateObjectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1423
                               contentEncoding:(NSString *)contentEncoding 
1424
                            contentDisposition:(NSString *)contentDisposition 
1425
                                      manifest:(NSString *)manifest 
1426
                                       sharing:(NSString *)sharing 
1427
                                      isPublic:(NSUInteger)isPublic 
1428
                                      metadata:(NSDictionary *)metadata 
1429
                                        update:(BOOL)update 
1430
                                  contentRange:(NSString *)contentRange 
1431
                                         bytes:(NSNumber *)bytes 
1432
                                          file:(NSString *)filePath 
1433
                                       ifMatch:(NSString *)matchETag {
1434
    ASIPithosObjectRequest *request = [self updateObjectDataRequestWithContainerName:containerName objectName:objectName 
1435
                                                                     contentEncoding:contentEncoding 
1436
                                                                  contentDisposition:contentDisposition 
1437
                                                                            manifest:manifest 
1438
                                                                             sharing:sharing 
1439
                                                                            isPublic:isPublic 
1440
                                                                            metadata:metadata 
1441
                                                                              update:update 
1442
                                                                        contentRange:contentRange 
1443
                                                                               bytes:bytes 
1444
                                                                                file:filePath];
1445
    [request addRequestIfMatchHeader:matchETag];
1446
    return request;                                                                          
1447
}
1448

    
1449
// POST storageURL/container/object?[update=] (update data from file) [If-None-Match]
1450
+ (id)updateObjectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1451
                               contentEncoding:(NSString *)contentEncoding 
1452
                            contentDisposition:(NSString *)contentDisposition 
1453
                                      manifest:(NSString *)manifest 
1454
                                       sharing:(NSString *)sharing 
1455
                                      isPublic:(NSUInteger)isPublic 
1456
                                      metadata:(NSDictionary *)metadata 
1457
                                        update:(BOOL)update 
1458
                                  contentRange:(NSString *)contentRange 
1459
                                         bytes:(NSNumber *)bytes 
1460
                                          file:(NSString *)filePath 
1461
                                   ifNoneMatch:(NSString *)matchETag {
1462
    ASIPithosObjectRequest *request = [self updateObjectDataRequestWithContainerName:containerName objectName:objectName 
1463
                                                                     contentEncoding:contentEncoding 
1464
                                                                  contentDisposition:contentDisposition 
1465
                                                                            manifest:manifest 
1466
                                                                             sharing:sharing 
1467
                                                                            isPublic:isPublic 
1468
                                                                            metadata:metadata 
1469
                                                                              update:update 
1470
                                                                        contentRange:contentRange 
1471
                                                                               bytes:bytes 
1472
                                                                                file:filePath];
1473
    [request addRequestIfNoneMatchHeader:matchETag];
1474
    return request;                                                                          
1475
}
1476

    
1477
// POST storageURL/container/object?[update=] (update data from source)
1478
+ (id)updateObjectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1479
                               contentEncoding:(NSString *)contentEncoding 
1480
                            contentDisposition:(NSString *)contentDisposition 
1481
                                      manifest:(NSString *)manifest 
1482
                                       sharing:(NSString *)sharing 
1483
                                      isPublic:(NSUInteger)isPublic 
1484
                                      metadata:(NSDictionary *)metadata 
1485
                                        update:(BOOL)update 
1486
                                  contentRange:(NSString *)contentRange 
1487
                                         bytes:(NSNumber *)bytes 
1488
                           sourceContainerName:(NSString *)sourceContainerName 
1489
                              sourceObjectName:(NSString *)sourceObjectName 
1490
                                 sourceAccount:(NSString *)sourceAccount
1491
                                 sourceVersion:(NSString *)sourceVersion {
1492
    NSString *queryString = nil;
1493
    if (update)
1494
        queryString = @"?update=";
1495
	ASIPithosObjectRequest *request = [self storageRequestWithMethod:@"POST" containerName:containerName objectName:objectName queryString:queryString];
1496
    [request prepareObjectRequestWithETag:nil
1497
                              contentType:nil
1498
                          contentEncoding:contentEncoding 
1499
                       contentDisposition:contentDisposition 
1500
                                 manifest:manifest 
1501
                                  sharing:sharing 
1502
                                 isPublic:isPublic 
1503
                                 metadata:metadata];
1504
    if (contentRange)
1505
        [request addRequestHeader:@"Content-Range" value:contentRange];
1506
    if (bytes)
1507
        [request addRequestHeader:@"X-Object-Bytes" value:[NSString stringWithFormat:@"%lu", [bytes unsignedLongValue]]];
1508
    [request addRequestHeader:@"X-Source-Object" value:[NSString stringWithFormat:@"/%@/%@", sourceContainerName, sourceObjectName]];
1509
    if (sourceAccount)
1510
        [request addRequestHeader:@"X-Source-Account" value:sourceAccount];
1511
    if (sourceVersion)
1512
        [request addRequestHeader:@"X-Source-Version" value:sourceVersion];
1513
	return request;
1514

    
1515
}
1516

    
1517
// POST storageURL/container/object?[update=] (update data from source) [If-Match]
1518
+ (id)updateObjectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1519
                               contentEncoding:(NSString *)contentEncoding 
1520
                            contentDisposition:(NSString *)contentDisposition 
1521
                                      manifest:(NSString *)manifest 
1522
                                       sharing:(NSString *)sharing 
1523
                                      isPublic:(NSUInteger)isPublic 
1524
                                      metadata:(NSDictionary *)metadata 
1525
                                        update:(BOOL)update 
1526
                                  contentRange:(NSString *)contentRange 
1527
                                         bytes:(NSNumber *)bytes 
1528
                           sourceContainerName:(NSString *)sourceContainerName 
1529
                              sourceObjectName:(NSString *)sourceObjectName 
1530
                                 sourceAccount:(NSString *)sourceAccount
1531
                                 sourceVersion:(NSString *)sourceVersion 
1532
                                       ifMatch:(NSString *)matchETag {
1533
    ASIPithosObjectRequest *request = [self updateObjectDataRequestWithContainerName:containerName objectName:objectName 
1534
                                                                     contentEncoding:contentEncoding 
1535
                                                                  contentDisposition:contentDisposition 
1536
                                                                            manifest:manifest 
1537
                                                                             sharing:sharing 
1538
                                                                            isPublic:isPublic 
1539
                                                                            metadata:metadata 
1540
                                                                              update:update 
1541
                                                                        contentRange:contentRange 
1542
                                                                               bytes:bytes 
1543
                                                                 sourceContainerName:sourceContainerName 
1544
                                                                    sourceObjectName:sourceObjectName 
1545
                                                                       sourceAccount:sourceAccount 
1546
                                                                       sourceVersion:sourceVersion];
1547
    [request addRequestIfMatchHeader:matchETag];
1548
    return request;                                                                          
1549
}
1550

    
1551
// POST storageURL/container/object?[update=] (update data from source) [If-None-Match]
1552
+ (id)updateObjectDataRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName 
1553
                               contentEncoding:(NSString *)contentEncoding 
1554
                            contentDisposition:(NSString *)contentDisposition 
1555
                                      manifest:(NSString *)manifest 
1556
                                       sharing:(NSString *)sharing 
1557
                                      isPublic:(NSUInteger)isPublic 
1558
                                      metadata:(NSDictionary *)metadata 
1559
                                        update:(BOOL)update 
1560
                                  contentRange:(NSString *)contentRange 
1561
                                         bytes:(NSNumber *)bytes 
1562
                           sourceContainerName:(NSString *)sourceContainerName 
1563
                              sourceObjectName:(NSString *)sourceObjectName 
1564
                                 sourceAccount:(NSString *)sourceAccount
1565
                                 sourceVersion:(NSString *)sourceVersion 
1566
                                   ifNoneMatch:(NSString *)matchETag {
1567
    ASIPithosObjectRequest *request = [self updateObjectDataRequestWithContainerName:containerName objectName:objectName 
1568
                                                                     contentEncoding:contentEncoding 
1569
                                                                  contentDisposition:contentDisposition 
1570
                                                                            manifest:manifest 
1571
                                                                             sharing:sharing 
1572
                                                                            isPublic:isPublic 
1573
                                                                            metadata:metadata 
1574
                                                                              update:update 
1575
                                                                        contentRange:contentRange 
1576
                                                                               bytes:bytes 
1577
                                                                 sourceContainerName:sourceContainerName 
1578
                                                                    sourceObjectName:sourceObjectName 
1579
                                                                       sourceAccount:sourceAccount 
1580
                                                                       sourceVersion:sourceVersion];
1581
    [request addRequestIfNoneMatchHeader:matchETag];
1582
    return request;                                                                          
1583
}
1584

    
1585
#pragma mark -
1586
#pragma mark DELETE
1587

    
1588
// DELETE storageURL/container/object
1589
+ (id)deleteObjectRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName {
1590
    return [self storageRequestWithMethod:@"DELETE" containerName:containerName objectName:objectName];
1591
}
1592

    
1593
// DELETE storageURL/container/object?[until=untilTimestamp]
1594
+ (id)deleteObjectRequestWithContainerName:(NSString *)containerName objectName:(NSString *)objectName until:(NSDate *)untilTimestamp {
1595
    NSString *queryString = nil;
1596
    if (untilTimestamp)
1597
        queryString = [NSString stringWithFormat:@"?until=%d", (int)[untilTimestamp timeIntervalSince1970]];
1598
	return [self storageRequestWithMethod:@"DELETE" containerName:containerName objectName:objectName queryString:queryString];
1599
}
1600

    
1601
#pragma mark -
1602
#pragma mark NSXMLParserDelegate
1603

    
1604
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
1605
	self.currentElement = elementName;
1606
    if ((objectRequestType == ASIPithosObjectRequestHashmap) && [elementName isEqualToString:@"object"]) {
1607
        blockSize = [[attributeDict valueForKey:@"block_size"] intValue];
1608
        blockHash = [[NSString alloc] initWithString:[attributeDict valueForKey:@"block_hash"]];
1609
        bytes = [[attributeDict valueForKey:@"bytes"] intValue];
1610
    } else if ((objectRequestType == ASIPithosObjectRequestVersions) && [elementName isEqualToString:@"version"]) {
1611
        self.currentObject = [ASIPithosObject object];
1612
        currentObject.versionTimestamp = [NSDate dateWithTimeIntervalSince1970:[[attributeDict valueForKey:@"timestamp"] doubleValue]];
1613
	}
1614
	self.currentContent = @"";
1615
}
1616

    
1617
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
1618
	if ((objectRequestType == ASIPithosObjectRequestHashmap) && [elementName isEqualToString:@"hash"]) {
1619
        [hashes addObject:currentContent];
1620
    } else if (objectRequestType == ASIPithosObjectRequestVersions) {
1621
        if ([elementName isEqualToString:@"version"]) {
1622
            currentObject.version = currentContent;
1623
        } else if ([elementName isEqualToString:@"object"]) {
1624
            [versions addObject:currentObject];
1625
            self.currentObject = nil;
1626
        }
1627
	}
1628
}
1629

    
1630
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
1631
    self.currentContent = [currentContent stringByAppendingString:string];
1632
}
1633

    
1634
@end