[Issue #638] Following guidelines from RFC 2616 regarding the use of string encoding when none is specified in the response
Signed-off-by: Mattt Thompson <m@mattt.me>
This commit is contained in:
parent
eaac6a1759
commit
db8941f1ba
1 changed files with 28 additions and 1 deletions
|
|
@ -54,6 +54,13 @@ NSSet * AFContentTypesFromHTTPHeader(NSString *string) {
|
||||||
return [NSSet setWithSet:mutableContentTypes];
|
return [NSSet setWithSet:mutableContentTypes];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void AFGetMediaTypeAndSubtypeWithString(NSString *string, NSString **type, NSString **subtype) {
|
||||||
|
NSScanner *scanner = [NSScanner scannerWithString:string];
|
||||||
|
[scanner setCharactersToBeSkipped:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
||||||
|
[scanner scanUpToString:@"/" intoString:type];
|
||||||
|
[scanner scanUpToString:@";" intoString:subtype];
|
||||||
|
}
|
||||||
|
|
||||||
static NSString * AFStringFromIndexSet(NSIndexSet *indexSet) {
|
static NSString * AFStringFromIndexSet(NSIndexSet *indexSet) {
|
||||||
NSMutableString *string = [NSMutableString string];
|
NSMutableString *string = [NSMutableString string];
|
||||||
|
|
||||||
|
|
@ -96,12 +103,14 @@ static void AFSwizzleClassMethodWithClassAndSelectorUsingBlock(Class klass, SEL
|
||||||
@property (readwrite, nonatomic, strong) NSURLRequest *request;
|
@property (readwrite, nonatomic, strong) NSURLRequest *request;
|
||||||
@property (readwrite, nonatomic, strong) NSHTTPURLResponse *response;
|
@property (readwrite, nonatomic, strong) NSHTTPURLResponse *response;
|
||||||
@property (readwrite, nonatomic, strong) NSError *HTTPError;
|
@property (readwrite, nonatomic, strong) NSError *HTTPError;
|
||||||
|
@property (readwrite, nonatomic, copy) NSString *HTTPResponseString;
|
||||||
@property (assign) long long totalContentLength;
|
@property (assign) long long totalContentLength;
|
||||||
@property (assign) long long offsetContentLength;
|
@property (assign) long long offsetContentLength;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation AFHTTPRequestOperation
|
@implementation AFHTTPRequestOperation
|
||||||
@synthesize HTTPError = _HTTPError;
|
@synthesize HTTPError = _HTTPError;
|
||||||
|
@synthesize HTTPResponseString = _HTTPResponseString;
|
||||||
@synthesize successCallbackQueue = _successCallbackQueue;
|
@synthesize successCallbackQueue = _successCallbackQueue;
|
||||||
@synthesize failureCallbackQueue = _failureCallbackQueue;
|
@synthesize failureCallbackQueue = _failureCallbackQueue;
|
||||||
@synthesize totalContentLength = _totalContentLength;
|
@synthesize totalContentLength = _totalContentLength;
|
||||||
|
|
@ -155,6 +164,25 @@ static void AFSwizzleClassMethodWithClassAndSelectorUsingBlock(Class klass, SEL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSString *)responseString {
|
||||||
|
// When no explicit charset parameter is provided by the sender, media subtypes of the "text" type are defined to have a default charset value of "ISO-8859-1" when received via HTTP. Data in character sets other than "ISO-8859-1" or its subsets MUST be labeled with an appropriate charset value.
|
||||||
|
// See http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.4.1
|
||||||
|
if (!self.HTTPResponseString && self.response && !self.response.textEncodingName && self.responseData) {
|
||||||
|
NSString *type = nil;
|
||||||
|
AFGetMediaTypeAndSubtypeWithString([[self.response allHeaderFields] valueForKey:@"Content-Type"], &type, nil);
|
||||||
|
|
||||||
|
if ([type isEqualToString:@"text"]) {
|
||||||
|
self.HTTPResponseString = [[NSString alloc] initWithData:self.responseData encoding:NSISOLatin1StringEncoding];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self.HTTPResponseString) {
|
||||||
|
return self.HTTPResponseString;
|
||||||
|
} else {
|
||||||
|
return [super responseString];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void)pause {
|
- (void)pause {
|
||||||
unsigned long long offset = 0;
|
unsigned long long offset = 0;
|
||||||
if ([self.outputStream propertyForKey:NSStreamFileCurrentOffsetKey]) {
|
if ([self.outputStream propertyForKey:NSStreamFileCurrentOffsetKey]) {
|
||||||
|
|
@ -187,7 +215,6 @@ static void AFSwizzleClassMethodWithClassAndSelectorUsingBlock(Class klass, SEL
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
// According to RFC 2616:
|
|
||||||
// Any HTTP/1.1 message containing an entity-body SHOULD include a Content-Type header field defining the media type of that body. If and only if the media type is not given by a Content-Type field, the recipient MAY attempt to guess the media type via inspection of its content and/or the name extension(s) of the URI used to identify the resource. If the media type remains unknown, the recipient SHOULD treat it as type "application/octet-stream".
|
// Any HTTP/1.1 message containing an entity-body SHOULD include a Content-Type header field defining the media type of that body. If and only if the media type is not given by a Content-Type field, the recipient MAY attempt to guess the media type via inspection of its content and/or the name extension(s) of the URI used to identify the resource. If the media type remains unknown, the recipient SHOULD treat it as type "application/octet-stream".
|
||||||
// See http://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html
|
// See http://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html
|
||||||
NSString *contentType = [self.response MIMEType];
|
NSString *contentType = [self.response MIMEType];
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue