OLD | NEW |
---|---|
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 "content/browser/loader/resource_loader.h" | 5 #include "content/browser/loader/resource_loader.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "base/strings/string_number_conversions.h" | |
10 #include "base/time/time.h" | 11 #include "base/time/time.h" |
12 #include "base/timer/timer.h" | |
11 #include "content/browser/child_process_security_policy_impl.h" | 13 #include "content/browser/child_process_security_policy_impl.h" |
12 #include "content/browser/loader/cross_site_resource_handler.h" | 14 #include "content/browser/loader/cross_site_resource_handler.h" |
13 #include "content/browser/loader/resource_loader_delegate.h" | 15 #include "content/browser/loader/resource_loader_delegate.h" |
14 #include "content/browser/loader/resource_request_info_impl.h" | 16 #include "content/browser/loader/resource_request_info_impl.h" |
15 #include "content/browser/ssl/ssl_client_auth_handler.h" | 17 #include "content/browser/ssl/ssl_client_auth_handler.h" |
16 #include "content/browser/ssl/ssl_manager.h" | 18 #include "content/browser/ssl/ssl_manager.h" |
17 #include "content/common/ssl_status_serialization.h" | 19 #include "content/common/ssl_status_serialization.h" |
18 #include "content/public/browser/cert_store.h" | 20 #include "content/public/browser/cert_store.h" |
19 #include "content/public/browser/resource_dispatcher_host_login_delegate.h" | 21 #include "content/public/browser/resource_dispatcher_host_login_delegate.h" |
20 #include "content/public/browser/site_instance.h" | 22 #include "content/public/browser/site_instance.h" |
21 #include "content/public/common/content_client.h" | 23 #include "content/public/common/content_client.h" |
22 #include "content/public/common/content_switches.h" | 24 #include "content/public/common/content_switches.h" |
23 #include "content/public/common/process_type.h" | 25 #include "content/public/common/process_type.h" |
24 #include "content/public/common/resource_response.h" | 26 #include "content/public/common/resource_response.h" |
25 #include "content/public/common/url_constants.h" | 27 #include "content/public/common/url_constants.h" |
26 #include "net/base/io_buffer.h" | 28 #include "net/base/io_buffer.h" |
27 #include "net/base/load_flags.h" | 29 #include "net/base/load_flags.h" |
28 #include "net/http/http_response_headers.h" | 30 #include "net/http/http_response_headers.h" |
29 #include "net/ssl/client_cert_store.h" | 31 #include "net/ssl/client_cert_store.h" |
30 #include "net/ssl/client_cert_store_impl.h" | 32 #include "net/ssl/client_cert_store_impl.h" |
31 #include "webkit/browser/appcache/appcache_interceptor.h" | 33 #include "webkit/browser/appcache/appcache_interceptor.h" |
32 | 34 |
33 using base::TimeDelta; | 35 using base::TimeDelta; |
34 using base::TimeTicks; | 36 using base::TimeTicks; |
35 | 37 |
36 namespace content { | 38 namespace content { |
37 namespace { | 39 namespace { |
38 | 40 |
41 // TODO(jkarlin): The value is high to reduce the chance of the detachable | |
42 // request timing out, forcing a blocked second request to open a new connection | |
43 // and start over. Reduce this value once we have a better idea of what it | |
44 // should be and once we stop blocking multiple simultaneous requests for the | |
45 // same resource (see bugs 46104 and 31014). | |
James Simonsen
2013/10/28 21:16:40
I think the worst case scenario here is that the o
jkarlin2
2013/10/29 11:48:59
I agree that the second reader should be able to d
| |
46 const int kDefaultDetachableDelayOnCancelMs = 60000; | |
47 | |
39 void PopulateResourceResponse(net::URLRequest* request, | 48 void PopulateResourceResponse(net::URLRequest* request, |
40 ResourceResponse* response) { | 49 ResourceResponse* response) { |
41 response->head.error_code = request->status().error(); | 50 response->head.error_code = request->status().error(); |
42 response->head.request_time = request->request_time(); | 51 response->head.request_time = request->request_time(); |
43 response->head.response_time = request->response_time(); | 52 response->head.response_time = request->response_time(); |
44 response->head.headers = request->response_headers(); | 53 response->head.headers = request->response_headers(); |
45 request->GetCharset(&response->head.charset); | 54 request->GetCharset(&response->head.charset); |
46 response->head.content_length = request->GetExpectedContentSize(); | 55 response->head.content_length = request->GetExpectedContentSize(); |
47 request->GetMimeType(&response->head.mime_type); | 56 request->GetMimeType(&response->head.mime_type); |
48 net::HttpResponseInfo response_info = request->response_info(); | 57 net::HttpResponseInfo response_info = request->response_info(); |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
203 ResourceLoaderDelegate* delegate, | 212 ResourceLoaderDelegate* delegate, |
204 scoped_ptr<net::ClientCertStore> client_cert_store) { | 213 scoped_ptr<net::ClientCertStore> client_cert_store) { |
205 deferred_stage_ = DEFERRED_NONE; | 214 deferred_stage_ = DEFERRED_NONE; |
206 request_ = request.Pass(); | 215 request_ = request.Pass(); |
207 handler_ = handler.Pass(); | 216 handler_ = handler.Pass(); |
208 delegate_ = delegate; | 217 delegate_ = delegate; |
209 last_upload_position_ = 0; | 218 last_upload_position_ = 0; |
210 waiting_for_upload_progress_ack_ = false; | 219 waiting_for_upload_progress_ack_ = false; |
211 is_transferring_ = false; | 220 is_transferring_ = false; |
212 client_cert_store_ = client_cert_store.Pass(); | 221 client_cert_store_ = client_cert_store.Pass(); |
222 detachable_delay_on_cancel_ms_ = kDefaultDetachableDelayOnCancelMs; | |
213 | 223 |
214 request_->set_delegate(this); | 224 request_->set_delegate(this); |
215 handler_->SetController(this); | 225 handler_->SetController(this); |
216 } | 226 } |
217 | 227 |
218 void ResourceLoader::OnReceivedRedirect(net::URLRequest* unused, | 228 void ResourceLoader::OnReceivedRedirect(net::URLRequest* unused, |
219 const GURL& new_url, | 229 const GURL& new_url, |
220 bool* defer) { | 230 bool* defer) { |
221 DCHECK_EQ(request_.get(), unused); | 231 DCHECK_EQ(request_.get(), unused); |
222 | 232 |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
451 CancelRequest(false); | 461 CancelRequest(false); |
452 } | 462 } |
453 | 463 |
454 void ResourceLoader::StartRequestInternal() { | 464 void ResourceLoader::StartRequestInternal() { |
455 DCHECK(!request_->is_pending()); | 465 DCHECK(!request_->is_pending()); |
456 request_->Start(); | 466 request_->Start(); |
457 | 467 |
458 delegate_->DidStartRequest(this); | 468 delegate_->DidStartRequest(this); |
459 } | 469 } |
460 | 470 |
471 void ResourceLoader::Detach() { | |
472 ResourceRequestInfoImpl* info = GetRequestInfo(); | |
473 | |
474 if (info->is_detached()) | |
475 return; | |
476 info->set_detached(); | |
477 detached_timer_.reset(new base::OneShotTimer<ResourceLoader>()); | |
478 detached_timer_->Start( | |
479 FROM_HERE, TimeDelta::FromMilliseconds(detachable_delay_on_cancel_ms_), | |
480 this, &ResourceLoader::Cancel); | |
481 } | |
482 | |
461 void ResourceLoader::CancelRequestInternal(int error, bool from_renderer) { | 483 void ResourceLoader::CancelRequestInternal(int error, bool from_renderer) { |
462 VLOG(1) << "CancelRequestInternal: " << request_->url().spec(); | 484 VLOG(1) << "CancelRequestInternal: " << request_->url().spec(); |
463 | 485 |
464 ResourceRequestInfoImpl* info = GetRequestInfo(); | 486 ResourceRequestInfoImpl* info = GetRequestInfo(); |
465 | 487 |
466 // WebKit will send us a cancel for downloads since it no longer handles | 488 // WebKit will send us a cancel for downloads since it no longer handles |
467 // them. In this case, ignore the cancel since we handle downloads in the | 489 // them. In this case, ignore the cancel since we handle downloads in the |
468 // browser. | 490 // browser. |
469 if (from_renderer && (info->is_download() || info->is_stream())) | 491 if (from_renderer && (info->is_download() || info->is_stream())) |
470 return; | 492 return; |
471 | 493 |
494 if (from_renderer && info->is_detachable()) { | |
495 Detach(); | |
496 return; | |
497 } | |
498 | |
472 // TODO(darin): Perhaps we should really be looking to see if the status is | 499 // TODO(darin): Perhaps we should really be looking to see if the status is |
473 // IO_PENDING? | 500 // IO_PENDING? |
474 bool was_pending = request_->is_pending(); | 501 bool was_pending = request_->is_pending(); |
475 | 502 |
476 if (login_delegate_.get()) { | 503 if (login_delegate_.get()) { |
477 login_delegate_->OnRequestCancelled(); | 504 login_delegate_->OnRequestCancelled(); |
478 login_delegate_ = NULL; | 505 login_delegate_ = NULL; |
479 } | 506 } |
480 if (ssl_client_auth_handler_.get()) { | 507 if (ssl_client_auth_handler_.get()) { |
481 ssl_client_auth_handler_->OnRequestCancelled(); | 508 ssl_client_auth_handler_->OnRequestCancelled(); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
655 // we resume. | 682 // we resume. |
656 deferred_stage_ = DEFERRED_FINISH; | 683 deferred_stage_ = DEFERRED_FINISH; |
657 } | 684 } |
658 } | 685 } |
659 | 686 |
660 void ResourceLoader::CallDidFinishLoading() { | 687 void ResourceLoader::CallDidFinishLoading() { |
661 delegate_->DidFinishLoading(this); | 688 delegate_->DidFinishLoading(this); |
662 } | 689 } |
663 | 690 |
664 } // namespace content | 691 } // namespace content |
OLD | NEW |