Maarten Billemont
Committed by Ben Copsey

Proper encoding + charset.

@@ -26,6 +26,9 @@ typedef enum _ASIPostFormat { @@ -26,6 +26,9 @@ typedef enum _ASIPostFormat {
26 ASIPostFormat postFormat; 26 ASIPostFormat postFormat;
27 } 27 }
28 28
  29 +#pragma mark utilities
  30 ++ (NSString*) encodeURL:(CFStringRef) string;
  31 +
29 #pragma mark setup request 32 #pragma mark setup request
30 33
31 // Add a POST variable to the request 34 // Add a POST variable to the request
@@ -19,6 +19,17 @@ @@ -19,6 +19,17 @@
19 19
20 @implementation ASIFormDataRequest 20 @implementation ASIFormDataRequest
21 21
  22 +#pragma mark utilities
  23 ++ (NSString*) encodeURL:(CFStringRef)string
  24 +{
  25 + CFStringRef result = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
  26 + string,
  27 + NULL,
  28 + CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"),
  29 + kCFStringEncodingUTF8);
  30 + return [(NSString*) result autorelease];
  31 +}
  32 +
22 #pragma mark init / dealloc 33 #pragma mark init / dealloc
23 34
24 + (id)requestWithURL:(NSURL *)newURL 35 + (id)requestWithURL:(NSURL *)newURL
@@ -126,7 +137,7 @@ @@ -126,7 +137,7 @@
126 // Set your own boundary string only if really obsessive. We don't bother to check if post data contains the boundary, since it's pretty unlikely that it does. 137 // Set your own boundary string only if really obsessive. We don't bother to check if post data contains the boundary, since it's pretty unlikely that it does.
127 NSString *stringBoundary = @"0xKhTmLbOuNdArY"; 138 NSString *stringBoundary = @"0xKhTmLbOuNdArY";
128 139
129 - [self addRequestHeader:@"Content-Type" value:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary]]; 140 + [self addRequestHeader:@"Content-Type" value:[NSString stringWithFormat:@"multipart/form-data; charset=UTF-8; boundary=%@",stringBoundary]];
130 141
131 [self appendPostData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 142 [self appendPostData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
132 143
@@ -154,7 +165,7 @@ @@ -154,7 +165,7 @@
154 NSString *fileName = [fileInfo objectForKey:@"fileName"]; 165 NSString *fileName = [fileInfo objectForKey:@"fileName"];
155 166
156 [self appendPostData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", key, fileName] dataUsingEncoding:NSUTF8StringEncoding]]; 167 [self appendPostData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", key, fileName] dataUsingEncoding:NSUTF8StringEncoding]];
157 - [self appendPostData:[[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n", contentType] dataUsingEncoding:NSUTF8StringEncoding]]; 168 + [self appendPostData:[[NSString stringWithFormat:@"Content-Type: %@; charset=UTF-8\r\n\r\n", contentType] dataUsingEncoding:NSUTF8StringEncoding]];
158 169
159 if ([file isKindOfClass:[NSString class]]) { 170 if ([file isKindOfClass:[NSString class]]) {
160 [self appendPostDataFromFile:file]; 171 [self appendPostDataFromFile:file];
@@ -181,7 +192,7 @@ @@ -181,7 +192,7 @@
181 return; 192 return;
182 } 193 }
183 194
184 - [self addRequestHeader:@"Content-Type" value:@"application/x-www-form-urlencoded"]; 195 + [self addRequestHeader:@"Content-Type" value:@"application/x-www-form-urlencoded; charset=UTF-8"];
185 196
186 197
187 NSEnumerator *e = [[self postData] keyEnumerator]; 198 NSEnumerator *e = [[self postData] keyEnumerator];
@@ -189,7 +200,7 @@ @@ -189,7 +200,7 @@
189 int i=0; 200 int i=0;
190 int count = [[self postData] count]-1; 201 int count = [[self postData] count]-1;
191 while (key = [e nextObject]) { 202 while (key = [e nextObject]) {
192 - NSString *data = [NSString stringWithFormat:@"%@=%@%@",[key stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],[[[self postData] objectForKey:key] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],(i<count ? @"&" : @"")]; 203 + NSString *data = [NSString stringWithFormat:@"%@=%@%@", [ASIFormDataRequest encodeURL:(CFStringRef)key], [ASIFormDataRequest encodeURL:(CFStringRef)[[self postData] objectForKey:key]],(i<count ? @"&" : @"")];
193 [self appendPostData:[data dataUsingEncoding:NSUTF8StringEncoding]]; 204 [self appendPostData:[data dataUsingEncoding:NSUTF8StringEncoding]];
194 i++; 205 i++;
195 } 206 }