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

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

Issue 54233002: Make net::DataURL's MIME string check stricter (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Split web_url_loader_impl change Created 6 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « net/base/mime_util.h ('k') | net/base/mime_util_unittest.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 #include <algorithm> 5 #include <algorithm>
6 #include <iterator> 6 #include <iterator>
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "base/containers/hash_tables.h" 10 #include "base/containers/hash_tables.h"
11 #include "base/lazy_instance.h" 11 #include "base/lazy_instance.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/stl_util.h" 13 #include "base/stl_util.h"
14 #include "base/strings/string_split.h" 14 #include "base/strings/string_split.h"
15 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
16 #include "base/strings/utf_string_conversions.h" 16 #include "base/strings/utf_string_conversions.h"
17 #include "net/base/mime_util.h" 17 #include "net/base/mime_util.h"
18 #include "net/base/platform_mime_util.h" 18 #include "net/base/platform_mime_util.h"
19 #include "net/http/http_util.h"
19 20
20 #if defined(OS_ANDROID) 21 #if defined(OS_ANDROID)
21 #include "base/android/build_info.h" 22 #include "base/android/build_info.h"
22 #endif 23 #endif
23 24
24 using std::string; 25 using std::string;
25 26
26 namespace { 27 namespace {
27 28
28 struct MediaType { 29 struct MediaType {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 bool IsSupportedMediaMimeType(const std::string& mime_type) const; 63 bool IsSupportedMediaMimeType(const std::string& mime_type) const;
63 bool IsSupportedNonImageMimeType(const std::string& mime_type) const; 64 bool IsSupportedNonImageMimeType(const std::string& mime_type) const;
64 bool IsUnsupportedTextMimeType(const std::string& mime_type) const; 65 bool IsUnsupportedTextMimeType(const std::string& mime_type) const;
65 bool IsSupportedJavascriptMimeType(const std::string& mime_type) const; 66 bool IsSupportedJavascriptMimeType(const std::string& mime_type) const;
66 67
67 bool IsSupportedMimeType(const std::string& mime_type) const; 68 bool IsSupportedMimeType(const std::string& mime_type) const;
68 69
69 bool MatchesMimeType(const std::string &mime_type_pattern, 70 bool MatchesMimeType(const std::string &mime_type_pattern,
70 const std::string &mime_type) const; 71 const std::string &mime_type) const;
71 72
72 bool IsMimeType(const std::string& type_string) const; 73 bool ParseMimeTypeWithoutParameter(const std::string& type_string,
74 std::string* top_level_type,
75 std::string* subtype) const;
76
77 bool IsValidTopLevelMimeType(const std::string& type_string) const;
73 78
74 bool AreSupportedMediaCodecs(const std::vector<std::string>& codecs) const; 79 bool AreSupportedMediaCodecs(const std::vector<std::string>& codecs) const;
75 80
76 void ParseCodecString(const std::string& codecs, 81 void ParseCodecString(const std::string& codecs,
77 std::vector<std::string>* codecs_out, 82 std::vector<std::string>* codecs_out,
78 bool strip); 83 bool strip);
79 84
80 bool IsStrictMediaMimeType(const std::string& mime_type) const; 85 bool IsStrictMediaMimeType(const std::string& mime_type) const;
81 bool IsSupportedStrictMediaMimeType( 86 bool IsSupportedStrictMediaMimeType(
82 const std::string& mime_type, 87 const std::string& mime_type,
(...skipping 570 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 if (base_type.find(left) != 0) 658 if (base_type.find(left) != 0)
654 return false; 659 return false;
655 660
656 if (!right.empty() && 661 if (!right.empty() &&
657 base_type.rfind(right) != base_type.length() - right.length()) 662 base_type.rfind(right) != base_type.length() - right.length())
658 return false; 663 return false;
659 664
660 return MatchesMimeTypeParameters(mime_type_pattern, mime_type); 665 return MatchesMimeTypeParameters(mime_type_pattern, mime_type);
661 } 666 }
662 667
663 // See http://www.iana.org/assignments/media-types/index.html 668 // See http://www.iana.org/assignments/media-types/media-types.xhtml
664 static const char* legal_top_level_types[] = { 669 static const char* legal_top_level_types[] = {
665 "application/", 670 "application",
666 "audio/", 671 "audio",
667 "example/", 672 "example",
668 "image/", 673 "image",
669 "message/", 674 "message",
670 "model/", 675 "model",
671 "multipart/", 676 "multipart",
672 "text/", 677 "text",
673 "video/", 678 "video",
674 }; 679 };
675 680
676 bool MimeUtil::IsMimeType(const std::string& type_string) const { 681 bool MimeUtil::ParseMimeTypeWithoutParameter(
677 // MIME types are always ASCII and case-insensitive (at least, the top-level 682 const std::string& type_string,
678 // and secondary types we care about). 683 std::string* top_level_type,
679 if (!base::IsStringASCII(type_string)) 684 std::string* subtype) const {
685 std::vector<std::string> components;
686 base::SplitString(type_string, '/', &components);
687 if (components.size() != 2 ||
688 !HttpUtil::IsToken(components[0]) ||
689 !HttpUtil::IsToken(components[1]))
680 return false; 690 return false;
681 691
682 if (type_string == "*/*" || type_string == "*") 692 if (top_level_type)
683 return true; 693 *top_level_type = components[0];
694 if (subtype)
695 *subtype = components[1];
696 return true;
697 }
684 698
699 bool MimeUtil::IsValidTopLevelMimeType(const std::string& type_string) const {
700 std::string lower_type = StringToLowerASCII(type_string);
685 for (size_t i = 0; i < arraysize(legal_top_level_types); ++i) { 701 for (size_t i = 0; i < arraysize(legal_top_level_types); ++i) {
686 if (StartsWithASCII(type_string, legal_top_level_types[i], false) && 702 if (lower_type.compare(legal_top_level_types[i]) == 0)
687 type_string.length() > strlen(legal_top_level_types[i])) {
688 return true; 703 return true;
689 }
690 } 704 }
691 705
692 // If there's a "/" separator character, and the token before it is 706 return type_string.size() > 2 && StartsWithASCII(type_string, "x-", false);
693 // "x-" + (ascii characters), it is also a MIME type.
694 size_t slash = type_string.find('/');
695 if (slash < 3 ||
696 slash == std::string::npos || slash == type_string.length() - 1) {
697 return false;
698 }
699
700 if (StartsWithASCII(type_string, "x-", false))
701 return true;
702
703 return false;
704 } 707 }
705 708
706 bool MimeUtil::AreSupportedMediaCodecs( 709 bool MimeUtil::AreSupportedMediaCodecs(
707 const std::vector<std::string>& codecs) const { 710 const std::vector<std::string>& codecs) const {
708 return AreSupportedCodecs(codecs_map_, codecs); 711 return AreSupportedCodecs(codecs_map_, codecs);
709 } 712 }
710 713
711 void MimeUtil::ParseCodecString(const std::string& codecs, 714 void MimeUtil::ParseCodecString(const std::string& codecs,
712 std::vector<std::string>* codecs_out, 715 std::vector<std::string>* codecs_out,
713 bool strip) { 716 bool strip) {
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 801
799 bool IsSupportedMimeType(const std::string& mime_type) { 802 bool IsSupportedMimeType(const std::string& mime_type) {
800 return g_mime_util.Get().IsSupportedMimeType(mime_type); 803 return g_mime_util.Get().IsSupportedMimeType(mime_type);
801 } 804 }
802 805
803 bool MatchesMimeType(const std::string& mime_type_pattern, 806 bool MatchesMimeType(const std::string& mime_type_pattern,
804 const std::string& mime_type) { 807 const std::string& mime_type) {
805 return g_mime_util.Get().MatchesMimeType(mime_type_pattern, mime_type); 808 return g_mime_util.Get().MatchesMimeType(mime_type_pattern, mime_type);
806 } 809 }
807 810
808 bool IsMimeType(const std::string& type_string) { 811 bool ParseMimeTypeWithoutParameter(const std::string& type_string,
809 return g_mime_util.Get().IsMimeType(type_string); 812 std::string* top_level_type,
813 std::string* subtype) {
814 return g_mime_util.Get().ParseMimeTypeWithoutParameter(
815 type_string, top_level_type, subtype);
816 }
817
818 bool IsValidTopLevelMimeType(const std::string& type_string) {
819 return g_mime_util.Get().IsValidTopLevelMimeType(type_string);
810 } 820 }
811 821
812 bool AreSupportedMediaCodecs(const std::vector<std::string>& codecs) { 822 bool AreSupportedMediaCodecs(const std::vector<std::string>& codecs) {
813 return g_mime_util.Get().AreSupportedMediaCodecs(codecs); 823 return g_mime_util.Get().AreSupportedMediaCodecs(codecs);
814 } 824 }
815 825
816 bool IsStrictMediaMimeType(const std::string& mime_type) { 826 bool IsStrictMediaMimeType(const std::string& mime_type) {
817 return g_mime_util.Get().IsStrictMediaMimeType(mime_type); 827 return g_mime_util.Get().IsStrictMediaMimeType(mime_type);
818 } 828 }
819 829
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
1060 post_data->append("\r\n" + value + "\r\n"); 1070 post_data->append("\r\n" + value + "\r\n");
1061 } 1071 }
1062 1072
1063 void AddMultipartFinalDelimiterForUpload(const std::string& mime_boundary, 1073 void AddMultipartFinalDelimiterForUpload(const std::string& mime_boundary,
1064 std::string* post_data) { 1074 std::string* post_data) {
1065 DCHECK(post_data); 1075 DCHECK(post_data);
1066 post_data->append("--" + mime_boundary + "--\r\n"); 1076 post_data->append("--" + mime_boundary + "--\r\n");
1067 } 1077 }
1068 1078
1069 } // namespace net 1079 } // namespace net
OLDNEW
« no previous file with comments | « net/base/mime_util.h ('k') | net/base/mime_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698