mirror of
https://github.com/samsonjs/Marshmallows.git
synced 2026-04-27 15:07:42 +00:00
fix encoding of POST bodies in MMHTTPClient
This commit is contained in:
parent
675d3cd9e1
commit
0fe10f0abb
1 changed files with 37 additions and 3 deletions
|
|
@ -10,13 +10,23 @@
|
||||||
#import "NSString+marshmallows.h"
|
#import "NSString+marshmallows.h"
|
||||||
|
|
||||||
MMHTTPClient *_client;
|
MMHTTPClient *_client;
|
||||||
|
// Encode a string to embed in an URL.
|
||||||
|
NSString* MMHTTPURLEncode(NSString *string) {
|
||||||
|
return (__bridge NSString *)
|
||||||
|
CFURLCreateStringByAddingPercentEscapes(NULL,
|
||||||
|
(__bridge CFStringRef) string,
|
||||||
|
NULL,
|
||||||
|
(CFStringRef) @"!*'();:@&=+$,/?%#[]",
|
||||||
|
kCFStringEncodingUTF8);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NSString *JoinURLComponents(NSString *first, va_list args)
|
NSString *JoinURLComponents(NSString *first, va_list args)
|
||||||
{
|
{
|
||||||
NSMutableString *url = [NSMutableString string];
|
NSMutableString *url = [NSMutableString string];
|
||||||
NSString *slash = @"";
|
NSString *slash = @"";
|
||||||
for (NSString *arg = first; arg != nil; arg = va_arg(args, NSString *)) {
|
for (NSString *arg = first; arg != nil; arg = va_arg(args, NSString *)) {
|
||||||
[url appendFormat: @"%@%@", slash, [arg stringByURLEncoding]];
|
[url appendFormat: @"%@%@", slash, MMHTTPURLEncode(arg)];
|
||||||
slash = @"/";
|
slash = @"/";
|
||||||
}
|
}
|
||||||
return [NSString stringWithString: url];
|
return [NSString stringWithString: url];
|
||||||
|
|
@ -194,14 +204,38 @@ NSString *JoinURLComponents(NSString *first, va_list args)
|
||||||
}
|
}
|
||||||
|
|
||||||
- (MMHTTPRequest *) post: (NSString *)url fields: (NSDictionary *)fields then: (MMHTTPCallback)callback
|
- (MMHTTPRequest *) post: (NSString *)url fields: (NSDictionary *)fields then: (MMHTTPCallback)callback
|
||||||
|
- (NSString *) encodeFields: (NSDictionary *)fields withPrefix: (NSString *)prefix
|
||||||
{
|
{
|
||||||
|
NSString *suffix = @"";
|
||||||
|
if (prefix) {
|
||||||
|
prefix = [NSString stringWithFormat: @"%@[", prefix];
|
||||||
|
suffix = @"]";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
prefix = @"";
|
||||||
|
}
|
||||||
NSMutableArray *parts = [NSMutableArray array];
|
NSMutableArray *parts = [NSMutableArray array];
|
||||||
NSString *value;
|
NSString *value;
|
||||||
for (NSString *key in [fields keyEnumerator]) {
|
for (NSString *key in [fields keyEnumerator]) {
|
||||||
value = [fields objectForKey: key];
|
value = [fields objectForKey: key];
|
||||||
[parts addObject: [NSString stringWithFormat: @"%@=%@", [key stringByURLEncoding], [value stringByURLEncoding]]];
|
if ([value isKindOfClass: [NSDictionary class]]) {
|
||||||
|
[parts addObject: [self encodeFields: (NSDictionary *)value withPrefix: [NSString stringWithFormat: @"%@%@", prefix, key]]];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
[parts addObject: [NSString stringWithFormat: @"%@%@%@=%@", prefix, MMHTTPURLEncode(key), suffix, MMHTTPURLEncode(value)]];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
NSString *body = [parts componentsJoinedByString: @"&"];
|
return [parts componentsJoinedByString: @"&"];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString *) encodeFields: (NSDictionary *)fields
|
||||||
|
{
|
||||||
|
return [self encodeFields: fields withPrefix: nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (MMHTTPRequest *) post: (NSString *)url fields: (NSDictionary *)fields then: (MMHTTPCallback)callback
|
||||||
|
{
|
||||||
|
NSString *body = [self encodeFields: fields];
|
||||||
return [self post: url data: [body dataUsingEncoding: NSUTF8StringEncoding] then: callback];
|
return [self post: url data: [body dataUsingEncoding: NSUTF8StringEncoding] then: callback];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue