Index: net/base/mime_sniffer.cc |
=================================================================== |
--- net/base/mime_sniffer.cc (revision 70720) |
+++ net/base/mime_sniffer.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
@@ -146,6 +146,8 @@ |
MAGIC_NUMBER("image/tiff", "II*") |
MAGIC_NUMBER("image/tiff", "MM\x00*") |
MAGIC_NUMBER("audio/mpeg", "ID3") |
+ MAGIC_NUMBER("image/webp", "RIFF....WEBPVP8 ") |
+ MAGIC_NUMBER("video/webm", "\x1A\x45\xDF\xA3") |
// TODO(abarth): we don't handle partial byte matches yet |
// MAGIC_NUMBER("video/mpeg", "\x00\x00\x01\xB") |
// MAGIC_NUMBER("audio/mpeg", "\xFF\xE") |
@@ -215,6 +217,19 @@ |
return counter; |
} |
+// Compare content header to a magic number where magic_entry can contain '.' |
+// for single character of anything, allowing some bytes to be skipped. |
+static bool MagicCmp(const char* magic_entry, const char* content, size_t len) { |
+ while (len) { |
+ if ((*magic_entry != '.') && (*magic_entry != *content)) |
+ return false; |
+ ++magic_entry; |
+ ++content; |
+ --len; |
+ } |
+ return true; |
+} |
+ |
static bool MatchMagicNumber(const char* content, size_t size, |
const MagicNumber* magic_entry, |
std::string* result) { |
@@ -239,7 +254,7 @@ |
} |
} else { |
if (size >= len) |
- match = (memcmp(magic_entry->magic, content, len) == 0); |
+ match = MagicCmp(magic_entry->magic, content, len); |
} |
if (match) { |
@@ -251,7 +266,8 @@ |
static bool CheckForMagicNumbers(const char* content, size_t size, |
const MagicNumber* magic, size_t magic_len, |
- base::Histogram* counter, std::string* result) { |
+ base::Histogram* counter, |
+ std::string* result) { |
for (size_t i = 0; i < magic_len; ++i) { |
if (MatchMagicNumber(content, size, &(magic[i]), result)) { |
if (counter) counter->Add(static_cast<int>(i)); |