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 "net/url_request/url_fetcher_core.h" | 5 #include "net/url_request/url_fetcher_core.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 #include "net/url_request/url_request_context_getter.h" | 24 #include "net/url_request/url_request_context_getter.h" |
25 #include "net/url_request/url_request_throttler_manager.h" | 25 #include "net/url_request/url_request_throttler_manager.h" |
26 | 26 |
27 namespace { | 27 namespace { |
28 | 28 |
29 const int kBufferSize = 4096; | 29 const int kBufferSize = 4096; |
30 const int kUploadProgressTimerInterval = 100; | 30 const int kUploadProgressTimerInterval = 100; |
31 bool g_interception_enabled = false; | 31 bool g_interception_enabled = false; |
32 bool g_ignore_certificate_requests = false; | 32 bool g_ignore_certificate_requests = false; |
33 | 33 |
| 34 void EmptyCompletionCallback(int result) {} |
| 35 |
34 } // namespace | 36 } // namespace |
35 | 37 |
36 namespace net { | 38 namespace net { |
37 | 39 |
38 // URLFetcherCore::Registry --------------------------------------------------- | 40 // URLFetcherCore::Registry --------------------------------------------------- |
39 | 41 |
40 URLFetcherCore::Registry::Registry() {} | 42 URLFetcherCore::Registry::Registry() {} |
41 URLFetcherCore::Registry::~Registry() {} | 43 URLFetcherCore::Registry::~Registry() {} |
42 | 44 |
43 void URLFetcherCore::Registry::AddURLFetcherCore(URLFetcherCore* core) { | 45 void URLFetcherCore::Registry::AddURLFetcherCore(URLFetcherCore* core) { |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 if (throttler_manager) { | 420 if (throttler_manager) { |
419 url_throttler_entry_ = throttler_manager->RegisterRequestUrl(url_); | 421 url_throttler_entry_ = throttler_manager->RegisterRequestUrl(url_); |
420 } | 422 } |
421 | 423 |
422 do { | 424 do { |
423 if (!request_->status().is_success() || bytes_read <= 0) | 425 if (!request_->status().is_success() || bytes_read <= 0) |
424 break; | 426 break; |
425 | 427 |
426 current_response_bytes_ += bytes_read; | 428 current_response_bytes_ += bytes_read; |
427 InformDelegateDownloadProgress(); | 429 InformDelegateDownloadProgress(); |
428 InformDelegateDownloadDataIfNecessary(bytes_read); | |
429 | 430 |
430 const int result = | 431 const int result = |
431 WriteBuffer(new DrainableIOBuffer(buffer_.get(), bytes_read)); | 432 WriteBuffer(new DrainableIOBuffer(buffer_.get(), bytes_read)); |
432 if (result < 0) { | 433 if (result < 0) { |
433 // Write failed or waiting for write completion. | 434 // Write failed or waiting for write completion. |
434 return; | 435 return; |
435 } | 436 } |
436 } while (request_->Read(buffer_.get(), kBufferSize, &bytes_read)); | 437 } while (request_->Read(buffer_.get(), kBufferSize, &bytes_read)); |
437 | 438 |
438 const URLRequestStatus status = request_->status(); | 439 const URLRequestStatus status = request_->status(); |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 | 644 |
644 // Release the reference to the request context. There could be multiple | 645 // Release the reference to the request context. There could be multiple |
645 // references to URLFetcher::Core at this point so it may take a while to | 646 // references to URLFetcher::Core at this point so it may take a while to |
646 // delete the object, but we cannot delay the destruction of the request | 647 // delete the object, but we cannot delay the destruction of the request |
647 // context. | 648 // context. |
648 request_context_getter_ = NULL; | 649 request_context_getter_ = NULL; |
649 first_party_for_cookies_ = GURL(); | 650 first_party_for_cookies_ = GURL(); |
650 url_request_data_key_ = NULL; | 651 url_request_data_key_ = NULL; |
651 url_request_create_data_callback_.Reset(); | 652 url_request_create_data_callback_.Reset(); |
652 was_cancelled_ = true; | 653 was_cancelled_ = true; |
653 response_writer_.reset(); | |
654 } | 654 } |
655 | 655 |
656 void URLFetcherCore::OnCompletedURLRequest( | 656 void URLFetcherCore::OnCompletedURLRequest( |
657 base::TimeDelta backoff_delay) { | 657 base::TimeDelta backoff_delay) { |
658 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 658 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); |
659 | 659 |
660 // Save the status and backoff_delay so that delegates can read it. | 660 // Save the status and backoff_delay so that delegates can read it. |
661 if (delegate_) { | 661 if (delegate_) { |
662 backoff_delay_ = backoff_delay; | 662 backoff_delay_ = backoff_delay; |
663 InformDelegateFetchIsComplete(); | 663 InformDelegateFetchIsComplete(); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
794 is_last_chunk); | 794 is_last_chunk); |
795 } | 795 } |
796 | 796 |
797 int URLFetcherCore::WriteBuffer(scoped_refptr<DrainableIOBuffer> data) { | 797 int URLFetcherCore::WriteBuffer(scoped_refptr<DrainableIOBuffer> data) { |
798 while (data->BytesRemaining() > 0) { | 798 while (data->BytesRemaining() > 0) { |
799 const int result = response_writer_->Write( | 799 const int result = response_writer_->Write( |
800 data.get(), | 800 data.get(), |
801 data->BytesRemaining(), | 801 data->BytesRemaining(), |
802 base::Bind(&URLFetcherCore::DidWriteBuffer, this, data)); | 802 base::Bind(&URLFetcherCore::DidWriteBuffer, this, data)); |
803 if (result < 0) { | 803 if (result < 0) { |
804 if (result != ERR_IO_PENDING) { | 804 if (result != ERR_IO_PENDING) |
805 CancelURLRequest(result); | 805 DidWriteBuffer(data, result); |
806 delegate_task_runner_->PostTask( | |
807 FROM_HERE, | |
808 base::Bind(&URLFetcherCore::InformDelegateFetchIsComplete, this)); | |
809 } | |
810 return result; | 806 return result; |
811 } | 807 } |
812 data->DidConsume(result); | 808 data->DidConsume(result); |
813 } | 809 } |
814 return OK; | 810 return OK; |
815 } | 811 } |
816 | 812 |
817 void URLFetcherCore::DidWriteBuffer(scoped_refptr<DrainableIOBuffer> data, | 813 void URLFetcherCore::DidWriteBuffer(scoped_refptr<DrainableIOBuffer> data, |
818 int result) { | 814 int result) { |
819 if (result < 0) { // Handle errors. | 815 if (result < 0) { // Handle errors. |
820 CancelURLRequest(result); | 816 CancelURLRequest(result); |
| 817 response_writer_->Finish(base::Bind(&EmptyCompletionCallback)); |
821 delegate_task_runner_->PostTask( | 818 delegate_task_runner_->PostTask( |
822 FROM_HERE, | 819 FROM_HERE, |
823 base::Bind(&URLFetcherCore::InformDelegateFetchIsComplete, this)); | 820 base::Bind(&URLFetcherCore::InformDelegateFetchIsComplete, this)); |
824 return; | 821 return; |
825 } | 822 } |
826 | 823 |
827 // Continue writing. | 824 // Continue writing. |
828 data->DidConsume(result); | 825 data->DidConsume(result); |
829 if (WriteBuffer(data) < 0) | 826 if (WriteBuffer(data) < 0) |
830 return; | 827 return; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
885 this, current_response_bytes_, total_response_bytes_)); | 882 this, current_response_bytes_, total_response_bytes_)); |
886 } | 883 } |
887 | 884 |
888 void URLFetcherCore::InformDelegateDownloadProgressInDelegateThread( | 885 void URLFetcherCore::InformDelegateDownloadProgressInDelegateThread( |
889 int64 current, int64 total) { | 886 int64 current, int64 total) { |
890 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 887 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); |
891 if (delegate_) | 888 if (delegate_) |
892 delegate_->OnURLFetchDownloadProgress(fetcher_, current, total); | 889 delegate_->OnURLFetchDownloadProgress(fetcher_, current, total); |
893 } | 890 } |
894 | 891 |
895 void URLFetcherCore::InformDelegateDownloadDataIfNecessary(int bytes_read) { | |
896 DCHECK(network_task_runner_->BelongsToCurrentThread()); | |
897 if (delegate_ && delegate_->ShouldSendDownloadData()) { | |
898 scoped_ptr<std::string> download_data( | |
899 new std::string(buffer_->data(), bytes_read)); | |
900 delegate_task_runner_->PostTask( | |
901 FROM_HERE, | |
902 base::Bind( | |
903 &URLFetcherCore::InformDelegateDownloadDataInDelegateThread, | |
904 this, base::Passed(&download_data))); | |
905 } | |
906 } | |
907 | |
908 void URLFetcherCore::InformDelegateDownloadDataInDelegateThread( | |
909 scoped_ptr<std::string> download_data) { | |
910 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | |
911 if (delegate_) | |
912 delegate_->OnURLFetchDownloadData(fetcher_, download_data.Pass()); | |
913 } | |
914 | |
915 } // namespace net | 892 } // namespace net |
OLD | NEW |