Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(773)

Side by Side Diff: net/base/mime_sniffer.cc

Issue 885443002: Roll Chrome into Mojo. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Rebase to ToT mojo Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/base/bandwidth_metrics.h ('k') | net/base/mime_util.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Detecting mime types is a tricky business because we need to balance 5 // Detecting mime types is a tricky business because we need to balance
6 // compatibility concerns with security issues. Here is a survey of how other 6 // compatibility concerns with security issues. Here is a survey of how other
7 // browsers behave and then a description of how we intend to behave. 7 // browsers behave and then a description of how we intend to behave.
8 // 8 //
9 // HTML payload, no Content-Type header: 9 // HTML payload, no Content-Type header:
10 // * IE 7: Render as HTML 10 // * IE 7: Render as HTML
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 #include "net/base/mime_util.h" 103 #include "net/base/mime_util.h"
104 #include "url/gurl.h" 104 #include "url/gurl.h"
105 105
106 namespace net { 106 namespace net {
107 107
108 // The number of content bytes we need to use all our magic numbers. Feel free 108 // The number of content bytes we need to use all our magic numbers. Feel free
109 // to increase this number if you add a longer magic number. 109 // to increase this number if you add a longer magic number.
110 static const size_t kBytesRequiredForMagic = 42; 110 static const size_t kBytesRequiredForMagic = 42;
111 111
112 struct MagicNumber { 112 struct MagicNumber {
113 const char* mime_type; 113 const char* const mime_type;
114 const char* magic; 114 const char* const magic;
115 size_t magic_len; 115 size_t magic_len;
116 bool is_string; 116 bool is_string;
117 const char* mask; // if set, must have same length as |magic| 117 const char* const mask; // if set, must have same length as |magic|
118 }; 118 };
119 119
120 #define MAGIC_NUMBER(mime_type, magic) \ 120 #define MAGIC_NUMBER(mime_type, magic) \
121 { (mime_type), (magic), sizeof(magic)-1, false, NULL }, 121 { (mime_type), (magic), sizeof(magic)-1, false, NULL },
122 122
123 template <int MagicSize, int MaskSize> 123 template <int MagicSize, int MaskSize>
124 class VerifySizes { 124 class VerifySizes {
125 static_assert(MagicSize == MaskSize, "sizes must be equal"); 125 static_assert(MagicSize == MaskSize, "sizes must be equal");
126 126
127 public: 127 public:
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 202
203 enum OfficeDocType { 203 enum OfficeDocType {
204 DOC_TYPE_WORD, 204 DOC_TYPE_WORD,
205 DOC_TYPE_EXCEL, 205 DOC_TYPE_EXCEL,
206 DOC_TYPE_POWERPOINT, 206 DOC_TYPE_POWERPOINT,
207 DOC_TYPE_NONE 207 DOC_TYPE_NONE
208 }; 208 };
209 209
210 struct OfficeExtensionType { 210 struct OfficeExtensionType {
211 OfficeDocType doc_type; 211 OfficeDocType doc_type;
212 const char* extension; 212 const char* const extension;
213 size_t extension_len; 213 size_t extension_len;
214 }; 214 };
215 215
216 #define OFFICE_EXTENSION(type, extension) \ 216 #define OFFICE_EXTENSION(type, extension) \
217 { (type), (extension), sizeof(extension) - 1 }, 217 { (type), (extension), sizeof(extension) - 1 },
218 218
219 static const OfficeExtensionType kOfficeExtensionTypes[] = { 219 static const OfficeExtensionType kOfficeExtensionTypes[] = {
220 OFFICE_EXTENSION(DOC_TYPE_WORD, ".doc") 220 OFFICE_EXTENSION(DOC_TYPE_WORD, ".doc")
221 OFFICE_EXTENSION(DOC_TYPE_EXCEL, ".xls") 221 OFFICE_EXTENSION(DOC_TYPE_EXCEL, ".xls")
222 OFFICE_EXTENSION(DOC_TYPE_POWERPOINT, ".ppt") 222 OFFICE_EXTENSION(DOC_TYPE_POWERPOINT, ".ppt")
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 // have_enough_content because there could be a binary looking byte in the 717 // have_enough_content because there could be a binary looking byte in the
718 // truncated data. 718 // truncated data.
719 *have_enough_content &= is_truncated; 719 *have_enough_content &= is_truncated;
720 result->assign("text/plain"); 720 result->assign("text/plain");
721 return false; 721 return false;
722 } 722 }
723 723
724 static bool IsUnknownMimeType(const std::string& mime_type) { 724 static bool IsUnknownMimeType(const std::string& mime_type) {
725 // TODO(tc): Maybe reuse some code in net/http/http_response_headers.* here. 725 // TODO(tc): Maybe reuse some code in net/http/http_response_headers.* here.
726 // If we do, please be careful not to alter the semantics at all. 726 // If we do, please be careful not to alter the semantics at all.
727 static const char* kUnknownMimeTypes[] = { 727 static const char* const kUnknownMimeTypes[] = {
728 // Empty mime types are as unknown as they get. 728 // Empty mime types are as unknown as they get.
729 "", 729 "",
730 // The unknown/unknown type is popular and uninformative 730 // The unknown/unknown type is popular and uninformative
731 "unknown/unknown", 731 "unknown/unknown",
732 // The second most popular unknown mime type is application/unknown 732 // The second most popular unknown mime type is application/unknown
733 "application/unknown", 733 "application/unknown",
734 // Firefox rejects a mime type if it is exactly */* 734 // Firefox rejects a mime type if it is exactly */*
735 "*/*", 735 "*/*",
736 }; 736 };
737 static base::HistogramBase* counter(NULL); 737 static base::HistogramBase* counter(NULL);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
812 #if defined(OS_ANDROID) 812 #if defined(OS_ANDROID)
813 url.SchemeIs("content") || 813 url.SchemeIs("content") ||
814 #endif 814 #endif
815 url.SchemeIsFile() || 815 url.SchemeIsFile() ||
816 url.SchemeIsFileSystem(); 816 url.SchemeIsFileSystem();
817 if (!sniffable_scheme) { 817 if (!sniffable_scheme) {
818 should_sniff_counter->Add(1); 818 should_sniff_counter->Add(1);
819 return false; 819 return false;
820 } 820 }
821 821
822 static const char* kSniffableTypes[] = { 822 static const char* const kSniffableTypes[] = {
823 // Many web servers are misconfigured to send text/plain for many 823 // Many web servers are misconfigured to send text/plain for many
824 // different types of content. 824 // different types of content.
825 "text/plain", 825 "text/plain",
826 // We want to sniff application/octet-stream for 826 // We want to sniff application/octet-stream for
827 // application/x-chrome-extension, but nothing else. 827 // application/x-chrome-extension, but nothing else.
828 "application/octet-stream", 828 "application/octet-stream",
829 // XHTML and Atom/RSS feeds are often served as plain xml instead of 829 // XHTML and Atom/RSS feeds are often served as plain xml instead of
830 // their more specific mime types. 830 // their more specific mime types.
831 "text/xml", 831 "text/xml",
832 "application/xml", 832 "application/xml",
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
964 // First check the extra table. 964 // First check the extra table.
965 if (CheckForMagicNumbers(content, size, kExtraMagicNumbers, 965 if (CheckForMagicNumbers(content, size, kExtraMagicNumbers,
966 arraysize(kExtraMagicNumbers), NULL, result)) 966 arraysize(kExtraMagicNumbers), NULL, result))
967 return true; 967 return true;
968 // Finally check the original table. 968 // Finally check the original table.
969 return CheckForMagicNumbers(content, size, kMagicNumbers, 969 return CheckForMagicNumbers(content, size, kMagicNumbers,
970 arraysize(kMagicNumbers), NULL, result); 970 arraysize(kMagicNumbers), NULL, result);
971 } 971 }
972 972
973 } // namespace net 973 } // namespace net
OLDNEW
« no previous file with comments | « net/base/bandwidth_metrics.h ('k') | net/base/mime_util.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698