| Index: net/base/mime_util.cc
|
| diff --git a/net/base/mime_util.cc b/net/base/mime_util.cc
|
| index 442910b94c7abd536d0f92ffc4c86c55990f1128..26a850c2b259cdf08b383e6c1c53d46755ba8692 100644
|
| --- a/net/base/mime_util.cc
|
| +++ b/net/base/mime_util.cc
|
| @@ -16,6 +16,7 @@
|
| #include "base/strings/utf_string_conversions.h"
|
| #include "net/base/mime_util.h"
|
| #include "net/base/platform_mime_util.h"
|
| +#include "net/http/http_util.h"
|
|
|
| #if defined(OS_ANDROID)
|
| #include "base/android/build_info.h"
|
| @@ -69,7 +70,11 @@ class MimeUtil : public PlatformMimeUtil {
|
| bool MatchesMimeType(const std::string &mime_type_pattern,
|
| const std::string &mime_type) const;
|
|
|
| - bool IsMimeType(const std::string& type_string) const;
|
| + bool ParseMimeTypeWithoutParameter(const std::string& type_string,
|
| + std::string* top_level_type,
|
| + std::string* subtype) const;
|
| +
|
| + bool IsValidTopLevelMimeType(const std::string& type_string) const;
|
|
|
| bool AreSupportedMediaCodecs(const std::vector<std::string>& codecs) const;
|
|
|
| @@ -660,47 +665,45 @@ bool MimeUtil::MatchesMimeType(const std::string& mime_type_pattern,
|
| return MatchesMimeTypeParameters(mime_type_pattern, mime_type);
|
| }
|
|
|
| -// See http://www.iana.org/assignments/media-types/index.html
|
| +// See http://www.iana.org/assignments/media-types/media-types.xhtml
|
| static const char* legal_top_level_types[] = {
|
| - "application/",
|
| - "audio/",
|
| - "example/",
|
| - "image/",
|
| - "message/",
|
| - "model/",
|
| - "multipart/",
|
| - "text/",
|
| - "video/",
|
| + "application",
|
| + "audio",
|
| + "example",
|
| + "image",
|
| + "message",
|
| + "model",
|
| + "multipart",
|
| + "text",
|
| + "video",
|
| };
|
|
|
| -bool MimeUtil::IsMimeType(const std::string& type_string) const {
|
| - // MIME types are always ASCII and case-insensitive (at least, the top-level
|
| - // and secondary types we care about).
|
| - if (!base::IsStringASCII(type_string))
|
| +bool MimeUtil::ParseMimeTypeWithoutParameter(
|
| + const std::string& type_string,
|
| + std::string* top_level_type,
|
| + std::string* subtype) const {
|
| + std::vector<std::string> components;
|
| + base::SplitString(type_string, '/', &components);
|
| + if (components.size() != 2 ||
|
| + !HttpUtil::IsToken(components[0]) ||
|
| + !HttpUtil::IsToken(components[1]))
|
| return false;
|
|
|
| - if (type_string == "*/*" || type_string == "*")
|
| - return true;
|
| + if (top_level_type)
|
| + *top_level_type = components[0];
|
| + if (subtype)
|
| + *subtype = components[1];
|
| + return true;
|
| +}
|
|
|
| +bool MimeUtil::IsValidTopLevelMimeType(const std::string& type_string) const {
|
| + std::string lower_type = StringToLowerASCII(type_string);
|
| for (size_t i = 0; i < arraysize(legal_top_level_types); ++i) {
|
| - if (StartsWithASCII(type_string, legal_top_level_types[i], false) &&
|
| - type_string.length() > strlen(legal_top_level_types[i])) {
|
| + if (lower_type.compare(legal_top_level_types[i]) == 0)
|
| return true;
|
| - }
|
| }
|
|
|
| - // If there's a "/" separator character, and the token before it is
|
| - // "x-" + (ascii characters), it is also a MIME type.
|
| - size_t slash = type_string.find('/');
|
| - if (slash < 3 ||
|
| - slash == std::string::npos || slash == type_string.length() - 1) {
|
| - return false;
|
| - }
|
| -
|
| - if (StartsWithASCII(type_string, "x-", false))
|
| - return true;
|
| -
|
| - return false;
|
| + return type_string.size() > 2 && StartsWithASCII(type_string, "x-", false);
|
| }
|
|
|
| bool MimeUtil::AreSupportedMediaCodecs(
|
| @@ -805,8 +808,15 @@ bool MatchesMimeType(const std::string& mime_type_pattern,
|
| return g_mime_util.Get().MatchesMimeType(mime_type_pattern, mime_type);
|
| }
|
|
|
| -bool IsMimeType(const std::string& type_string) {
|
| - return g_mime_util.Get().IsMimeType(type_string);
|
| +bool ParseMimeTypeWithoutParameter(const std::string& type_string,
|
| + std::string* top_level_type,
|
| + std::string* subtype) {
|
| + return g_mime_util.Get().ParseMimeTypeWithoutParameter(
|
| + type_string, top_level_type, subtype);
|
| +}
|
| +
|
| +bool IsValidTopLevelMimeType(const std::string& type_string) {
|
| + return g_mime_util.Get().IsValidTopLevelMimeType(type_string);
|
| }
|
|
|
| bool AreSupportedMediaCodecs(const std::vector<std::string>& codecs) {
|
|
|