| OLD | NEW |
| 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 #include "content/child/web_url_loader_impl.h" | 5 #include "content/child/web_url_loader_impl.h" |
| 6 | 6 |
| 7 #include <openssl/ssl.h> | 7 #include <openssl/ssl.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 case WebURLRequest::PriorityVeryLow: | 151 case WebURLRequest::PriorityVeryLow: |
| 152 return net::IDLE; | 152 return net::IDLE; |
| 153 | 153 |
| 154 case WebURLRequest::PriorityUnresolved: | 154 case WebURLRequest::PriorityUnresolved: |
| 155 default: | 155 default: |
| 156 NOTREACHED(); | 156 NOTREACHED(); |
| 157 return net::LOW; | 157 return net::LOW; |
| 158 } | 158 } |
| 159 } | 159 } |
| 160 | 160 |
| 161 blink::WebReferrerPolicy NetReferrerPolicyToBlinkReferrerPolicy( |
| 162 net::URLRequest::ReferrerPolicy net_policy) { |
| 163 switch (net_policy) { |
| 164 case net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE: |
| 165 return blink::WebReferrerPolicyNoReferrerWhenDowngrade; |
| 166 case net::URLRequest:: |
| 167 REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN: |
| 168 return blink:: |
| 169 WebReferrerPolicyNoReferrerWhenDowngradeOriginWhenCrossOrigin; |
| 170 case net::URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN: |
| 171 return blink::WebReferrerPolicyOriginWhenCrossOrigin; |
| 172 case net::URLRequest::NEVER_CLEAR_REFERRER: |
| 173 return blink::WebReferrerPolicyAlways; |
| 174 case net::URLRequest::ORIGIN: |
| 175 return blink::WebReferrerPolicyOrigin; |
| 176 case net::URLRequest::NO_REFERRER: |
| 177 return blink::WebReferrerPolicyNever; |
| 178 case net::URLRequest::MAX_REFERRER_POLICY: |
| 179 NOTREACHED(); |
| 180 return blink::WebReferrerPolicyDefault; |
| 181 } |
| 182 NOTREACHED(); |
| 183 return blink::WebReferrerPolicyDefault; |
| 184 } |
| 185 |
| 161 // Extracts info from a data scheme URL |url| into |info| and |data|. Returns | 186 // Extracts info from a data scheme URL |url| into |info| and |data|. Returns |
| 162 // net::OK if successful. Returns a net error code otherwise. | 187 // net::OK if successful. Returns a net error code otherwise. |
| 163 int GetInfoFromDataURL(const GURL& url, | 188 int GetInfoFromDataURL(const GURL& url, |
| 164 ResourceResponseInfo* info, | 189 ResourceResponseInfo* info, |
| 165 std::string* data) { | 190 std::string* data) { |
| 166 // Assure same time for all time fields of data: URLs. | 191 // Assure same time for all time fields of data: URLs. |
| 167 Time now = Time::Now(); | 192 Time now = Time::Now(); |
| 168 info->load_timing.request_start = TimeTicks::Now(); | 193 info->load_timing.request_start = TimeTicks::Now(); |
| 169 info->load_timing.request_start_time = now; | 194 info->load_timing.request_start_time = now; |
| 170 info->request_time = now; | 195 info->request_time = now; |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 void CancelBodyStreaming(); | 401 void CancelBodyStreaming(); |
| 377 // We can optimize the handling of data URLs in most cases. | 402 // We can optimize the handling of data URLs in most cases. |
| 378 bool CanHandleDataURLRequestLocally() const; | 403 bool CanHandleDataURLRequestLocally() const; |
| 379 void HandleDataURL(); | 404 void HandleDataURL(); |
| 380 | 405 |
| 381 WebURLLoaderImpl* loader_; | 406 WebURLLoaderImpl* loader_; |
| 382 WebURLRequest request_; | 407 WebURLRequest request_; |
| 383 WebURLLoaderClient* client_; | 408 WebURLLoaderClient* client_; |
| 384 ResourceDispatcher* resource_dispatcher_; | 409 ResourceDispatcher* resource_dispatcher_; |
| 385 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 410 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
| 386 WebReferrerPolicy referrer_policy_; | |
| 387 std::unique_ptr<FtpDirectoryListingResponseDelegate> ftp_listing_delegate_; | 411 std::unique_ptr<FtpDirectoryListingResponseDelegate> ftp_listing_delegate_; |
| 388 std::unique_ptr<StreamOverrideParameters> stream_override_; | 412 std::unique_ptr<StreamOverrideParameters> stream_override_; |
| 389 std::unique_ptr<SharedMemoryDataConsumerHandle::Writer> body_stream_writer_; | 413 std::unique_ptr<SharedMemoryDataConsumerHandle::Writer> body_stream_writer_; |
| 390 enum DeferState {NOT_DEFERRING, SHOULD_DEFER, DEFERRED_DATA}; | 414 enum DeferState {NOT_DEFERRING, SHOULD_DEFER, DEFERRED_DATA}; |
| 391 DeferState defers_loading_; | 415 DeferState defers_loading_; |
| 392 int request_id_; | 416 int request_id_; |
| 393 | 417 |
| 394 mojom::URLLoaderFactory* url_loader_factory_; | 418 mojom::URLLoaderFactory* url_loader_factory_; |
| 395 }; | 419 }; |
| 396 | 420 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 422 | 446 |
| 423 // WebURLLoaderImpl::Context -------------------------------------------------- | 447 // WebURLLoaderImpl::Context -------------------------------------------------- |
| 424 | 448 |
| 425 WebURLLoaderImpl::Context::Context(WebURLLoaderImpl* loader, | 449 WebURLLoaderImpl::Context::Context(WebURLLoaderImpl* loader, |
| 426 ResourceDispatcher* resource_dispatcher, | 450 ResourceDispatcher* resource_dispatcher, |
| 427 mojom::URLLoaderFactory* url_loader_factory) | 451 mojom::URLLoaderFactory* url_loader_factory) |
| 428 : loader_(loader), | 452 : loader_(loader), |
| 429 client_(NULL), | 453 client_(NULL), |
| 430 resource_dispatcher_(resource_dispatcher), | 454 resource_dispatcher_(resource_dispatcher), |
| 431 task_runner_(base::ThreadTaskRunnerHandle::Get()), | 455 task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| 432 referrer_policy_(blink::WebReferrerPolicyDefault), | |
| 433 defers_loading_(NOT_DEFERRING), | 456 defers_loading_(NOT_DEFERRING), |
| 434 request_id_(-1), | 457 request_id_(-1), |
| 435 url_loader_factory_(url_loader_factory) {} | 458 url_loader_factory_(url_loader_factory) {} |
| 436 | 459 |
| 437 void WebURLLoaderImpl::Context::Cancel() { | 460 void WebURLLoaderImpl::Context::Cancel() { |
| 438 TRACE_EVENT_WITH_FLOW0("loading", "WebURLLoaderImpl::Context::Cancel", this, | 461 TRACE_EVENT_WITH_FLOW0("loading", "WebURLLoaderImpl::Context::Cancel", this, |
| 439 TRACE_EVENT_FLAG_FLOW_IN); | 462 TRACE_EVENT_FLAG_FLOW_IN); |
| 440 if (resource_dispatcher_ && // NULL in unittest. | 463 if (resource_dispatcher_ && // NULL in unittest. |
| 441 request_id_ != -1) { | 464 request_id_ != -1) { |
| 442 resource_dispatcher_->Cancel(request_id_); | 465 resource_dispatcher_->Cancel(request_id_); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 // Check credentials flag is set when credentials mode is include. | 548 // Check credentials flag is set when credentials mode is include. |
| 526 | 549 |
| 527 std::unique_ptr<ResourceRequest> resource_request(new ResourceRequest); | 550 std::unique_ptr<ResourceRequest> resource_request(new ResourceRequest); |
| 528 | 551 |
| 529 resource_request->method = method; | 552 resource_request->method = method; |
| 530 resource_request->url = url; | 553 resource_request->url = url; |
| 531 resource_request->first_party_for_cookies = request.firstPartyForCookies(); | 554 resource_request->first_party_for_cookies = request.firstPartyForCookies(); |
| 532 resource_request->request_initiator = request.requestorOrigin(); | 555 resource_request->request_initiator = request.requestorOrigin(); |
| 533 resource_request->referrer = referrer_url; | 556 resource_request->referrer = referrer_url; |
| 534 | 557 |
| 535 referrer_policy_ = request.referrerPolicy(); | 558 resource_request->referrer_policy = request.referrerPolicy(); |
| 536 resource_request->referrer_policy = referrer_policy_; | |
| 537 | 559 |
| 538 resource_request->headers = GetWebURLRequestHeaders(request); | 560 resource_request->headers = GetWebURLRequestHeaders(request); |
| 539 resource_request->load_flags = GetLoadFlagsForWebURLRequest(request); | 561 resource_request->load_flags = GetLoadFlagsForWebURLRequest(request); |
| 540 // origin_pid only needs to be non-zero if the request originates outside | 562 // origin_pid only needs to be non-zero if the request originates outside |
| 541 // the render process, so we can use requestorProcessID even for requests | 563 // the render process, so we can use requestorProcessID even for requests |
| 542 // from in-process plugins. | 564 // from in-process plugins. |
| 543 resource_request->origin_pid = request.requestorProcessID(); | 565 resource_request->origin_pid = request.requestorProcessID(); |
| 544 resource_request->resource_type = WebURLRequestToResourceType(request); | 566 resource_request->resource_type = WebURLRequestToResourceType(request); |
| 545 resource_request->priority = | 567 resource_request->priority = |
| 546 ConvertWebKitPriorityToNetPriority(request.getPriority()); | 568 ConvertWebKitPriorityToNetPriority(request.getPriority()); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 TRACE_EVENT_WITH_FLOW0( | 652 TRACE_EVENT_WITH_FLOW0( |
| 631 "loading", "WebURLLoaderImpl::Context::OnReceivedRedirect", | 653 "loading", "WebURLLoaderImpl::Context::OnReceivedRedirect", |
| 632 this, TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); | 654 this, TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); |
| 633 | 655 |
| 634 WebURLResponse response; | 656 WebURLResponse response; |
| 635 PopulateURLResponse(request_.url(), info, &response, | 657 PopulateURLResponse(request_.url(), info, &response, |
| 636 request_.reportRawHeaders()); | 658 request_.reportRawHeaders()); |
| 637 | 659 |
| 638 WebURLRequest new_request; | 660 WebURLRequest new_request; |
| 639 PopulateURLRequestForRedirect( | 661 PopulateURLRequestForRedirect( |
| 640 request_, redirect_info, referrer_policy_, | 662 request_, redirect_info, |
| 641 info.was_fetched_via_service_worker | 663 info.was_fetched_via_service_worker |
| 642 ? blink::WebURLRequest::SkipServiceWorker::None | 664 ? blink::WebURLRequest::SkipServiceWorker::None |
| 643 : blink::WebURLRequest::SkipServiceWorker::All, | 665 : blink::WebURLRequest::SkipServiceWorker::All, |
| 644 &new_request); | 666 &new_request); |
| 645 | 667 |
| 646 client_->willFollowRedirect(loader_, new_request, response); | 668 client_->willFollowRedirect(loader_, new_request, response); |
| 647 request_ = new_request; | 669 request_ = new_request; |
| 648 | 670 |
| 649 // Only follow the redirect if WebKit left the URL unmodified. | 671 // Only follow the redirect if WebKit left the URL unmodified. |
| 650 if (redirect_info.new_url == GURL(new_request.url())) { | 672 if (redirect_info.new_url == GURL(new_request.url())) { |
| (...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1134 std::string name; | 1156 std::string name; |
| 1135 while (headers->EnumerateHeaderLines(&iter, &name, &value)) { | 1157 while (headers->EnumerateHeaderLines(&iter, &name, &value)) { |
| 1136 response->addHTTPHeaderField(WebString::fromLatin1(name), | 1158 response->addHTTPHeaderField(WebString::fromLatin1(name), |
| 1137 WebString::fromLatin1(value)); | 1159 WebString::fromLatin1(value)); |
| 1138 } | 1160 } |
| 1139 } | 1161 } |
| 1140 | 1162 |
| 1141 void WebURLLoaderImpl::PopulateURLRequestForRedirect( | 1163 void WebURLLoaderImpl::PopulateURLRequestForRedirect( |
| 1142 const blink::WebURLRequest& request, | 1164 const blink::WebURLRequest& request, |
| 1143 const net::RedirectInfo& redirect_info, | 1165 const net::RedirectInfo& redirect_info, |
| 1144 blink::WebReferrerPolicy referrer_policy, | |
| 1145 blink::WebURLRequest::SkipServiceWorker skip_service_worker, | 1166 blink::WebURLRequest::SkipServiceWorker skip_service_worker, |
| 1146 blink::WebURLRequest* new_request) { | 1167 blink::WebURLRequest* new_request) { |
| 1147 // TODO(darin): We lack sufficient information to construct the actual | 1168 // TODO(darin): We lack sufficient information to construct the actual |
| 1148 // request that resulted from the redirect. | 1169 // request that resulted from the redirect. |
| 1149 new_request->setURL(redirect_info.new_url); | 1170 new_request->setURL(redirect_info.new_url); |
| 1150 new_request->setFirstPartyForCookies( | 1171 new_request->setFirstPartyForCookies( |
| 1151 redirect_info.new_first_party_for_cookies); | 1172 redirect_info.new_first_party_for_cookies); |
| 1152 new_request->setDownloadToFile(request.downloadToFile()); | 1173 new_request->setDownloadToFile(request.downloadToFile()); |
| 1153 new_request->setUseStreamOnResponse(request.useStreamOnResponse()); | 1174 new_request->setUseStreamOnResponse(request.useStreamOnResponse()); |
| 1154 new_request->setRequestContext(request.getRequestContext()); | 1175 new_request->setRequestContext(request.getRequestContext()); |
| 1155 new_request->setFrameType(request.getFrameType()); | 1176 new_request->setFrameType(request.getFrameType()); |
| 1156 new_request->setSkipServiceWorker(skip_service_worker); | 1177 new_request->setSkipServiceWorker(skip_service_worker); |
| 1157 new_request->setShouldResetAppCache(request.shouldResetAppCache()); | 1178 new_request->setShouldResetAppCache(request.shouldResetAppCache()); |
| 1158 new_request->setFetchRequestMode(request.getFetchRequestMode()); | 1179 new_request->setFetchRequestMode(request.getFetchRequestMode()); |
| 1159 new_request->setFetchCredentialsMode(request.getFetchCredentialsMode()); | 1180 new_request->setFetchCredentialsMode(request.getFetchCredentialsMode()); |
| 1160 | 1181 |
| 1161 new_request->setHTTPReferrer(WebString::fromUTF8(redirect_info.new_referrer), | 1182 new_request->setHTTPReferrer(WebString::fromUTF8(redirect_info.new_referrer), |
| 1162 referrer_policy); | 1183 NetReferrerPolicyToBlinkReferrerPolicy( |
| 1184 redirect_info.new_referrer_policy)); |
| 1163 new_request->setPriority(request.getPriority()); | 1185 new_request->setPriority(request.getPriority()); |
| 1164 | 1186 |
| 1165 std::string old_method = request.httpMethod().utf8(); | 1187 std::string old_method = request.httpMethod().utf8(); |
| 1166 new_request->setHTTPMethod(WebString::fromUTF8(redirect_info.new_method)); | 1188 new_request->setHTTPMethod(WebString::fromUTF8(redirect_info.new_method)); |
| 1167 if (redirect_info.new_method == old_method) | 1189 if (redirect_info.new_method == old_method) |
| 1168 new_request->setHTTPBody(request.httpBody()); | 1190 new_request->setHTTPBody(request.httpBody()); |
| 1169 } | 1191 } |
| 1170 | 1192 |
| 1171 void WebURLLoaderImpl::loadSynchronously(const WebURLRequest& request, | 1193 void WebURLLoaderImpl::loadSynchronously(const WebURLRequest& request, |
| 1172 WebURLResponse& response, | 1194 WebURLResponse& response, |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1269 response->clearHTTPHeaderField(webStringName); | 1291 response->clearHTTPHeaderField(webStringName); |
| 1270 while (response_headers->EnumerateHeader(&iterator, name, &value)) { | 1292 while (response_headers->EnumerateHeader(&iterator, name, &value)) { |
| 1271 response->addHTTPHeaderField(webStringName, | 1293 response->addHTTPHeaderField(webStringName, |
| 1272 WebString::fromLatin1(value)); | 1294 WebString::fromLatin1(value)); |
| 1273 } | 1295 } |
| 1274 } | 1296 } |
| 1275 return true; | 1297 return true; |
| 1276 } | 1298 } |
| 1277 | 1299 |
| 1278 } // namespace content | 1300 } // namespace content |
| OLD | NEW |