Properly handle casing of header values

This commit is contained in:
Pierre-Olivier Latour
2014-04-09 10:34:33 -07:00
parent f14dda522c
commit 811e45ab26
8 changed files with 57 additions and 39 deletions
+13 -16
View File
@@ -55,13 +55,7 @@ static NSData* _dashNewlineData = nil;
- (id)initWithContentType:(NSString*)contentType {
if ((self = [super init])) {
_contentType = [contentType copy];
NSArray* components = [_contentType componentsSeparatedByString:@";"];
if (components.count) {
_mimeType = ARC_RETAIN([[components objectAtIndex:0] lowercaseString]);
}
if (_mimeType == nil) {
_mimeType = @"text/plain";
}
_mimeType = ARC_RETAIN(GCDWebServerTruncateHeaderValue(_contentType));
}
return self;
}
@@ -90,8 +84,8 @@ static NSData* _dashNewlineData = nil;
if ((self = [super initWithContentType:contentType])) {
_data = ARC_RETAIN(data);
if ([self.mimeType hasPrefix:@"text/"]) {
NSString* charset = GCDWebServerExtractHeaderParameter(self.contentType, @"charset");
if ([self.contentType hasPrefix:@"text/"]) {
NSString* charset = GCDWebServerExtractHeaderValueParameter(self.contentType, @"charset");
_string = [[NSString alloc] initWithData:_data encoding:GCDWebServerStringEncodingFromCharset(charset)];
}
}
@@ -187,7 +181,7 @@ static NSData* _dashNewlineData = nil;
- (instancetype)initWithMethod:(NSString*)method url:(NSURL*)url headers:(NSDictionary*)headers path:(NSString*)path query:(NSDictionary*)query {
if ((self = [super initWithMethod:method url:url headers:headers path:path query:query])) {
NSString* boundary = GCDWebServerExtractHeaderParameter(self.contentType, @"boundary");
NSString* boundary = GCDWebServerExtractHeaderValueParameter(self.contentType, @"boundary");
if (boundary) {
NSData* data = [[NSString stringWithFormat:@"--%@", boundary] dataUsingEncoding:NSASCIIStringEncoding];
_boundary = ARC_RETAIN(data);
@@ -210,7 +204,7 @@ static NSData* _dashNewlineData = nil;
return YES;
}
// http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4
// http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2
- (BOOL)_parseData {
BOOL success = YES;
@@ -234,14 +228,17 @@ static NSData* _dashNewlineData = nil;
NSString* controlName = nil;
NSString* fileName = nil;
NSDictionary* headers = ARC_BRIDGE_RELEASE(CFHTTPMessageCopyAllHeaderFields(message));
NSString* contentDisposition = [headers objectForKey:@"Content-Disposition"];
if ([[contentDisposition lowercaseString] hasPrefix:@"form-data;"]) {
controlName = GCDWebServerExtractHeaderParameter(contentDisposition, @"name");
fileName = GCDWebServerExtractHeaderParameter(contentDisposition, @"filename");
NSString* contentDisposition = GCDWebServerNormalizeHeaderValue([headers objectForKey:@"Content-Disposition"]);
if ([GCDWebServerTruncateHeaderValue(contentDisposition) isEqualToString:@"form-data"]) {
controlName = GCDWebServerExtractHeaderValueParameter(contentDisposition, @"name");
fileName = GCDWebServerExtractHeaderValueParameter(contentDisposition, @"filename");
}
_controlName = [controlName copy];
_fileName = [fileName copy];
_contentType = ARC_RETAIN([headers objectForKey:@"Content-Type"]);
_contentType = ARC_RETAIN(GCDWebServerNormalizeHeaderValue([headers objectForKey:@"Content-Type"]));
if (_contentType == nil) {
_contentType = @"text/plain";
}
}
CFRelease(message);
if (_controlName) {