| 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/sequenced_task_runner.h" | 10 #include "base/sequenced_task_runner.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "net/url_request/url_request_context_getter.h" | 26 #include "net/url_request/url_request_context_getter.h" |
| 27 #include "net/url_request/url_request_throttler_manager.h" | 27 #include "net/url_request/url_request_throttler_manager.h" |
| 28 | 28 |
| 29 namespace { | 29 namespace { |
| 30 | 30 |
| 31 const int kBufferSize = 4096; | 31 const int kBufferSize = 4096; |
| 32 const int kUploadProgressTimerInterval = 100; | 32 const int kUploadProgressTimerInterval = 100; |
| 33 bool g_interception_enabled = false; | 33 bool g_interception_enabled = false; |
| 34 bool g_ignore_certificate_requests = false; | 34 bool g_ignore_certificate_requests = false; |
| 35 | 35 |
| 36 void EmptyCompletionCallback(int result) {} | 36 void EmptyCompletionCallback(int result) { |
| 37 } |
| 37 | 38 |
| 38 } // namespace | 39 } // namespace |
| 39 | 40 |
| 40 namespace net { | 41 namespace net { |
| 41 | 42 |
| 42 // URLFetcherCore::Registry --------------------------------------------------- | 43 // URLFetcherCore::Registry --------------------------------------------------- |
| 43 | 44 |
| 44 URLFetcherCore::Registry::Registry() {} | 45 URLFetcherCore::Registry::Registry() { |
| 45 URLFetcherCore::Registry::~Registry() {} | 46 } |
| 47 URLFetcherCore::Registry::~Registry() { |
| 48 } |
| 46 | 49 |
| 47 void URLFetcherCore::Registry::AddURLFetcherCore(URLFetcherCore* core) { | 50 void URLFetcherCore::Registry::AddURLFetcherCore(URLFetcherCore* core) { |
| 48 DCHECK(!ContainsKey(fetchers_, core)); | 51 DCHECK(!ContainsKey(fetchers_, core)); |
| 49 fetchers_.insert(core); | 52 fetchers_.insert(core); |
| 50 } | 53 } |
| 51 | 54 |
| 52 void URLFetcherCore::Registry::RemoveURLFetcherCore(URLFetcherCore* core) { | 55 void URLFetcherCore::Registry::RemoveURLFetcherCore(URLFetcherCore* core) { |
| 53 DCHECK(ContainsKey(fetchers_, core)); | 56 DCHECK(ContainsKey(fetchers_, core)); |
| 54 fetchers_.erase(core); | 57 fetchers_.erase(core); |
| 55 } | 58 } |
| 56 | 59 |
| 57 void URLFetcherCore::Registry::CancelAll() { | 60 void URLFetcherCore::Registry::CancelAll() { |
| 58 while (!fetchers_.empty()) | 61 while (!fetchers_.empty()) |
| 59 (*fetchers_.begin())->CancelURLRequest(ERR_ABORTED); | 62 (*fetchers_.begin())->CancelURLRequest(ERR_ABORTED); |
| 60 } | 63 } |
| 61 | 64 |
| 62 // URLFetcherCore ------------------------------------------------------------- | 65 // URLFetcherCore ------------------------------------------------------------- |
| 63 | 66 |
| 64 // static | 67 // static |
| 65 base::LazyInstance<URLFetcherCore::Registry> | 68 base::LazyInstance<URLFetcherCore::Registry> URLFetcherCore::g_registry = |
| 66 URLFetcherCore::g_registry = LAZY_INSTANCE_INITIALIZER; | 69 LAZY_INSTANCE_INITIALIZER; |
| 67 | 70 |
| 68 URLFetcherCore::URLFetcherCore(URLFetcher* fetcher, | 71 URLFetcherCore::URLFetcherCore(URLFetcher* fetcher, |
| 69 const GURL& original_url, | 72 const GURL& original_url, |
| 70 URLFetcher::RequestType request_type, | 73 URLFetcher::RequestType request_type, |
| 71 URLFetcherDelegate* d) | 74 URLFetcherDelegate* d) |
| 72 : fetcher_(fetcher), | 75 : fetcher_(fetcher), |
| 73 original_url_(original_url), | 76 original_url_(original_url), |
| 74 request_type_(request_type), | 77 request_type_(request_type), |
| 75 delegate_(d), | 78 delegate_(d), |
| 76 delegate_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 79 delegate_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 upload_content_type_ = upload_content_type; | 168 upload_content_type_ = upload_content_type; |
| 166 upload_file_path_ = file_path; | 169 upload_file_path_ = file_path; |
| 167 upload_range_offset_ = range_offset; | 170 upload_range_offset_ = range_offset; |
| 168 upload_range_length_ = range_length; | 171 upload_range_length_ = range_length; |
| 169 upload_file_task_runner_ = file_task_runner; | 172 upload_file_task_runner_ = file_task_runner; |
| 170 upload_content_set_ = true; | 173 upload_content_set_ = true; |
| 171 } | 174 } |
| 172 | 175 |
| 173 void URLFetcherCore::SetChunkedUpload(const std::string& content_type) { | 176 void URLFetcherCore::SetChunkedUpload(const std::string& content_type) { |
| 174 DCHECK(is_chunked_upload_ || | 177 DCHECK(is_chunked_upload_ || |
| 175 (upload_content_type_.empty() && | 178 (upload_content_type_.empty() && upload_content_.empty())); |
| 176 upload_content_.empty())); | |
| 177 | 179 |
| 178 // Empty |content_type| is not allowed here, because it is impossible | 180 // Empty |content_type| is not allowed here, because it is impossible |
| 179 // to ensure non-empty upload content as it is not yet supplied. | 181 // to ensure non-empty upload content as it is not yet supplied. |
| 180 DCHECK(!content_type.empty()); | 182 DCHECK(!content_type.empty()); |
| 181 | 183 |
| 182 upload_content_type_ = content_type; | 184 upload_content_type_ = content_type; |
| 183 upload_content_.clear(); | 185 upload_content_.clear(); |
| 184 is_chunked_upload_ = true; | 186 is_chunked_upload_ = true; |
| 185 } | 187 } |
| 186 | 188 |
| 187 void URLFetcherCore::AppendChunkToUpload(const std::string& content, | 189 void URLFetcherCore::AppendChunkToUpload(const std::string& content, |
| 188 bool is_last_chunk) { | 190 bool is_last_chunk) { |
| 189 DCHECK(delegate_task_runner_.get()); | 191 DCHECK(delegate_task_runner_.get()); |
| 190 DCHECK(network_task_runner_.get()); | 192 DCHECK(network_task_runner_.get()); |
| 191 network_task_runner_->PostTask( | 193 network_task_runner_->PostTask( |
| 192 FROM_HERE, | 194 FROM_HERE, |
| 193 base::Bind(&URLFetcherCore::CompleteAddingUploadDataChunk, this, content, | 195 base::Bind(&URLFetcherCore::CompleteAddingUploadDataChunk, |
| 196 this, |
| 197 content, |
| 194 is_last_chunk)); | 198 is_last_chunk)); |
| 195 } | 199 } |
| 196 | 200 |
| 197 void URLFetcherCore::SetLoadFlags(int load_flags) { | 201 void URLFetcherCore::SetLoadFlags(int load_flags) { |
| 198 load_flags_ = load_flags; | 202 load_flags_ = load_flags; |
| 199 } | 203 } |
| 200 | 204 |
| 201 int URLFetcherCore::GetLoadFlags() const { | 205 int URLFetcherCore::GetLoadFlags() const { |
| 202 return load_flags_; | 206 return load_flags_; |
| 203 } | 207 } |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 DCHECK_EQ(request, request_.get()); | 409 DCHECK_EQ(request, request_.get()); |
| 406 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 410 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 407 | 411 |
| 408 if (g_ignore_certificate_requests) { | 412 if (g_ignore_certificate_requests) { |
| 409 request->ContinueWithCertificate(NULL); | 413 request->ContinueWithCertificate(NULL); |
| 410 } else { | 414 } else { |
| 411 request->Cancel(); | 415 request->Cancel(); |
| 412 } | 416 } |
| 413 } | 417 } |
| 414 | 418 |
| 415 void URLFetcherCore::OnReadCompleted(URLRequest* request, | 419 void URLFetcherCore::OnReadCompleted(URLRequest* request, int bytes_read) { |
| 416 int bytes_read) { | |
| 417 DCHECK(request == request_); | 420 DCHECK(request == request_); |
| 418 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 421 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 419 | 422 |
| 420 if (!stopped_on_redirect_) | 423 if (!stopped_on_redirect_) |
| 421 url_ = request->url(); | 424 url_ = request->url(); |
| 422 URLRequestThrottlerManager* throttler_manager = | 425 URLRequestThrottlerManager* throttler_manager = |
| 423 request->context()->throttler_manager(); | 426 request->context()->throttler_manager(); |
| 424 if (throttler_manager) { | 427 if (throttler_manager) { |
| 425 url_throttler_entry_ = throttler_manager->RegisterRequestUrl(url_); | 428 url_throttler_entry_ = throttler_manager->RegisterRequestUrl(url_); |
| 426 } | 429 } |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 request_->set_stack_trace(stack_trace_); | 514 request_->set_stack_trace(stack_trace_); |
| 512 int flags = request_->load_flags() | load_flags_; | 515 int flags = request_->load_flags() | load_flags_; |
| 513 if (!g_interception_enabled) | 516 if (!g_interception_enabled) |
| 514 flags = flags | LOAD_DISABLE_INTERCEPT; | 517 flags = flags | LOAD_DISABLE_INTERCEPT; |
| 515 | 518 |
| 516 if (is_chunked_upload_) | 519 if (is_chunked_upload_) |
| 517 request_->EnableChunkedUpload(); | 520 request_->EnableChunkedUpload(); |
| 518 request_->SetLoadFlags(flags); | 521 request_->SetLoadFlags(flags); |
| 519 request_->SetReferrer(referrer_); | 522 request_->SetReferrer(referrer_); |
| 520 request_->set_referrer_policy(referrer_policy_); | 523 request_->set_referrer_policy(referrer_policy_); |
| 521 request_->set_first_party_for_cookies(first_party_for_cookies_.is_empty() ? | 524 request_->set_first_party_for_cookies(first_party_for_cookies_.is_empty() |
| 522 original_url_ : first_party_for_cookies_); | 525 ? original_url_ |
| 526 : first_party_for_cookies_); |
| 523 if (url_request_data_key_ && !url_request_create_data_callback_.is_null()) { | 527 if (url_request_data_key_ && !url_request_create_data_callback_.is_null()) { |
| 524 request_->SetUserData(url_request_data_key_, | 528 request_->SetUserData(url_request_data_key_, |
| 525 url_request_create_data_callback_.Run()); | 529 url_request_create_data_callback_.Run()); |
| 526 } | 530 } |
| 527 | 531 |
| 528 switch (request_type_) { | 532 switch (request_type_) { |
| 529 case URLFetcher::GET: | 533 case URLFetcher::GET: |
| 530 break; | 534 break; |
| 531 | 535 |
| 532 case URLFetcher::POST: | 536 case URLFetcher::POST: |
| 533 case URLFetcher::PUT: | 537 case URLFetcher::PUT: |
| 534 case URLFetcher::PATCH: | 538 case URLFetcher::PATCH: |
| 535 // Upload content must be set. | 539 // Upload content must be set. |
| 536 DCHECK(is_chunked_upload_ || upload_content_set_); | 540 DCHECK(is_chunked_upload_ || upload_content_set_); |
| 537 | 541 |
| 538 request_->set_method( | 542 request_->set_method(request_type_ == URLFetcher::POST |
| 539 request_type_ == URLFetcher::POST ? "POST" : | 543 ? "POST" |
| 540 request_type_ == URLFetcher::PUT ? "PUT" : "PATCH"); | 544 : request_type_ == URLFetcher::PUT ? "PUT" |
| 545 : "PATCH"); |
| 541 if (!upload_content_type_.empty()) { | 546 if (!upload_content_type_.empty()) { |
| 542 extra_request_headers_.SetHeader(HttpRequestHeaders::kContentType, | 547 extra_request_headers_.SetHeader(HttpRequestHeaders::kContentType, |
| 543 upload_content_type_); | 548 upload_content_type_); |
| 544 } | 549 } |
| 545 if (!upload_content_.empty()) { | 550 if (!upload_content_.empty()) { |
| 546 scoped_ptr<UploadElementReader> reader(new UploadBytesElementReader( | 551 scoped_ptr<UploadElementReader> reader(new UploadBytesElementReader( |
| 547 upload_content_.data(), upload_content_.size())); | 552 upload_content_.data(), upload_content_.size())); |
| 548 request_->set_upload(make_scoped_ptr( | 553 request_->set_upload(make_scoped_ptr( |
| 549 UploadDataStream::CreateWithReader(reader.Pass(), 0))); | 554 UploadDataStream::CreateWithReader(reader.Pass(), 0))); |
| 550 } else if (!upload_file_path_.empty()) { | 555 } else if (!upload_file_path_.empty()) { |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 } | 623 } |
| 619 if (original_url_throttler_entry_.get() != NULL) { | 624 if (original_url_throttler_entry_.get() != NULL) { |
| 620 delay = original_url_throttler_entry_->ReserveSendingTimeForNextRequest( | 625 delay = original_url_throttler_entry_->ReserveSendingTimeForNextRequest( |
| 621 GetBackoffReleaseTime()); | 626 GetBackoffReleaseTime()); |
| 622 } | 627 } |
| 623 | 628 |
| 624 if (delay == 0) { | 629 if (delay == 0) { |
| 625 StartURLRequest(); | 630 StartURLRequest(); |
| 626 } else { | 631 } else { |
| 627 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | 632 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| 628 FROM_HERE, base::Bind(&URLFetcherCore::StartURLRequest, this), | 633 FROM_HERE, |
| 634 base::Bind(&URLFetcherCore::StartURLRequest, this), |
| 629 base::TimeDelta::FromMilliseconds(delay)); | 635 base::TimeDelta::FromMilliseconds(delay)); |
| 630 } | 636 } |
| 631 } | 637 } |
| 632 | 638 |
| 633 void URLFetcherCore::CancelURLRequest(int error) { | 639 void URLFetcherCore::CancelURLRequest(int error) { |
| 634 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 640 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 635 | 641 |
| 636 if (request_.get()) { | 642 if (request_.get()) { |
| 637 request_->CancelWithError(error); | 643 request_->CancelWithError(error); |
| 638 ReleaseRequest(); | 644 ReleaseRequest(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 651 // references to URLFetcher::Core at this point so it may take a while to | 657 // references to URLFetcher::Core at this point so it may take a while to |
| 652 // delete the object, but we cannot delay the destruction of the request | 658 // delete the object, but we cannot delay the destruction of the request |
| 653 // context. | 659 // context. |
| 654 request_context_getter_ = NULL; | 660 request_context_getter_ = NULL; |
| 655 first_party_for_cookies_ = GURL(); | 661 first_party_for_cookies_ = GURL(); |
| 656 url_request_data_key_ = NULL; | 662 url_request_data_key_ = NULL; |
| 657 url_request_create_data_callback_.Reset(); | 663 url_request_create_data_callback_.Reset(); |
| 658 was_cancelled_ = true; | 664 was_cancelled_ = true; |
| 659 } | 665 } |
| 660 | 666 |
| 661 void URLFetcherCore::OnCompletedURLRequest( | 667 void URLFetcherCore::OnCompletedURLRequest(base::TimeDelta backoff_delay) { |
| 662 base::TimeDelta backoff_delay) { | |
| 663 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 668 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); |
| 664 | 669 |
| 665 // Save the status and backoff_delay so that delegates can read it. | 670 // Save the status and backoff_delay so that delegates can read it. |
| 666 if (delegate_) { | 671 if (delegate_) { |
| 667 backoff_delay_ = backoff_delay; | 672 backoff_delay_ = backoff_delay; |
| 668 InformDelegateFetchIsComplete(); | 673 InformDelegateFetchIsComplete(); |
| 669 } | 674 } |
| 670 } | 675 } |
| 671 | 676 |
| 672 void URLFetcherCore::InformDelegateFetchIsComplete() { | 677 void URLFetcherCore::InformDelegateFetchIsComplete() { |
| (...skipping 28 matching lines...) Expand all Loading... |
| 701 } | 706 } |
| 702 // If the file was successfully closed, then the URL request is complete. | 707 // If the file was successfully closed, then the URL request is complete. |
| 703 RetryOrCompleteUrlFetch(); | 708 RetryOrCompleteUrlFetch(); |
| 704 } | 709 } |
| 705 | 710 |
| 706 void URLFetcherCore::RetryOrCompleteUrlFetch() { | 711 void URLFetcherCore::RetryOrCompleteUrlFetch() { |
| 707 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 712 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 708 base::TimeDelta backoff_delay; | 713 base::TimeDelta backoff_delay; |
| 709 | 714 |
| 710 // Checks the response from server. | 715 // Checks the response from server. |
| 711 if (response_code_ >= 500 || | 716 if (response_code_ >= 500 || status_.error() == ERR_TEMPORARILY_THROTTLED) { |
| 712 status_.error() == ERR_TEMPORARILY_THROTTLED) { | |
| 713 // When encountering a server error, we will send the request again | 717 // When encountering a server error, we will send the request again |
| 714 // after backoff time. | 718 // after backoff time. |
| 715 ++num_retries_on_5xx_; | 719 ++num_retries_on_5xx_; |
| 716 | 720 |
| 717 // Note that backoff_delay may be 0 because (a) the | 721 // Note that backoff_delay may be 0 because (a) the |
| 718 // URLRequestThrottlerManager and related code does not | 722 // URLRequestThrottlerManager and related code does not |
| 719 // necessarily back off on the first error, (b) it only backs off | 723 // necessarily back off on the first error, (b) it only backs off |
| 720 // on some of the 5xx status codes, (c) not all URLRequestContexts | 724 // on some of the 5xx status codes, (c) not all URLRequestContexts |
| 721 // have a throttler manager. | 725 // have a throttler manager. |
| 722 base::TimeTicks backoff_release_time = GetBackoffReleaseTime(); | 726 base::TimeTicks backoff_release_time = GetBackoffReleaseTime(); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 770 if (original_url_throttler_entry_.get()) { | 774 if (original_url_throttler_entry_.get()) { |
| 771 base::TimeTicks original_url_backoff = | 775 base::TimeTicks original_url_backoff = |
| 772 original_url_throttler_entry_->GetExponentialBackoffReleaseTime(); | 776 original_url_throttler_entry_->GetExponentialBackoffReleaseTime(); |
| 773 base::TimeTicks destination_url_backoff; | 777 base::TimeTicks destination_url_backoff; |
| 774 if (url_throttler_entry_.get() != NULL && | 778 if (url_throttler_entry_.get() != NULL && |
| 775 original_url_throttler_entry_.get() != url_throttler_entry_.get()) { | 779 original_url_throttler_entry_.get() != url_throttler_entry_.get()) { |
| 776 destination_url_backoff = | 780 destination_url_backoff = |
| 777 url_throttler_entry_->GetExponentialBackoffReleaseTime(); | 781 url_throttler_entry_->GetExponentialBackoffReleaseTime(); |
| 778 } | 782 } |
| 779 | 783 |
| 780 return original_url_backoff > destination_url_backoff ? | 784 return original_url_backoff > destination_url_backoff |
| 781 original_url_backoff : destination_url_backoff; | 785 ? original_url_backoff |
| 786 : destination_url_backoff; |
| 782 } else { | 787 } else { |
| 783 return base::TimeTicks(); | 788 return base::TimeTicks(); |
| 784 } | 789 } |
| 785 } | 790 } |
| 786 | 791 |
| 787 void URLFetcherCore::CompleteAddingUploadDataChunk( | 792 void URLFetcherCore::CompleteAddingUploadDataChunk(const std::string& content, |
| 788 const std::string& content, bool is_last_chunk) { | 793 bool is_last_chunk) { |
| 789 if (was_cancelled_) { | 794 if (was_cancelled_) { |
| 790 // Since CompleteAddingUploadDataChunk() is posted as a *delayed* task, it | 795 // Since CompleteAddingUploadDataChunk() is posted as a *delayed* task, it |
| 791 // may run after the URLFetcher was already stopped. | 796 // may run after the URLFetcher was already stopped. |
| 792 return; | 797 return; |
| 793 } | 798 } |
| 794 DCHECK(is_chunked_upload_); | 799 DCHECK(is_chunked_upload_); |
| 795 DCHECK(request_.get()); | 800 DCHECK(request_.get()); |
| 796 DCHECK(!content.empty()); | 801 DCHECK(!content.empty()); |
| 797 request_->AppendChunkToUpload(content.data(), | 802 request_->AppendChunkToUpload( |
| 798 static_cast<int>(content.length()), | 803 content.data(), static_cast<int>(content.length()), is_last_chunk); |
| 799 is_last_chunk); | |
| 800 } | 804 } |
| 801 | 805 |
| 802 int URLFetcherCore::WriteBuffer(scoped_refptr<DrainableIOBuffer> data) { | 806 int URLFetcherCore::WriteBuffer(scoped_refptr<DrainableIOBuffer> data) { |
| 803 while (data->BytesRemaining() > 0) { | 807 while (data->BytesRemaining() > 0) { |
| 804 const int result = response_writer_->Write( | 808 const int result = response_writer_->Write( |
| 805 data.get(), | 809 data.get(), |
| 806 data->BytesRemaining(), | 810 data->BytesRemaining(), |
| 807 base::Bind(&URLFetcherCore::DidWriteBuffer, this, data)); | 811 base::Bind(&URLFetcherCore::DidWriteBuffer, this, data)); |
| 808 if (result < 0) { | 812 if (result < 0) { |
| 809 if (result != ERR_IO_PENDING) | 813 if (result != ERR_IO_PENDING) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 837 if (request_.get()) | 841 if (request_.get()) |
| 838 ReadResponse(); | 842 ReadResponse(); |
| 839 } | 843 } |
| 840 | 844 |
| 841 void URLFetcherCore::ReadResponse() { | 845 void URLFetcherCore::ReadResponse() { |
| 842 // Some servers may treat HEAD requests as GET requests. To free up the | 846 // Some servers may treat HEAD requests as GET requests. To free up the |
| 843 // network connection as soon as possible, signal that the request has | 847 // network connection as soon as possible, signal that the request has |
| 844 // completed immediately, without trying to read any data back (all we care | 848 // completed immediately, without trying to read any data back (all we care |
| 845 // about is the response code and headers, which we already have). | 849 // about is the response code and headers, which we already have). |
| 846 int bytes_read = 0; | 850 int bytes_read = 0; |
| 847 if (request_->status().is_success() && | 851 if (request_->status().is_success() && (request_type_ != URLFetcher::HEAD)) |
| 848 (request_type_ != URLFetcher::HEAD)) | |
| 849 request_->Read(buffer_.get(), kBufferSize, &bytes_read); | 852 request_->Read(buffer_.get(), kBufferSize, &bytes_read); |
| 850 OnReadCompleted(request_.get(), bytes_read); | 853 OnReadCompleted(request_.get(), bytes_read); |
| 851 } | 854 } |
| 852 | 855 |
| 853 void URLFetcherCore::InformDelegateUploadProgress() { | 856 void URLFetcherCore::InformDelegateUploadProgress() { |
| 854 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 857 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 855 if (request_.get()) { | 858 if (request_.get()) { |
| 856 int64 current = request_->GetUploadProgress().position(); | 859 int64 current = request_->GetUploadProgress().position(); |
| 857 if (current_upload_bytes_ != current) { | 860 if (current_upload_bytes_ != current) { |
| 858 current_upload_bytes_ = current; | 861 current_upload_bytes_ = current; |
| 859 int64 total = -1; | 862 int64 total = -1; |
| 860 if (!is_chunked_upload_) { | 863 if (!is_chunked_upload_) { |
| 861 total = static_cast<int64>(request_->GetUploadProgress().size()); | 864 total = static_cast<int64>(request_->GetUploadProgress().size()); |
| 862 // Total may be zero if the UploadDataStream::Init has not been called | 865 // Total may be zero if the UploadDataStream::Init has not been called |
| 863 // yet. Don't send the upload progress until the size is initialized. | 866 // yet. Don't send the upload progress until the size is initialized. |
| 864 if (!total) | 867 if (!total) |
| 865 return; | 868 return; |
| 866 } | 869 } |
| 867 delegate_task_runner_->PostTask( | 870 delegate_task_runner_->PostTask( |
| 868 FROM_HERE, | 871 FROM_HERE, |
| 869 base::Bind( | 872 base::Bind( |
| 870 &URLFetcherCore::InformDelegateUploadProgressInDelegateThread, | 873 &URLFetcherCore::InformDelegateUploadProgressInDelegateThread, |
| 871 this, current, total)); | 874 this, |
| 875 current, |
| 876 total)); |
| 872 } | 877 } |
| 873 } | 878 } |
| 874 } | 879 } |
| 875 | 880 |
| 876 void URLFetcherCore::InformDelegateUploadProgressInDelegateThread( | 881 void URLFetcherCore::InformDelegateUploadProgressInDelegateThread(int64 current, |
| 877 int64 current, int64 total) { | 882 int64 total) { |
| 878 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 883 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); |
| 879 if (delegate_) | 884 if (delegate_) |
| 880 delegate_->OnURLFetchUploadProgress(fetcher_, current, total); | 885 delegate_->OnURLFetchUploadProgress(fetcher_, current, total); |
| 881 } | 886 } |
| 882 | 887 |
| 883 void URLFetcherCore::InformDelegateDownloadProgress() { | 888 void URLFetcherCore::InformDelegateDownloadProgress() { |
| 884 DCHECK(network_task_runner_->BelongsToCurrentThread()); | 889 DCHECK(network_task_runner_->BelongsToCurrentThread()); |
| 885 delegate_task_runner_->PostTask( | 890 delegate_task_runner_->PostTask( |
| 886 FROM_HERE, | 891 FROM_HERE, |
| 887 base::Bind( | 892 base::Bind( |
| 888 &URLFetcherCore::InformDelegateDownloadProgressInDelegateThread, | 893 &URLFetcherCore::InformDelegateDownloadProgressInDelegateThread, |
| 889 this, current_response_bytes_, total_response_bytes_)); | 894 this, |
| 895 current_response_bytes_, |
| 896 total_response_bytes_)); |
| 890 } | 897 } |
| 891 | 898 |
| 892 void URLFetcherCore::InformDelegateDownloadProgressInDelegateThread( | 899 void URLFetcherCore::InformDelegateDownloadProgressInDelegateThread( |
| 893 int64 current, int64 total) { | 900 int64 current, |
| 901 int64 total) { |
| 894 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); | 902 DCHECK(delegate_task_runner_->BelongsToCurrentThread()); |
| 895 if (delegate_) | 903 if (delegate_) |
| 896 delegate_->OnURLFetchDownloadProgress(fetcher_, current, total); | 904 delegate_->OnURLFetchDownloadProgress(fetcher_, current, total); |
| 897 } | 905 } |
| 898 | 906 |
| 899 } // namespace net | 907 } // namespace net |
| OLD | NEW |