summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/network/mac/WebCoreURLResponse.mm
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-05-06 11:45:16 +0100
committerSteve Block <steveblock@google.com>2011-05-12 13:44:10 +0100
commitcad810f21b803229eb11403f9209855525a25d57 (patch)
tree29a6fd0279be608e0fe9ffe9841f722f0f4e4269 /Source/WebCore/platform/network/mac/WebCoreURLResponse.mm
parent121b0cf4517156d0ac5111caf9830c51b69bae8f (diff)
downloadexternal_webkit-cad810f21b803229eb11403f9209855525a25d57.zip
external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.gz
external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.bz2
Merge WebKit at r75315: Initial merge by git.
Change-Id: I570314b346ce101c935ed22a626b48c2af266b84
Diffstat (limited to 'Source/WebCore/platform/network/mac/WebCoreURLResponse.mm')
-rw-r--r--Source/WebCore/platform/network/mac/WebCoreURLResponse.mm423
1 files changed, 423 insertions, 0 deletions
diff --git a/Source/WebCore/platform/network/mac/WebCoreURLResponse.mm b/Source/WebCore/platform/network/mac/WebCoreURLResponse.mm
new file mode 100644
index 0000000..e287e5f
--- /dev/null
+++ b/Source/WebCore/platform/network/mac/WebCoreURLResponse.mm
@@ -0,0 +1,423 @@
+/*
+ * Copyright (C) 2008, 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+#import "WebCoreURLResponse.h"
+
+#import "MIMETypeRegistry.h"
+#import <objc/objc-class.h>
+#import <wtf/Assertions.h>
+#import <wtf/RetainPtr.h>
+
+#ifndef BUILDING_ON_TIGER
+// <rdar://problem/5321972> Plain text document from HTTP server detected as application/octet-stream
+// When we sniff a resource as application/octet-stream but the http response headers had "text/plain",
+// we have a hard decision to make about which of the two generic MIME types to go with.
+// When the URL's extension is a known binary type, we'll go with application/octet-stream.
+// Otherwise, we'll trust the server.
+static NSSet *createBinaryExtensionsSet()
+{
+ return [[NSSet alloc] initWithObjects:
+ @"3g2",
+ @"3gp",
+ @"ai",
+ @"aif",
+ @"aifc",
+ @"aiff",
+ @"au",
+ @"avi",
+ @"bcpio",
+ @"bin",
+ @"bmp",
+ @"boz",
+ @"bpk",
+ @"bz",
+ @"bz2",
+ @"chm",
+ @"class",
+ @"com",
+ @"cpio",
+ @"dcr",
+ @"dir",
+ @"dist",
+ @"distz",
+ @"dll",
+ @"dmg",
+ @"dms",
+ @"doc",
+ @"dot",
+ @"dump",
+ @"dv",
+ @"dvi",
+ @"dxr",
+ @"elc",
+ @"eot",
+ @"eps",
+ @"exe",
+ @"fgd",
+ @"gif",
+ @"gtar",
+ @"h261",
+ @"h263",
+ @"h264",
+ @"ico",
+ @"ims",
+ @"indd",
+ @"iso",
+ @"jp2",
+ @"jpe",
+ @"jpeg",
+ @"jpg",
+ @"jpgm",
+ @"jpgv",
+ @"jpm",
+ @"kar",
+ @"kmz",
+ @"lha",
+ @"lrm",
+ @"lzh",
+ @"m1v",
+ @"m2a",
+ @"m2v",
+ @"m3a",
+ @"m3u",
+ @"m4a",
+ @"m4p",
+ @"m4v",
+ @"mdb",
+ @"mid",
+ @"midi",
+ @"mj2",
+ @"mjp2",
+ @"mov",
+ @"movie",
+ @"mp2",
+ @"mp2a",
+ @"mp3",
+ @"mp4",
+ @"mp4a",
+ @"mp4s",
+ @"mp4v",
+ @"mpe",
+ @"mpeg",
+ @"mpg",
+ @"mpg4",
+ @"mpga",
+ @"mpp",
+ @"mpt",
+ @"msi",
+ @"ogg",
+ @"otf",
+ @"pct",
+ @"pdf",
+ @"pfa",
+ @"pfb",
+ @"pic",
+ @"pict",
+ @"pkg",
+ @"png",
+ @"pot",
+ @"pps",
+ @"ppt",
+ @"ps",
+ @"psd",
+ @"qt",
+ @"qti",
+ @"qtif",
+ @"qwd",
+ @"qwt",
+ @"qxb",
+ @"qxd",
+ @"qxl",
+ @"qxp",
+ @"qxt",
+ @"ra",
+ @"ram",
+ @"rm",
+ @"rmi",
+ @"rmp",
+ @"scpt",
+ @"sit",
+ @"sitx",
+ @"snd",
+ @"so",
+ @"swf",
+ @"tar",
+ @"tif",
+ @"tiff",
+ @"ttf",
+ @"wav",
+ @"wcm",
+ @"wdb",
+ @"wks",
+ @"wm",
+ @"wma",
+ @"wmd",
+ @"wmf",
+ @"wmv",
+ @"wmx",
+ @"wmz",
+ @"wpd",
+ @"wpl",
+ @"wps",
+ @"wvx",
+ @"xla",
+ @"xlc",
+ @"xlm",
+ @"xls",
+ @"xlt",
+ @"xlw",
+ @"xps",
+ @"zip",
+ nil
+ ];
+}
+#endif
+
+// <rdar://problem/7007389> CoreTypes UTI map is missing 100+ file extensions that GateKeeper knew about
+// When we disabled content sniffing for file URLs we caused problems with these 100+ extensions that CoreTypes
+// doesn't know about.
+// If CoreTypes is ever brought up to speed we can remove this table and associated code.
+static NSDictionary *createExtensionToMIMETypeMap()
+{
+ return [[NSDictionary alloc] initWithObjectsAndKeys:
+ @"application/postscript", @"ai",
+ @"text/plain", @"asc",
+ @"application/x-bcpio", @"bcpio",
+ @"image/bmp", @"bmp",
+ @"application/x-netcdf", @"cdf",
+ @"application/octet-stream", @"class",
+ @"application/x-gzip", @"cpgz",
+ @"application/x-cpio", @"cpio",
+ @"application/mac-compactpro", @"cpt",
+ @"application/x-csh", @"csh",
+ @"text/css", @"css",
+ @"application/x-director", @"dcr",
+ @"application/x-director", @"dir",
+ @"application/x-diskcopy", @"dmg",
+ @"application/octet-stream", @"dms",
+ @"application/x-dvi", @"dvi",
+ @"application/x-director", @"dxr",
+ @"application/postscript", @"eps",
+ @"text/x-setext", @"etx",
+ @"application/andrew-inset", @"ez",
+ @"application/vnd.fdf", @"fdf",
+ @"application/octet-stream", @"fla",
+ @"application/x-filemaker", @"fp",
+ @"application/x-filemaker", @"fp2",
+ @"application/x-filemaker", @"fp3",
+ @"application/x-filemaker", @"fp4",
+ @"application/x-filemaker", @"fp5",
+ @"application/x-filemaker", @"fp6",
+ @"application/x-hdf", @"hdf",
+ @"x-conference/x-cooltalk", @"ice",
+ @"image/x-icon", @"ico",
+ @"text/calendar", @"ics",
+ @"image/ief", @"ief",
+ @"model/iges", @"iges",
+ @"model/iges", @"igs",
+ @"application/octet-stream", @"iso",
+ @"text/html", @"jhtml",
+ @"application/x-latex", @"latex",
+ @"application/octet-stream", @"lha",
+ @"application/octet-stream", @"lzh",
+ @"audio/x-mpegurl", @"m3u",
+ @"audio/x-m4p", @"m4p",
+ @"image/x-macpaint", @"mac",
+ @"application/x-troff-man", @"man",
+ @"application/x-troff-me", @"me",
+ @"model/mesh", @"mesh",
+ @"application/vnd.mif", @"mif",
+ @"video/x-sgi-movie", @"movie",
+ @"audio/mpeg", @"mp2",
+ @"audio/mpeg", @"mpga",
+ @"application/x-troff-ms", @"ms",
+ @"model/mesh", @"msh",
+ @"video/vnd.mpegurl", @"mxu",
+ @"application/x-netcdf", @"nc",
+ @"application/oda", @"oda",
+ @"image/x-portable-bitmap", @"pbm",
+ @"image/x-pcx", @"pcx",
+ @"chemical/x-pdb", @"pdb",
+ @"image/x-portable-graymap", @"pgm",
+ @"application/x-chess-pgn", @"pgn",
+ @"audio/scpls", @"pls",
+ @"image/x-portable-anymap", @"pnm",
+ @"image/x-macpaint", @"pnt",
+ @"image/x-macpaint", @"pntg",
+ @"image/x-portable-pixmap", @"ppm",
+ @"image/x-cmu-raster", @"ras",
+ @"image/x-rgb", @"rgb",
+ @"application/x-troff", @"roff",
+ @"audio/x-pn-realaudio-plugin", @"rpm",
+ @"text/richtext", @"rtx",
+ @"text/sgml", @"sgm",
+ @"text/sgml", @"sgml",
+ @"application/x-sh", @"sh",
+ @"application/x-shar", @"shar",
+ @"model/mesh", @"silo",
+ @"application/x-koan", @"skd",
+ @"application/x-koan", @"skm",
+ @"application/x-koan", @"skp",
+ @"application/x-koan", @"skt",
+ @"application/x-diskcopy", @"smi",
+ @"application/octet-stream", @"so",
+ @"application/x-futuresplash", @"spl",
+ @"application/x-wais-source", @"src",
+ @"application/x-sv4cpio", @"sv4cpio",
+ @"application/x-sv4crc", @"sv4crc",
+ @"application/x-shockwave-flash", @"swf",
+ @"application/x-troff", @"t",
+ @"image/x-targa", @"targa",
+ @"application/x-tcl", @"tcl",
+ @"application/x-tex", @"tex",
+ @"application/x-texinfo", @"texi",
+ @"application/x-texinfo", @"texinfo",
+ @"application/x-gzip", @"tgz",
+ @"application/x-bittorrent", @"torrent",
+ @"application/x-troff", @"tr",
+ @"text/tab-separated-values", @"tsv",
+ @"application/x-ustar", @"ustar",
+ @"application/x-cdlink", @"vcd",
+ @"model/vrml", @"vrml",
+ @"image/vnd.wap.wbmp", @"wbmp",
+ @"application/vnd.wap.wbxml", @"wbxml",
+ @"application/x-webarchive", @"webarchive",
+ @"application/x-ms-wmd", @"wmd",
+ @"text/vnd.wap.wml", @"wml",
+ @"application/vnd.wap.wmlc", @"wmlc",
+ @"text/vnd.wap.wmlscript", @"wmls",
+ @"application/vnd.wap.wmlscriptc", @"wmlsc",
+ @"model/vrml", @"wrl",
+ @"application/vnd.adobe.xdp+xml", @"xdp",
+ @"application/vnd.adobe.xfd+xml", @"xfd",
+ @"application/vnd.adobe.xfdf", @"xfdf",
+ @"image/x-xpixmap", @"xpm",
+ @"text/xml", @"xsl",
+ @"image/x-xwindowdump", @"xwd",
+ @"chemical/x-xyz", @"xyz",
+ @"application/x-compress", @"z",
+ nil
+ ];
+}
+
+static RetainPtr<NSString> mimeTypeFromUTITree(CFStringRef uti)
+{
+ // Check if this UTI has a MIME type.
+ RetainPtr<CFStringRef> mimeType(AdoptCF, UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType));
+ if (mimeType)
+ return (NSString *)mimeType.get();
+
+ // If not, walk the ancestory of this UTI via its "ConformsTo" tags and return the first MIME type we find.
+ RetainPtr<CFDictionaryRef> decl(AdoptCF, UTTypeCopyDeclaration(uti));
+ if (!decl)
+ return nil;
+ CFTypeRef value = CFDictionaryGetValue(decl.get(), kUTTypeConformsToKey);
+ if (!value)
+ return nil;
+ CFTypeID typeID = CFGetTypeID(value);
+
+ if (typeID == CFStringGetTypeID())
+ return mimeTypeFromUTITree((CFStringRef)value);
+
+ if (typeID == CFArrayGetTypeID()) {
+ CFArrayRef newTypes = (CFArrayRef)value;
+ CFIndex count = CFArrayGetCount(newTypes);
+ for (CFIndex i = 0; i < count; ++i) {
+ CFTypeRef object = CFArrayGetValueAtIndex(newTypes, i);
+ if (CFGetTypeID(object) != CFStringGetTypeID())
+ continue;
+
+ if (RetainPtr<NSString> mimeType = mimeTypeFromUTITree((CFStringRef)object))
+ return mimeType;
+ }
+ }
+
+ return nil;
+}
+
+@implementation NSURLResponse (WebCoreURLResponse)
+
+-(void)adjustMIMETypeIfNecessary
+{
+ RetainPtr<NSString> result = [self MIMEType];
+ RetainPtr<NSString> originalResult = result;
+
+#ifdef BUILDING_ON_TIGER
+ // When content sniffing is disabled, Tiger's CFNetwork automatically returns application/octet-stream for certain
+ // extensions even when scouring the UTI maps would end up with a better result, so we'll give a chance for that to happen.
+ if ([[self URL] isFileURL] && [result.get() caseInsensitiveCompare:@"application/octet-stream"] == NSOrderedSame)
+ result = nil;
+#endif
+
+ if (!result) {
+ NSURL *url = [self URL];
+ if ([url isFileURL]) {
+ if (NSString *extension = [[url path] pathExtension]) {
+ // <rdar://problem/7007389> CoreTypes UTI map is missing 100+ file extensions that GateKeeper knew about
+ // When this radar is resolved, we can remove this file:// url specific code.
+ static NSDictionary *extensionMap = createExtensionToMIMETypeMap();
+ result = [extensionMap objectForKey:[extension lowercaseString]];
+
+ if (!result) {
+ // If the Gatekeeper-based map doesn't have a MIME type, we'll try to figure out what it should be by
+ // looking up the file extension in the UTI maps.
+ RetainPtr<CFStringRef> uti(AdoptCF, UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (CFStringRef)extension, 0));
+ result = mimeTypeFromUTITree(uti.get());
+ }
+ }
+ }
+ }
+
+ if (!result) {
+ static NSString *defaultMIMETypeString = [(NSString *)WebCore::defaultMIMEType() retain];
+ result = defaultMIMETypeString;
+ }
+
+#ifndef BUILDING_ON_TIGER
+ // <rdar://problem/5321972> Plain text document from HTTP server detected as application/octet-stream
+ // Make the best guess when deciding between "generic binary" and "generic text" using a table of known binary MIME types.
+ if ([result.get() isEqualToString:@"application/octet-stream"] && [self respondsToSelector:@selector(allHeaderFields)] && [[[self performSelector:@selector(allHeaderFields)] objectForKey:@"Content-Type"] hasPrefix:@"text/plain"]) {
+ static NSSet *binaryExtensions = createBinaryExtensionsSet();
+ if (![binaryExtensions containsObject:[[[self suggestedFilename] pathExtension] lowercaseString]])
+ result = @"text/plain";
+ }
+
+#endif
+
+#ifdef BUILDING_ON_LEOPARD
+ // Workaround for <rdar://problem/5539824>
+ if ([result.get() isEqualToString:@"text/xml"])
+ result = @"application/xml";
+#endif
+
+ if (result != originalResult)
+ [self _setMIMEType:result.get()];
+}
+
+@end