Using composition of NSMutableData rather than subclassing

Renaming private form data proxy object to match @protocol name
This commit is contained in:
Mattt Thompson 2011-09-23 14:25:04 -05:00
parent b621ad0848
commit 0c0b1bd383

View File

@ -34,12 +34,14 @@ static NSString * AFMultipartFormFinalBoundary() {
return [NSString stringWithFormat:@"--%@--", kAFMultipartFormBoundary];
}
@interface AFMutableMultipartFormData : NSMutableData <AFMultipartFormDataProxy> {
@interface AFMultipartFormDataProxy : NSObject <AFMultipartFormDataProxy> {
@private
NSStringEncoding _stringEncoding;
NSRange _finalBoundaryRange;
NSMutableData *_mutableData;
}
@property (readonly) NSData *data;
- (id)initWithStringEncoding:(NSStringEncoding)encoding;
@end
@ -199,7 +201,7 @@ static NSString * AFURLEncodedStringFromStringWithEncoding(NSString *string, NSS
}
NSMutableURLRequest *request = [self requestWithMethod:method path:path parameters:nil];
__block AFMutableMultipartFormData *formData = [[AFMutableMultipartFormData alloc] initWithStringEncoding:self.stringEncoding];
__block AFMultipartFormDataProxy *formData = [[AFMultipartFormDataProxy alloc] initWithStringEncoding:self.stringEncoding];
id key = nil;
NSEnumerator *enumerator = [parameters keyEnumerator];
@ -213,7 +215,7 @@ static NSString * AFURLEncodedStringFromStringWithEncoding(NSString *string, NSS
data = [[value description] dataUsingEncoding:self.stringEncoding];
}
[formData appendPartWithHeaders:[NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"form-data; name=\"%@\"", [key description]] forKey:@"Content-Disposition"] body:value];
[formData appendPartWithHeaders:[NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"form-data; name=\"%@\"", [key description]] forKey:@"Content-Disposition"] body:data];
}
if (block) {
@ -221,7 +223,7 @@ static NSString * AFURLEncodedStringFromStringWithEncoding(NSString *string, NSS
}
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", kAFMultipartFormBoundary] forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:formData];
[request setHTTPBody:[formData data]];
[formData autorelease];
@ -272,16 +274,16 @@ static NSString * AFURLEncodedStringFromStringWithEncoding(NSString *string, NSS
#pragma mark -
// multipart/form-data; see http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.2
@interface AFMutableMultipartFormData ()
@interface AFMultipartFormDataProxy ()
@property (readwrite, nonatomic, assign) NSStringEncoding stringEncoding;
@property (readwrite, nonatomic, assign) NSRange finalBoundaryRange;
@property (readwrite, nonatomic, retain) NSMutableData *mutableData;
- (void)appendBlankLine;
@end
@implementation AFMutableMultipartFormData
@implementation AFMultipartFormDataProxy
@synthesize stringEncoding = _stringEncoding;
@synthesize finalBoundaryRange = _finalBoundaryRange;
@synthesize mutableData = _mutableData;
- (id)initWithStringEncoding:(NSStringEncoding)encoding {
self = [super init];
@ -290,20 +292,34 @@ static NSString * AFURLEncodedStringFromStringWithEncoding(NSString *string, NSS
}
self.stringEncoding = encoding;
self.finalBoundaryRange = NSMakeRange(0, 0);
self.mutableData = [NSMutableData dataWithLength:0];
return self;
}
- (void)dealloc {
[_mutableData release];
[super dealloc];
}
- (NSData *)data {
NSMutableData *finalizedData = [NSMutableData dataWithData:self.mutableData];
[finalizedData appendData:[AFMultipartFormFinalBoundary() dataUsingEncoding:self.stringEncoding]];
return finalizedData;
}
#pragma mark - AFMultipartFormDataProxy
- (void)appendPartWithHeaders:(NSDictionary *)headers body:(NSData *)body {
if ([self length] > 0) {
if ([self.mutableData length] > 0) {
[self appendString:AFMultipartFormEncapsulationBoundary()];
[self appendBlankLine];
}
for (NSString *field in [headers allKeys]) {
[self appendString:[NSString stringWithFormat:@"%@: %@", field, [headers valueForKey:field]]];
[self appendBlankLine];
}
[self appendBlankLine];
@ -336,12 +352,7 @@ static NSString * AFURLEncodedStringFromStringWithEncoding(NSString *string, NSS
}
- (void)appendData:(NSData *)data {
NSMutableData *mutableData = [NSMutableData dataWithData:data];
[self replaceBytesInRange:self.finalBoundaryRange withBytes:[mutableData bytes]];
NSData *finalBoundary = [AFMultipartFormFinalBoundary() dataUsingEncoding:self.stringEncoding];
self.finalBoundaryRange = NSMakeRange([self length], [finalBoundary length]);
[super appendData:finalBoundary];
[self.mutableData appendData:data];
}
- (void)appendString:(NSString *)string {
@ -349,7 +360,7 @@ static NSString * AFURLEncodedStringFromStringWithEncoding(NSString *string, NSS
}
- (void)appendBlankLine {
[self appendString:@""];
[self appendString:kAFMultipartFormLineDelimiter];
}
@end