| 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_impl.h" | 5 #include "content/common/net/url_fetcher_impl.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 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 file_message_loop_proxy_(file_message_loop_proxy), | 327 file_message_loop_proxy_(file_message_loop_proxy), |
| 328 temp_file_handle_(base::kInvalidPlatformFileValue) { | 328 temp_file_handle_(base::kInvalidPlatformFileValue) { |
| 329 } | 329 } |
| 330 | 330 |
| 331 URLFetcherImpl::Core::TempFileWriter::~TempFileWriter() { | 331 URLFetcherImpl::Core::TempFileWriter::~TempFileWriter() { |
| 332 RemoveTempFile(); | 332 RemoveTempFile(); |
| 333 } | 333 } |
| 334 | 334 |
| 335 void URLFetcherImpl::Core::TempFileWriter::CreateTempFile() { | 335 void URLFetcherImpl::Core::TempFileWriter::CreateTempFile() { |
| 336 DCHECK(core_->io_message_loop_proxy_->BelongsToCurrentThread()); | 336 DCHECK(core_->io_message_loop_proxy_->BelongsToCurrentThread()); |
| 337 DCHECK(file_message_loop_proxy_.get()); | 337 CHECK(file_message_loop_proxy_.get()); |
| 338 base::FileUtilProxy::CreateTemporary( | 338 base::FileUtilProxy::CreateTemporary( |
| 339 file_message_loop_proxy_, | 339 file_message_loop_proxy_, |
| 340 0, // No additional file flags. | 340 0, // No additional file flags. |
| 341 base::Bind(&URLFetcherImpl::Core::TempFileWriter::DidCreateTempFile, | 341 base::Bind(&URLFetcherImpl::Core::TempFileWriter::DidCreateTempFile, |
| 342 weak_factory_.GetWeakPtr())); | 342 weak_factory_.GetWeakPtr())); |
| 343 } | 343 } |
| 344 | 344 |
| 345 void URLFetcherImpl::Core::TempFileWriter::DidCreateTempFile( | 345 void URLFetcherImpl::Core::TempFileWriter::DidCreateTempFile( |
| 346 base::PlatformFileError error_code, | 346 base::PlatformFileError error_code, |
| 347 base::PassPlatformFile file_handle, | 347 base::PassPlatformFile file_handle, |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 } | 531 } |
| 532 | 532 |
| 533 URLFetcherImpl::Core::~Core() { | 533 URLFetcherImpl::Core::~Core() { |
| 534 // |request_| should be NULL. If not, it's unsafe to delete it here since we | 534 // |request_| should be NULL. If not, it's unsafe to delete it here since we |
| 535 // may not be on the IO thread. | 535 // may not be on the IO thread. |
| 536 DCHECK(!request_.get()); | 536 DCHECK(!request_.get()); |
| 537 } | 537 } |
| 538 | 538 |
| 539 void URLFetcherImpl::Core::Start() { | 539 void URLFetcherImpl::Core::Start() { |
| 540 DCHECK(delegate_loop_proxy_); | 540 DCHECK(delegate_loop_proxy_); |
| 541 DCHECK(request_context_getter_) << "We need an URLRequestContext!"; | 541 CHECK(request_context_getter_) << "We need an URLRequestContext!"; |
| 542 if (io_message_loop_proxy_) { | 542 if (io_message_loop_proxy_) { |
| 543 DCHECK_EQ(io_message_loop_proxy_, | 543 DCHECK_EQ(io_message_loop_proxy_, |
| 544 request_context_getter_->GetIOMessageLoopProxy()); | 544 request_context_getter_->GetIOMessageLoopProxy()); |
| 545 } else { | 545 } else { |
| 546 io_message_loop_proxy_ = request_context_getter_->GetIOMessageLoopProxy(); | 546 io_message_loop_proxy_ = request_context_getter_->GetIOMessageLoopProxy(); |
| 547 } | 547 } |
| 548 DCHECK(io_message_loop_proxy_.get()) << "We need an IO message loop proxy"; | 548 CHECK(io_message_loop_proxy_.get()) << "We need an IO message loop proxy"; |
| 549 | 549 |
| 550 io_message_loop_proxy_->PostTask( | 550 io_message_loop_proxy_->PostTask( |
| 551 FROM_HERE, base::Bind(&Core::StartOnIOThread, this)); | 551 FROM_HERE, base::Bind(&Core::StartOnIOThread, this)); |
| 552 } | 552 } |
| 553 | 553 |
| 554 void URLFetcherImpl::Core::StartOnIOThread() { | 554 void URLFetcherImpl::Core::StartOnIOThread() { |
| 555 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); | 555 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
| 556 | 556 |
| 557 switch (response_destination_) { | 557 switch (response_destination_) { |
| 558 case STRING: | 558 case STRING: |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 619 DCHECK(request_.get()); | 619 DCHECK(request_.get()); |
| 620 DCHECK(!content.empty()); | 620 DCHECK(!content.empty()); |
| 621 request_->AppendChunkToUpload(content.data(), | 621 request_->AppendChunkToUpload(content.data(), |
| 622 static_cast<int>(content.length()), | 622 static_cast<int>(content.length()), |
| 623 is_last_chunk); | 623 is_last_chunk); |
| 624 } | 624 } |
| 625 | 625 |
| 626 void URLFetcherImpl::Core::AppendChunkToUpload(const std::string& content, | 626 void URLFetcherImpl::Core::AppendChunkToUpload(const std::string& content, |
| 627 bool is_last_chunk) { | 627 bool is_last_chunk) { |
| 628 DCHECK(delegate_loop_proxy_); | 628 DCHECK(delegate_loop_proxy_); |
| 629 DCHECK(io_message_loop_proxy_.get()); | 629 CHECK(io_message_loop_proxy_.get()); |
| 630 io_message_loop_proxy_->PostTask( | 630 io_message_loop_proxy_->PostTask( |
| 631 FROM_HERE, | 631 FROM_HERE, |
| 632 base::Bind(&Core::CompleteAddingUploadDataChunk, this, content, | 632 base::Bind(&Core::CompleteAddingUploadDataChunk, this, content, |
| 633 is_last_chunk)); | 633 is_last_chunk)); |
| 634 } | 634 } |
| 635 | 635 |
| 636 // Return true if the write was done and reading may continue. | 636 // Return true if the write was done and reading may continue. |
| 637 // Return false if the write is pending, and the next read will | 637 // Return false if the write is pending, and the next read will |
| 638 // be done later. | 638 // be done later. |
| 639 bool URLFetcherImpl::Core::WriteBuffer(int num_bytes) { | 639 bool URLFetcherImpl::Core::WriteBuffer(int num_bytes) { |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 755 | 755 |
| 756 void URLFetcherImpl::Core::StartURLRequest() { | 756 void URLFetcherImpl::Core::StartURLRequest() { |
| 757 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); | 757 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
| 758 | 758 |
| 759 if (was_cancelled_) { | 759 if (was_cancelled_) { |
| 760 // Since StartURLRequest() is posted as a *delayed* task, it may | 760 // Since StartURLRequest() is posted as a *delayed* task, it may |
| 761 // run after the URLFetcher was already stopped. | 761 // run after the URLFetcher was already stopped. |
| 762 return; | 762 return; |
| 763 } | 763 } |
| 764 | 764 |
| 765 DCHECK(request_context_getter_); | 765 CHECK(request_context_getter_); |
| 766 DCHECK(!request_.get()); | 766 DCHECK(!request_.get()); |
| 767 | 767 |
| 768 g_registry.Get().AddURLFetcherCore(this); | 768 g_registry.Get().AddURLFetcherCore(this); |
| 769 request_.reset(new net::URLRequest(original_url_, this)); | 769 request_.reset(new net::URLRequest(original_url_, this)); |
| 770 int flags = request_->load_flags() | load_flags_; | 770 int flags = request_->load_flags() | load_flags_; |
| 771 if (!g_interception_enabled) { | 771 if (!g_interception_enabled) { |
| 772 flags = flags | net::LOAD_DISABLE_INTERCEPT; | 772 flags = flags | net::LOAD_DISABLE_INTERCEPT; |
| 773 } | 773 } |
| 774 if (is_chunked_upload_) | 774 if (is_chunked_upload_) |
| 775 request_->EnableChunkedUpload(); | 775 request_->EnableChunkedUpload(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 803 } | 803 } |
| 804 | 804 |
| 805 if (!extra_request_headers_.IsEmpty()) | 805 if (!extra_request_headers_.IsEmpty()) |
| 806 request_->SetExtraRequestHeaders(extra_request_headers_); | 806 request_->SetExtraRequestHeaders(extra_request_headers_); |
| 807 | 807 |
| 808 // There might be data left over from a previous request attempt. | 808 // There might be data left over from a previous request attempt. |
| 809 data_.clear(); | 809 data_.clear(); |
| 810 | 810 |
| 811 // If we are writing the response to a file, the only caller | 811 // If we are writing the response to a file, the only caller |
| 812 // of this function should have created it and not written yet. | 812 // of this function should have created it and not written yet. |
| 813 DCHECK(!temp_file_writer_.get() || | 813 CHECK(!temp_file_writer_.get() || |
| 814 temp_file_writer_->total_bytes_written() == 0); | 814 temp_file_writer_->total_bytes_written() == 0); |
| 815 | 815 |
| 816 request_->Start(); | 816 request_->Start(); |
| 817 } | 817 } |
| 818 | 818 |
| 819 void URLFetcherImpl::Core::StartURLRequestWhenAppropriate() { | 819 void URLFetcherImpl::Core::StartURLRequestWhenAppropriate() { |
| 820 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); | 820 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
| 821 | 821 |
| 822 if (was_cancelled_) | 822 if (was_cancelled_) |
| 823 return; | 823 return; |
| 824 | 824 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 DCHECK(delegate_loop_proxy_->BelongsToCurrentThread()); | 859 DCHECK(delegate_loop_proxy_->BelongsToCurrentThread()); |
| 860 | 860 |
| 861 // Save the status and backoff_delay so that delegates can read it. | 861 // Save the status and backoff_delay so that delegates can read it. |
| 862 if (delegate_) { | 862 if (delegate_) { |
| 863 backoff_delay_ = backoff_delay; | 863 backoff_delay_ = backoff_delay; |
| 864 InformDelegateFetchIsComplete(); | 864 InformDelegateFetchIsComplete(); |
| 865 } | 865 } |
| 866 } | 866 } |
| 867 | 867 |
| 868 void URLFetcherImpl::Core::InformDelegateFetchIsComplete() { | 868 void URLFetcherImpl::Core::InformDelegateFetchIsComplete() { |
| 869 DCHECK(delegate_loop_proxy_->BelongsToCurrentThread()); | 869 CHECK(delegate_loop_proxy_->BelongsToCurrentThread()); |
| 870 if (delegate_) { | 870 if (delegate_) { |
| 871 delegate_->OnURLFetchComplete(fetcher_); | 871 delegate_->OnURLFetchComplete(fetcher_); |
| 872 } | 872 } |
| 873 } | 873 } |
| 874 | 874 |
| 875 void URLFetcherImpl::Core::NotifyMalformedContent() { | 875 void URLFetcherImpl::Core::NotifyMalformedContent() { |
| 876 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); | 876 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
| 877 if (url_throttler_entry_ != NULL) { | 877 if (url_throttler_entry_ != NULL) { |
| 878 int status_code = response_code_; | 878 int status_code = response_code_; |
| 879 if (status_code == RESPONSE_CODE_INVALID) { | 879 if (status_code == RESPONSE_CODE_INVALID) { |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1105 | 1105 |
| 1106 // static | 1106 // static |
| 1107 content::URLFetcherFactory* URLFetcherImpl::factory() { | 1107 content::URLFetcherFactory* URLFetcherImpl::factory() { |
| 1108 return g_factory; | 1108 return g_factory; |
| 1109 } | 1109 } |
| 1110 | 1110 |
| 1111 // static | 1111 // static |
| 1112 void URLFetcherImpl::set_factory(content::URLFetcherFactory* factory) { | 1112 void URLFetcherImpl::set_factory(content::URLFetcherFactory* factory) { |
| 1113 g_factory = factory; | 1113 g_factory = factory; |
| 1114 } | 1114 } |
| OLD | NEW |