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

Side by Side Diff: content/child/web_url_loader_impl.cc

Issue 54233002: Make net::DataURL's MIME string check stricter (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 // An implementation of WebURLLoader in terms of ResourceLoaderBridge. 5 // An implementation of WebURLLoader in terms of ResourceLoaderBridge.
6 6
7 #include "content/child/web_url_loader_impl.h" 7 #include "content/child/web_url_loader_impl.h"
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 using webkit_glue::MultipartResponseDelegate; 57 using webkit_glue::MultipartResponseDelegate;
58 using webkit_glue::ResourceDevToolsInfo; 58 using webkit_glue::ResourceDevToolsInfo;
59 using webkit_glue::ResourceLoaderBridge; 59 using webkit_glue::ResourceLoaderBridge;
60 using webkit_glue::ResourceResponseInfo; 60 using webkit_glue::ResourceResponseInfo;
61 using webkit_glue::WebURLResponseExtraDataImpl; 61 using webkit_glue::WebURLResponseExtraDataImpl;
62 62
63 namespace content { 63 namespace content {
64 64
65 // Utilities ------------------------------------------------------------------ 65 // Utilities ------------------------------------------------------------------
66 66
67 bool GetInfoFromDataURL(const GURL& url,
68 ResourceResponseInfo* info,
69 std::string* data,
70 int* error_code) {
71 std::string mime_type;
72 std::string charset;
73 if (!net::DataURL::Parse(url, &mime_type, &charset, data)) {
74 *error_code = net::ERR_INVALID_URL;
75 return false;
76 }
77
78 DCHECK(!mime_type.empty());
79 DCHECK(!charset.empty());
80
81 // mime_type set by net::DataURL::Parse() is guaranteed to be in
82 // token "/" token
83 // form. Now just ensure charset is token. The grammar for charset is not
84 // specially defined in RFC2045 and RFC2397. It just need to be token or
85 // quoted-string since it's an attibute value of media type. But charset in
86 // Content-Type header is specified explicitly to follow token ABNF in
87 // httpbis spec.
88 if (!net::HttpUtil::IsToken(charset)) {
89 *error_code = net::ERR_INVALID_URL;
90 return false;
91 }
92
93 *error_code = net::OK;
94 // Assure same time for all time fields of data: URLs.
95 Time now = Time::Now();
96 info->load_timing.request_start = TimeTicks::Now();
97 info->load_timing.request_start_time = now;
98 info->request_time = now;
99 info->response_time = now;
100
101 scoped_refptr<net::HttpResponseHeaders> headers(
102 new net::HttpResponseHeaders(std::string()));
103 headers->ReplaceStatusLine("HTTP/1.1 200 OK");
104 std::string content_type_header =
105 "Content-Type: " + mime_type + ";charset=" + charset;
106 headers->AddHeader(content_type_header);
107 headers->AddHeader("Access-Control-Allow-Origin: *");
108 headers->AddHeader("Access-Control-Allow-Credentials: true");
109 info->headers = headers;
110
111 info->mime_type.swap(mime_type);
112 info->charset.swap(charset);
113 info->security_info.clear();
114 info->content_length = data->length();
115 info->encoded_data_length = 0;
116
117 return true;
118 }
119
67 namespace { 120 namespace {
68 121
69 const char kThrottledErrorDescription[] = 122 const char kThrottledErrorDescription[] =
70 "Request throttled. Visit http://dev.chromium.org/throttling for more " 123 "Request throttled. Visit http://dev.chromium.org/throttling for more "
71 "information."; 124 "information.";
72 125
73 class HeaderFlattener : public WebHTTPHeaderVisitor { 126 class HeaderFlattener : public WebHTTPHeaderVisitor {
74 public: 127 public:
75 explicit HeaderFlattener(int load_flags) 128 explicit HeaderFlattener(int load_flags)
76 : load_flags_(load_flags), 129 : load_flags_(load_flags),
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 } 169 }
117 return buffer_; 170 return buffer_;
118 } 171 }
119 172
120 private: 173 private:
121 int load_flags_; 174 int load_flags_;
122 std::string buffer_; 175 std::string buffer_;
123 bool has_accept_header_; 176 bool has_accept_header_;
124 }; 177 };
125 178
126 // Extracts the information from a data: url.
127 bool GetInfoFromDataURL(const GURL& url,
128 ResourceResponseInfo* info,
129 std::string* data,
130 int* error_code) {
131 std::string mime_type;
132 std::string charset;
133 if (net::DataURL::Parse(url, &mime_type, &charset, data)) {
134 *error_code = net::OK;
135 // Assure same time for all time fields of data: URLs.
136 Time now = Time::Now();
137 info->load_timing.request_start = TimeTicks::Now();
138 info->load_timing.request_start_time = now;
139 info->request_time = now;
140 info->response_time = now;
141 info->headers = NULL;
142 info->mime_type.swap(mime_type);
143 info->charset.swap(charset);
144 info->security_info.clear();
145 info->content_length = data->length();
146 info->encoded_data_length = 0;
147
148 return true;
149 }
150
151 *error_code = net::ERR_INVALID_URL;
152 return false;
153 }
154
155 typedef ResourceDevToolsInfo::HeadersVector HeadersVector; 179 typedef ResourceDevToolsInfo::HeadersVector HeadersVector;
156 180
157 // Converts timing data from |load_timing| to the format used by WebKit. 181 // Converts timing data from |load_timing| to the format used by WebKit.
158 void PopulateURLLoadTiming(const net::LoadTimingInfo& load_timing, 182 void PopulateURLLoadTiming(const net::LoadTimingInfo& load_timing,
159 WebURLLoadTiming* url_timing) { 183 WebURLLoadTiming* url_timing) {
160 DCHECK(!load_timing.request_start.is_null()); 184 DCHECK(!load_timing.request_start.is_null());
161 185
162 const TimeTicks kNullTicks; 186 const TimeTicks kNullTicks;
163 url_timing->initialize(); 187 url_timing->initialize();
164 url_timing->setRequestTime( 188 url_timing->setRequestTime(
(...skipping 699 matching lines...) Expand 10 before | Expand all | Expand 10 after
864 888
865 void WebURLLoaderImpl::setDefersLoading(bool value) { 889 void WebURLLoaderImpl::setDefersLoading(bool value) {
866 context_->SetDefersLoading(value); 890 context_->SetDefersLoading(value);
867 } 891 }
868 892
869 void WebURLLoaderImpl::didChangePriority(WebURLRequest::Priority new_priority) { 893 void WebURLLoaderImpl::didChangePriority(WebURLRequest::Priority new_priority) {
870 context_->DidChangePriority(new_priority); 894 context_->DidChangePriority(new_priority);
871 } 895 }
872 896
873 } // namespace content 897 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698