Significant refactoring and renaming of internal query string serialization functions. Query String parameter components are now pairs, comprised of a field and a corresponding value.

This commit is contained in:
Mattt Thompson 2012-08-29 10:49:55 -07:00
parent bb8aee4a4f
commit e1995eae55

View file

@ -92,106 +92,88 @@ static NSString * AFBase64EncodedStringFromString(NSString *string) {
return [[[NSString alloc] initWithData:mutableData encoding:NSASCIIStringEncoding] autorelease]; return [[[NSString alloc] initWithData:mutableData encoding:NSASCIIStringEncoding] autorelease];
} }
NSString * AFURLEncodedStringFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { NSString * AFPercentEscapedQueryStringPairMemberFromStringWithEncoding(NSString *string, NSStringEncoding encoding) {
// Escape characters that are legal in URIs, but have unintentional semantic significance when used in a query string parameter // Escape characters that are legal in URIs, but have unintentional semantic significance when used in a query string parameter
static NSString * const kAFLegalCharactersToBeEscaped = @":/.?&=;+!@$()~"; static NSString * const kAFLegalCharactersToBeEscaped = @":/.?&=;+!@$()~";
return [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, (CFStringRef)kAFLegalCharactersToBeEscaped, CFStringConvertNSStringEncodingToEncoding(encoding)) autorelease]; return [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)string, NULL, (CFStringRef)kAFLegalCharactersToBeEscaped, CFStringConvertNSStringEncodingToEncoding(encoding)) autorelease];
} }
#pragma mark - #pragma mark -
@interface AFQueryStringComponent : NSObject { @interface AFQueryStringPair : NSObject
@private @property (readwrite, nonatomic, retain) id field;
NSString *_key;
NSString *_value;
}
@property (readwrite, nonatomic, retain) id key;
@property (readwrite, nonatomic, retain) id value; @property (readwrite, nonatomic, retain) id value;
- (id)initWithKey:(id)key value:(id)value; - (id)initWithField:(id)field value:(id)value;
- (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding; - (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding;
@end @end
@implementation AFQueryStringComponent @implementation AFQueryStringPair
@synthesize key = _key; @synthesize field = _field;
@synthesize value = _value; @synthesize value = _value;
- (id)initWithKey:(id)key value:(id)value { - (id)initWithField:(id)field value:(id)value {
self = [super init]; self = [super init];
if (!self) { if (!self) {
return nil; return nil;
} }
self.key = key; self.field = field;
self.value = value; self.value = value;
return self; return self;
} }
- (void)dealloc { - (void)dealloc {
[_key release]; [_field release];
[_value release]; [_value release];
[super dealloc]; [super dealloc];
} }
- (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding { - (NSString *)URLEncodedStringValueWithEncoding:(NSStringEncoding)stringEncoding {
return [NSString stringWithFormat:@"%@=%@", self.key, AFURLEncodedStringFromStringWithEncoding([self.value description], stringEncoding)]; return [NSString stringWithFormat:@"%@=%@", AFPercentEscapedQueryStringPairMemberFromStringWithEncoding(self.field, stringEncoding), AFPercentEscapedQueryStringPairMemberFromStringWithEncoding([self.value description], stringEncoding)];
} }
@end @end
#pragma mark - #pragma mark -
extern NSArray * AFQueryStringComponentsFromKeyAndValue(NSString *key, id value); extern NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary);
extern NSArray * AFQueryStringComponentsFromKeyAndDictionaryValue(NSString *key, NSDictionary *value); extern NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value);
extern NSArray * AFQueryStringComponentsFromKeyAndArrayValue(NSString *key, NSArray *value);
NSString * AFQueryStringFromParametersWithEncoding(NSDictionary *parameters, NSStringEncoding stringEncoding) { NSString * AFQueryStringFromParametersWithEncoding(NSDictionary *parameters, NSStringEncoding stringEncoding) {
NSMutableArray *mutableComponents = [NSMutableArray array]; NSMutableArray *mutablePairs = [NSMutableArray array];
for (AFQueryStringComponent *component in AFQueryStringComponentsFromKeyAndValue(nil, parameters)) { for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) {
[mutableComponents addObject:[component URLEncodedStringValueWithEncoding:stringEncoding]]; [mutablePairs addObject:[pair URLEncodedStringValueWithEncoding:stringEncoding]];
} }
return [mutableComponents componentsJoinedByString:@"&"]; return [mutablePairs componentsJoinedByString:@"&"];
} }
NSArray * AFQueryStringComponentsFromKeyAndValue(NSString *key, id value) { NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary) {
return AFQueryStringPairsFromKeyAndValue(nil, dictionary);
}
NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) {
NSMutableArray *mutableQueryStringComponents = [NSMutableArray array]; NSMutableArray *mutableQueryStringComponents = [NSMutableArray array];
if([value isKindOfClass:[NSDictionary class]]) { if([value isKindOfClass:[NSDictionary class]]) {
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringComponentsFromKeyAndDictionaryValue(key, value)]; [value enumerateKeysAndObjectsUsingBlock:^(id nestedKey, id nestedValue, BOOL *stop) {
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)];
}];
} else if([value isKindOfClass:[NSArray class]]) { } else if([value isKindOfClass:[NSArray class]]) {
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringComponentsFromKeyAndArrayValue(key, value)]; [value enumerateObjectsUsingBlock:^(id nestedValue, NSUInteger idx, BOOL *stop) {
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];
}];
} else { } else {
[mutableQueryStringComponents addObject:[[[AFQueryStringComponent alloc] initWithKey:key value:value] autorelease]]; [mutableQueryStringComponents addObject:[[[AFQueryStringPair alloc] initWithField:key value:value] autorelease]];
} }
return mutableQueryStringComponents; return mutableQueryStringComponents;
} }
NSArray * AFQueryStringComponentsFromKeyAndDictionaryValue(NSString *key, NSDictionary *value){
NSMutableArray *mutableQueryStringComponents = [NSMutableArray array];
[value enumerateKeysAndObjectsUsingBlock:^(id nestedKey, id nestedValue, BOOL *stop) {
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringComponentsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)];
}];
return mutableQueryStringComponents;
}
NSArray * AFQueryStringComponentsFromKeyAndArrayValue(NSString *key, NSArray *value) {
NSMutableArray *mutableQueryStringComponents = [NSMutableArray array];
[value enumerateObjectsUsingBlock:^(id nestedValue, NSUInteger idx, BOOL *stop) {
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringComponentsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];
}];
return mutableQueryStringComponents;
}
static NSString * AFJSONStringFromParameters(NSDictionary *parameters) { static NSString * AFJSONStringFromParameters(NSDictionary *parameters) {
NSError *error = nil; NSError *error = nil;
NSData *JSONData = AFJSONEncode(parameters, &error); NSData *JSONData = AFJSONEncode(parameters, &error);
@ -497,16 +479,16 @@ static void AFNetworkReachabilityReleaseCallback(const void *info) {
__block AFMultipartFormData *formData = [[[AFMultipartFormData alloc] initWithURLRequest:request stringEncoding:self.stringEncoding] autorelease]; __block AFMultipartFormData *formData = [[[AFMultipartFormData alloc] initWithURLRequest:request stringEncoding:self.stringEncoding] autorelease];
if (parameters) { if (parameters) {
for (AFQueryStringComponent *component in AFQueryStringComponentsFromKeyAndValue(nil, parameters)) { for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) {
NSData *data = nil; NSData *data = nil;
if ([component.value isKindOfClass:[NSData class]]) { if ([pair.value isKindOfClass:[NSData class]]) {
data = component.value; data = pair.value;
} else { } else {
data = [[component.value description] dataUsingEncoding:self.stringEncoding]; data = [[pair.value description] dataUsingEncoding:self.stringEncoding];
} }
if (data) { if (data) {
[formData appendPartWithFormData:data name:[component.key description]]; [formData appendPartWithFormData:data name:[pair.field description]];
} }
} }
} }