Skip to content

Commit

Permalink
Pass original request into DAVPutRequest instead of setting data/stre…
Browse files Browse the repository at this point in the history
…am/MIMEType properties.
  • Loading branch information
samdeane committed Feb 12, 2013
1 parent 9396249 commit 8d5dccd
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 35 deletions.
15 changes: 7 additions & 8 deletions Sources/Core/DAVRequests.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,15 @@

@interface DAVPutRequest : DAVRequest {
@private
NSData *_pdata;
NSInputStream *_pstream;
NSString *_MIMEType;
NSMutableURLRequest* _request;
}

@property(nonatomic, assign, readonly) id <DAVPutRequestDelegate> delegate;
+ (NSString*)MIMETypeForExtension:(NSString*)extension;

- (id)initWithPath:(NSString*)path originalRequest:(NSURLRequest*)request session:(DAVSession *)session delegate:(id <DAVRequestDelegate>)delegate;

// Pass - [NSData dataWithContentsOfFile:] to upload a local file
@property (retain) NSData *data;
@property(nonatomic, copy) NSString *dataMIMEType; // defaults to application/octet-stream
@property (retain) NSInputStream *stream;
- (NSUInteger)expectedLength;

@property(nonatomic, assign, readonly) id <DAVPutRequestDelegate> delegate;

@end
74 changes: 47 additions & 27 deletions Sources/Core/DAVRequests.m
Original file line number Diff line number Diff line change
Expand Up @@ -157,55 +157,75 @@ - (NSString *)method {

@end


@implementation DAVPutRequest

- (id)initWithSession:(DAVSession *)session;
+ (NSString*)MIMETypeForExtension:(NSString*)extension
{
if (self = [super initWithSession:session])
CFStringRef type = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (CFStringRef)extension, NULL);
NSString* mimeType = nil;
if (type)
{
mimeType = (NSString*)UTTypeCopyPreferredTagWithClass(type, kUTTagClassMIMEType);
CFRelease(type);
[mimeType autorelease];
CFMakeCollectable(mimeType);
}
if (!mimeType)
{
_MIMEType = @"application/octet-stream";
mimeType = @"application/octet-stream";
}

return mimeType;
}


- (id)initWithPath:(NSString*)path originalRequest:(NSURLRequest*)originalRequest session:(DAVSession *)session delegate:(id<DAVRequestDelegate>)delegate
{
if ((self = [super initWithPath:path session:session delegate:delegate]))
{

_request = [originalRequest mutableCopy];

if(![_request valueForHTTPHeaderField:@"Content-Length"])
{
NSData* data = [_request HTTPBody];
NSAssert(data != nil, @"should have data if no length set");
NSUInteger length = [data length];
[_request setValue:[NSString stringWithFormat:@"%ld", length] forHTTPHeaderField:@"Content-Length"];
}

NSString* MIMEType = [DAVPutRequest MIMETypeForExtension:[path pathExtension]];
[_request setValue:MIMEType forHTTPHeaderField:@"Content-Type"];

[_request setHTTPMethod:@"PUT"];
[_request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[_request setURL:[self concatenatedURLWithPath:path]];

NSMutableIndexSet* indexes = [[NSMutableIndexSet alloc] init];
[indexes addIndex:201]; // The resource was created successfully
[indexes addIndex:202]; // The resource will be created or deleted, but this has not happened yet
[indexes addIndex:204]; // The server has fulfilled the request but does not need to return an entity body, and might return updated metadata.
self.expectedStatuses = indexes;
[indexes release];
}

return self;
}

@dynamic delegate;

@synthesize data = _pdata;
@synthesize dataMIMEType = _MIMEType;
@synthesize stream = _pstream;

- (NSURLRequest *)request {
NSParameterAssert((_pdata != nil) || (_pstream != nil));

NSMutableURLRequest *req = [self newRequestWithPath:self.path method:@"PUT"];
[req setValue:[self dataMIMEType] forHTTPHeaderField:@"Content-Type"];

if (_pdata)
{
NSString *len = [NSString stringWithFormat:@"%ld", (unsigned long)[_pdata length]];
[req setValue:len forHTTPHeaderField:@"Content-Length"];
[req setHTTPBody:_pdata];
}
else if (_pstream)
{
[req setHTTPBodyStream:_pstream];
}
return _request;
}

return [req autorelease];
- (NSUInteger)expectedLength
{
return [[_request valueForHTTPHeaderField:@"Content-Length"] integerValue];
}

- (void)dealloc
{
[_pdata release];
[_MIMEType release];
[_pstream release];
[_request release];

[super dealloc];
}
Expand Down

0 comments on commit 8d5dccd

Please sign in to comment.