OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/common/net/url_fetcher.h" | 5 #include "content/common/net/url_fetcher.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 file_message_loop_proxy_(file_message_loop_proxy), | 325 file_message_loop_proxy_(file_message_loop_proxy), |
326 temp_file_handle_(base::kInvalidPlatformFileValue) { | 326 temp_file_handle_(base::kInvalidPlatformFileValue) { |
327 } | 327 } |
328 | 328 |
329 URLFetcher::Core::TempFileWriter::~TempFileWriter() { | 329 URLFetcher::Core::TempFileWriter::~TempFileWriter() { |
330 RemoveTempFile(); | 330 RemoveTempFile(); |
331 } | 331 } |
332 | 332 |
333 void URLFetcher::Core::TempFileWriter::CreateTempFile() { | 333 void URLFetcher::Core::TempFileWriter::CreateTempFile() { |
334 DCHECK(core_->io_message_loop_proxy_->BelongsToCurrentThread()); | 334 DCHECK(core_->io_message_loop_proxy_->BelongsToCurrentThread()); |
335 CHECK(file_message_loop_proxy_.get()); | 335 DCHECK(file_message_loop_proxy_.get()); |
336 base::FileUtilProxy::CreateTemporary( | 336 base::FileUtilProxy::CreateTemporary( |
337 file_message_loop_proxy_, | 337 file_message_loop_proxy_, |
338 0, // No additional file flags. | 338 0, // No additional file flags. |
339 base::Bind(&URLFetcher::Core::TempFileWriter::DidCreateTempFile, | 339 base::Bind(&URLFetcher::Core::TempFileWriter::DidCreateTempFile, |
340 weak_factory_.GetWeakPtr())); | 340 weak_factory_.GetWeakPtr())); |
341 } | 341 } |
342 | 342 |
343 void URLFetcher::Core::TempFileWriter::DidCreateTempFile( | 343 void URLFetcher::Core::TempFileWriter::DidCreateTempFile( |
344 base::PlatformFileError error_code, | 344 base::PlatformFileError error_code, |
345 base::PassPlatformFile file_handle, | 345 base::PassPlatformFile file_handle, |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 } | 541 } |
542 | 542 |
543 URLFetcher::Core::~Core() { | 543 URLFetcher::Core::~Core() { |
544 // |request_| should be NULL. If not, it's unsafe to delete it here since we | 544 // |request_| should be NULL. If not, it's unsafe to delete it here since we |
545 // may not be on the IO thread. | 545 // may not be on the IO thread. |
546 DCHECK(!request_.get()); | 546 DCHECK(!request_.get()); |
547 } | 547 } |
548 | 548 |
549 void URLFetcher::Core::Start() { | 549 void URLFetcher::Core::Start() { |
550 DCHECK(delegate_loop_proxy_); | 550 DCHECK(delegate_loop_proxy_); |
551 CHECK(request_context_getter_) << "We need an URLRequestContext!"; | 551 DCHECK(request_context_getter_) << "We need an URLRequestContext!"; |
552 if (io_message_loop_proxy_) { | 552 if (io_message_loop_proxy_) { |
553 DCHECK_EQ(io_message_loop_proxy_, | 553 DCHECK_EQ(io_message_loop_proxy_, |
554 request_context_getter_->GetIOMessageLoopProxy()); | 554 request_context_getter_->GetIOMessageLoopProxy()); |
555 } else { | 555 } else { |
556 io_message_loop_proxy_ = request_context_getter_->GetIOMessageLoopProxy(); | 556 io_message_loop_proxy_ = request_context_getter_->GetIOMessageLoopProxy(); |
557 } | 557 } |
558 CHECK(io_message_loop_proxy_.get()) << "We need an IO message loop proxy"; | 558 DCHECK(io_message_loop_proxy_.get()) << "We need an IO message loop proxy"; |
559 | 559 |
560 io_message_loop_proxy_->PostTask( | 560 io_message_loop_proxy_->PostTask( |
561 FROM_HERE, base::Bind(&Core::StartOnIOThread, this)); | 561 FROM_HERE, base::Bind(&Core::StartOnIOThread, this)); |
562 } | 562 } |
563 | 563 |
564 void URLFetcher::Core::StartOnIOThread() { | 564 void URLFetcher::Core::StartOnIOThread() { |
565 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); | 565 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
566 | 566 |
567 switch (response_destination_) { | 567 switch (response_destination_) { |
568 case STRING: | 568 case STRING: |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 DCHECK(request_.get()); | 627 DCHECK(request_.get()); |
628 DCHECK(!content.empty()); | 628 DCHECK(!content.empty()); |
629 request_->AppendChunkToUpload(content.data(), | 629 request_->AppendChunkToUpload(content.data(), |
630 static_cast<int>(content.length()), | 630 static_cast<int>(content.length()), |
631 is_last_chunk); | 631 is_last_chunk); |
632 } | 632 } |
633 | 633 |
634 void URLFetcher::Core::AppendChunkToUpload(const std::string& content, | 634 void URLFetcher::Core::AppendChunkToUpload(const std::string& content, |
635 bool is_last_chunk) { | 635 bool is_last_chunk) { |
636 DCHECK(delegate_loop_proxy_); | 636 DCHECK(delegate_loop_proxy_); |
637 CHECK(io_message_loop_proxy_.get()); | 637 DCHECK(io_message_loop_proxy_.get()); |
638 io_message_loop_proxy_->PostTask( | 638 io_message_loop_proxy_->PostTask( |
639 FROM_HERE, | 639 FROM_HERE, |
640 base::Bind(&Core::CompleteAddingUploadDataChunk, this, content, | 640 base::Bind(&Core::CompleteAddingUploadDataChunk, this, content, |
641 is_last_chunk)); | 641 is_last_chunk)); |
642 } | 642 } |
643 | 643 |
644 // Return true if the write was done and reading may continue. | 644 // Return true if the write was done and reading may continue. |
645 // Return false if the write is pending, and the next read will | 645 // Return false if the write is pending, and the next read will |
646 // be done later. | 646 // be done later. |
647 bool URLFetcher::Core::WriteBuffer(int num_bytes) { | 647 bool URLFetcher::Core::WriteBuffer(int num_bytes) { |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 | 763 |
764 void URLFetcher::Core::StartURLRequest() { | 764 void URLFetcher::Core::StartURLRequest() { |
765 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); | 765 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
766 | 766 |
767 if (was_cancelled_) { | 767 if (was_cancelled_) { |
768 // Since StartURLRequest() is posted as a *delayed* task, it may | 768 // Since StartURLRequest() is posted as a *delayed* task, it may |
769 // run after the URLFetcher was already stopped. | 769 // run after the URLFetcher was already stopped. |
770 return; | 770 return; |
771 } | 771 } |
772 | 772 |
773 CHECK(request_context_getter_); | 773 DCHECK(request_context_getter_); |
774 DCHECK(!request_.get()); | 774 DCHECK(!request_.get()); |
775 | 775 |
776 g_registry.Get().AddURLFetcherCore(this); | 776 g_registry.Get().AddURLFetcherCore(this); |
777 request_.reset(new net::URLRequest(original_url_, this)); | 777 request_.reset(new net::URLRequest(original_url_, this)); |
778 int flags = request_->load_flags() | load_flags_; | 778 int flags = request_->load_flags() | load_flags_; |
779 if (!g_interception_enabled) { | 779 if (!g_interception_enabled) { |
780 flags = flags | net::LOAD_DISABLE_INTERCEPT; | 780 flags = flags | net::LOAD_DISABLE_INTERCEPT; |
781 } | 781 } |
782 if (is_chunked_upload_) | 782 if (is_chunked_upload_) |
783 request_->EnableChunkedUpload(); | 783 request_->EnableChunkedUpload(); |
(...skipping 27 matching lines...) Expand all Loading... |
811 } | 811 } |
812 | 812 |
813 if (!extra_request_headers_.IsEmpty()) | 813 if (!extra_request_headers_.IsEmpty()) |
814 request_->SetExtraRequestHeaders(extra_request_headers_); | 814 request_->SetExtraRequestHeaders(extra_request_headers_); |
815 | 815 |
816 // There might be data left over from a previous request attempt. | 816 // There might be data left over from a previous request attempt. |
817 data_.clear(); | 817 data_.clear(); |
818 | 818 |
819 // If we are writing the response to a file, the only caller | 819 // If we are writing the response to a file, the only caller |
820 // of this function should have created it and not written yet. | 820 // of this function should have created it and not written yet. |
821 CHECK(!temp_file_writer_.get() || | 821 DCHECK(!temp_file_writer_.get() || |
822 temp_file_writer_->total_bytes_written() == 0); | 822 temp_file_writer_->total_bytes_written() == 0); |
823 | 823 |
824 request_->Start(); | 824 request_->Start(); |
825 } | 825 } |
826 | 826 |
827 void URLFetcher::Core::StartURLRequestWhenAppropriate() { | 827 void URLFetcher::Core::StartURLRequestWhenAppropriate() { |
828 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); | 828 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
829 | 829 |
830 if (was_cancelled_) | 830 if (was_cancelled_) |
831 return; | 831 return; |
832 | 832 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
867 DCHECK(delegate_loop_proxy_->BelongsToCurrentThread()); | 867 DCHECK(delegate_loop_proxy_->BelongsToCurrentThread()); |
868 | 868 |
869 // Save the status and backoff_delay so that delegates can read it. | 869 // Save the status and backoff_delay so that delegates can read it. |
870 if (delegate_) { | 870 if (delegate_) { |
871 backoff_delay_ = backoff_delay; | 871 backoff_delay_ = backoff_delay; |
872 InformDelegateFetchIsComplete(); | 872 InformDelegateFetchIsComplete(); |
873 } | 873 } |
874 } | 874 } |
875 | 875 |
876 void URLFetcher::Core::InformDelegateFetchIsComplete() { | 876 void URLFetcher::Core::InformDelegateFetchIsComplete() { |
877 CHECK(delegate_loop_proxy_->BelongsToCurrentThread()); | 877 DCHECK(delegate_loop_proxy_->BelongsToCurrentThread()); |
878 if (delegate_) { | 878 if (delegate_) { |
879 delegate_->OnURLFetchComplete(fetcher_); | 879 delegate_->OnURLFetchComplete(fetcher_); |
880 } | 880 } |
881 } | 881 } |
882 | 882 |
883 void URLFetcher::Core::NotifyMalformedContent() { | 883 void URLFetcher::Core::NotifyMalformedContent() { |
884 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); | 884 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
885 if (url_throttler_entry_ != NULL) { | 885 if (url_throttler_entry_ != NULL) { |
886 int status_code = response_code_; | 886 int status_code = response_code_; |
887 if (status_code == kInvalidHttpResponseCode) { | 887 if (status_code == kInvalidHttpResponseCode) { |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1075 | 1075 |
1076 bool URLFetcher::GetResponseAsString(std::string* out_response_string) const { | 1076 bool URLFetcher::GetResponseAsString(std::string* out_response_string) const { |
1077 if (core_->response_destination_ != STRING) | 1077 if (core_->response_destination_ != STRING) |
1078 return false; | 1078 return false; |
1079 | 1079 |
1080 *out_response_string = core_->data_; | 1080 *out_response_string = core_->data_; |
1081 return true; | 1081 return true; |
1082 } | 1082 } |
1083 | 1083 |
1084 const std::string& URLFetcher::GetResponseStringRef() const { | 1084 const std::string& URLFetcher::GetResponseStringRef() const { |
1085 CHECK(core_->response_destination_ == STRING); | 1085 DCHECK(core_->response_destination_ == STRING); |
1086 return core_->data_; | 1086 return core_->data_; |
1087 } | 1087 } |
1088 | 1088 |
1089 void URLFetcher::SetResponseDestinationForTesting( | 1089 void URLFetcher::SetResponseDestinationForTesting( |
1090 ResponseDestinationType value) { | 1090 ResponseDestinationType value) { |
1091 core_->response_destination_ = value; | 1091 core_->response_destination_ = value; |
1092 } | 1092 } |
1093 | 1093 |
1094 URLFetcher::ResponseDestinationType | 1094 URLFetcher::ResponseDestinationType |
1095 URLFetcher::GetResponseDestinationForTesting() const { | 1095 URLFetcher::GetResponseDestinationForTesting() const { |
(...skipping 22 matching lines...) Expand all Loading... |
1118 } | 1118 } |
1119 | 1119 |
1120 // static | 1120 // static |
1121 int URLFetcher::GetNumFetcherCores() { | 1121 int URLFetcher::GetNumFetcherCores() { |
1122 return Core::g_registry.Get().size(); | 1122 return Core::g_registry.Get().size(); |
1123 } | 1123 } |
1124 | 1124 |
1125 URLFetcher::Delegate* URLFetcher::delegate() const { | 1125 URLFetcher::Delegate* URLFetcher::delegate() const { |
1126 return core_->delegate(); | 1126 return core_->delegate(); |
1127 } | 1127 } |
OLD | NEW |