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

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

Issue 294193002: Set response headers for data URL. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed #19 Created 6 years, 4 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 12 matching lines...) Expand all
23 #include "content/common/resource_request_body.h" 23 #include "content/common/resource_request_body.h"
24 #include "content/public/child/request_peer.h" 24 #include "content/public/child/request_peer.h"
25 #include "net/base/data_url.h" 25 #include "net/base/data_url.h"
26 #include "net/base/filename_util.h" 26 #include "net/base/filename_util.h"
27 #include "net/base/load_flags.h" 27 #include "net/base/load_flags.h"
28 #include "net/base/mime_util.h" 28 #include "net/base/mime_util.h"
29 #include "net/base/net_errors.h" 29 #include "net/base/net_errors.h"
30 #include "net/http/http_response_headers.h" 30 #include "net/http/http_response_headers.h"
31 #include "net/http/http_util.h" 31 #include "net/http/http_util.h"
32 #include "net/url_request/url_request.h" 32 #include "net/url_request/url_request.h"
33 #include "net/url_request/url_request_data_job.h"
33 #include "third_party/WebKit/public/platform/WebHTTPHeaderVisitor.h" 34 #include "third_party/WebKit/public/platform/WebHTTPHeaderVisitor.h"
34 #include "third_party/WebKit/public/platform/WebHTTPLoadInfo.h" 35 #include "third_party/WebKit/public/platform/WebHTTPLoadInfo.h"
35 #include "third_party/WebKit/public/platform/WebURL.h" 36 #include "third_party/WebKit/public/platform/WebURL.h"
36 #include "third_party/WebKit/public/platform/WebURLError.h" 37 #include "third_party/WebKit/public/platform/WebURLError.h"
37 #include "third_party/WebKit/public/platform/WebURLLoadTiming.h" 38 #include "third_party/WebKit/public/platform/WebURLLoadTiming.h"
38 #include "third_party/WebKit/public/platform/WebURLLoaderClient.h" 39 #include "third_party/WebKit/public/platform/WebURLLoaderClient.h"
39 #include "third_party/WebKit/public/platform/WebURLRequest.h" 40 #include "third_party/WebKit/public/platform/WebURLRequest.h"
40 #include "third_party/WebKit/public/platform/WebURLResponse.h" 41 #include "third_party/WebKit/public/platform/WebURLResponse.h"
41 #include "third_party/WebKit/public/web/WebSecurityPolicy.h" 42 #include "third_party/WebKit/public/web/WebSecurityPolicy.h"
42 #include "webkit/child/resource_loader_bridge.h" 43 #include "webkit/child/resource_loader_bridge.h"
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 has_accept_header_ = true; 102 has_accept_header_ = true;
102 } 103 }
103 return buffer_; 104 return buffer_;
104 } 105 }
105 106
106 private: 107 private:
107 std::string buffer_; 108 std::string buffer_;
108 bool has_accept_header_; 109 bool has_accept_header_;
109 }; 110 };
110 111
111 // Extracts the information from a data: url.
112 bool GetInfoFromDataURL(const GURL& url,
113 ResourceResponseInfo* info,
114 std::string* data,
115 int* error_code) {
116 std::string mime_type;
117 std::string charset;
118 if (net::DataURL::Parse(url, &mime_type, &charset, data)) {
119 *error_code = net::OK;
120 // Assure same time for all time fields of data: URLs.
121 Time now = Time::Now();
122 info->load_timing.request_start = TimeTicks::Now();
123 info->load_timing.request_start_time = now;
124 info->request_time = now;
125 info->response_time = now;
126 info->headers = NULL;
127 info->mime_type.swap(mime_type);
128 info->charset.swap(charset);
129 info->security_info.clear();
130 info->content_length = data->length();
131 info->encoded_data_length = 0;
132
133 return true;
134 }
135
136 *error_code = net::ERR_INVALID_URL;
137 return false;
138 }
139
140 typedef ResourceDevToolsInfo::HeadersVector HeadersVector; 112 typedef ResourceDevToolsInfo::HeadersVector HeadersVector;
141 113
142 // Converts timing data from |load_timing| to the format used by WebKit. 114 // Converts timing data from |load_timing| to the format used by WebKit.
143 void PopulateURLLoadTiming(const net::LoadTimingInfo& load_timing, 115 void PopulateURLLoadTiming(const net::LoadTimingInfo& load_timing,
144 WebURLLoadTiming* url_timing) { 116 WebURLLoadTiming* url_timing) {
145 DCHECK(!load_timing.request_start.is_null()); 117 DCHECK(!load_timing.request_start.is_null());
146 118
147 const TimeTicks kNullTicks; 119 const TimeTicks kNullTicks;
148 url_timing->initialize(); 120 url_timing->initialize();
149 url_timing->setRequestTime( 121 url_timing->setRequestTime(
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 case WebURLRequest::PriorityVeryLow: 162 case WebURLRequest::PriorityVeryLow:
191 return net::IDLE; 163 return net::IDLE;
192 164
193 case WebURLRequest::PriorityUnresolved: 165 case WebURLRequest::PriorityUnresolved:
194 default: 166 default:
195 NOTREACHED(); 167 NOTREACHED();
196 return net::LOW; 168 return net::LOW;
197 } 169 }
198 } 170 }
199 171
172 // Extracts info from a data scheme URL into |info| and |data|. Returns net::OK
173 // if successful. Returns a net error code otherwise. Exported only for testing.
174 int GetInfoFromDataURL(const GURL& url,
175 ResourceResponseInfo* info,
176 std::string* data) {
177 // Assure same time for all time fields of data: URLs.
178 Time now = Time::Now();
179 info->load_timing.request_start = TimeTicks::Now();
180 info->load_timing.request_start_time = now;
181 info->request_time = now;
182 info->response_time = now;
183
184 std::string mime_type;
185 std::string charset;
186 scoped_refptr<net::HttpResponseHeaders> headers(
187 new net::HttpResponseHeaders(std::string()));
188 int result = net::URLRequestDataJob::BuildResponse(
189 url, &mime_type, &charset, data, headers.get());
190 if (result != net::OK)
191 return result;
192
193 info->headers = headers;
194 info->mime_type.swap(mime_type);
195 info->charset.swap(charset);
196 info->security_info.clear();
197 info->content_length = data->length();
198 info->encoded_data_length = 0;
199
200 return net::OK;
201 }
202
200 } // namespace 203 } // namespace
201 204
202 // WebURLLoaderImpl::Context -------------------------------------------------- 205 // WebURLLoaderImpl::Context --------------------------------------------------
203 206
204 // This inner class exists since the WebURLLoader may be deleted while inside a 207 // This inner class exists since the WebURLLoader may be deleted while inside a
205 // call to WebURLLoaderClient. Refcounting is to keep the context from being 208 // call to WebURLLoaderClient. Refcounting is to keep the context from being
206 // deleted if it may have work to do after calling into the client. 209 // deleted if it may have work to do after calling into the client.
207 class WebURLLoaderImpl::Context : public base::RefCounted<Context>, 210 class WebURLLoaderImpl::Context : public base::RefCounted<Context>,
208 public RequestPeer { 211 public RequestPeer {
209 public: 212 public:
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 SyncLoadResponse* sync_load_response) { 313 SyncLoadResponse* sync_load_response) {
311 DCHECK(!bridge_.get()); 314 DCHECK(!bridge_.get());
312 315
313 request_ = request; // Save the request. 316 request_ = request; // Save the request.
314 317
315 GURL url = request.url(); 318 GURL url = request.url();
316 if (url.SchemeIs("data") && CanHandleDataURL(url)) { 319 if (url.SchemeIs("data") && CanHandleDataURL(url)) {
317 if (sync_load_response) { 320 if (sync_load_response) {
318 // This is a sync load. Do the work now. 321 // This is a sync load. Do the work now.
319 sync_load_response->url = url; 322 sync_load_response->url = url;
320 std::string data; 323 sync_load_response->error_code =
321 GetInfoFromDataURL(sync_load_response->url, sync_load_response, 324 GetInfoFromDataURL(sync_load_response->url, sync_load_response,
322 &sync_load_response->data, 325 &sync_load_response->data);
323 &sync_load_response->error_code);
324 } else { 326 } else {
325 base::MessageLoop::current()->PostTask( 327 base::MessageLoop::current()->PostTask(
326 FROM_HERE, base::Bind(&Context::HandleDataURL, this)); 328 FROM_HERE, base::Bind(&Context::HandleDataURL, this));
327 } 329 }
328 return; 330 return;
329 } 331 }
330 332
331 GURL referrer_url( 333 GURL referrer_url(
332 request.httpHeaderField(WebString::fromUTF8("Referer")).latin1()); 334 request.httpHeaderField(WebString::fromUTF8("Referer")).latin1());
333 const std::string& method = request.httpMethod().latin1(); 335 const std::string& method = request.httpMethod().latin1();
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 std::string mime_type, unused_charset; 690 std::string mime_type, unused_charset;
689 if (net::DataURL::Parse(url, &mime_type, &unused_charset, NULL) && 691 if (net::DataURL::Parse(url, &mime_type, &unused_charset, NULL) &&
690 net::IsSupportedMimeType(mime_type)) 692 net::IsSupportedMimeType(mime_type))
691 return true; 693 return true;
692 694
693 return false; 695 return false;
694 } 696 }
695 697
696 void WebURLLoaderImpl::Context::HandleDataURL() { 698 void WebURLLoaderImpl::Context::HandleDataURL() {
697 ResourceResponseInfo info; 699 ResourceResponseInfo info;
698 int error_code;
699 std::string data; 700 std::string data;
700 701
701 if (GetInfoFromDataURL(request_.url(), &info, &data, &error_code)) { 702 int error_code = GetInfoFromDataURL(request_.url(), &info, &data);
703
704 if (error_code == net::OK) {
702 OnReceivedResponse(info); 705 OnReceivedResponse(info);
703 if (!data.empty()) 706 if (!data.empty())
704 OnReceivedData(data.data(), data.size(), 0); 707 OnReceivedData(data.data(), data.size(), 0);
705 } 708 }
706 709
707 OnCompletedRequest(error_code, false, false, info.security_info, 710 OnCompletedRequest(error_code, false, false, info.security_info,
708 base::TimeTicks::Now(), 0); 711 base::TimeTicks::Now(), 0);
709 } 712 }
710 713
711 // WebURLLoaderImpl ----------------------------------------------------------- 714 // WebURLLoaderImpl -----------------------------------------------------------
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 int intra_priority_value) { 896 int intra_priority_value) {
894 context_->DidChangePriority(new_priority, intra_priority_value); 897 context_->DidChangePriority(new_priority, intra_priority_value);
895 } 898 }
896 899
897 bool WebURLLoaderImpl::attachThreadedDataReceiver( 900 bool WebURLLoaderImpl::attachThreadedDataReceiver(
898 blink::WebThreadedDataReceiver* threaded_data_receiver) { 901 blink::WebThreadedDataReceiver* threaded_data_receiver) {
899 return context_->AttachThreadedDataReceiver(threaded_data_receiver); 902 return context_->AttachThreadedDataReceiver(threaded_data_receiver);
900 } 903 }
901 904
902 } // namespace content 905 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698