Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(454)

Side by Side Diff: chrome/common/net/url_fetcher.cc

Issue 6966038: Anti-DDoS enhancements: Log to net log, UMA stats, improved policy. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove NON_EXPORTED_BASE where not needed. Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "chrome/common/net/url_fetcher.h" 5 #include "chrome/common/net/url_fetcher.h"
6 6
7 #include <set> 7 #include <set>
8 8
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/file_path.h" 10 #include "base/file_path.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 // us. If our caller hasn't had time to fully construct us and take a 51 // us. If our caller hasn't had time to fully construct us and take a
52 // reference, the IO thread could interrupt things, run a task, Release() 52 // reference, the IO thread could interrupt things, run a task, Release()
53 // us, and destroy us, leaving the caller with an already-destroyed object 53 // us, and destroy us, leaving the caller with an already-destroyed object
54 // when construction finishes. 54 // when construction finishes.
55 void Start(); 55 void Start();
56 56
57 // Stops any in-progress load and ensures no callback will happen. It is 57 // Stops any in-progress load and ensures no callback will happen. It is
58 // safe to call this multiple times. 58 // safe to call this multiple times.
59 void Stop(); 59 void Stop();
60 60
61 // Reports that the received content was malformed. 61 // Reports that the received content was malformed (i.e. failed parsing
62 // or validation). This makes the throttling logic that does exponential
63 // back-off when servers are having problems treat the current request as
64 // a failure. Your call to this method will be ignored if your request is
65 // already considered a failure based on the HTTP response code or response
66 // headers.
62 void ReceivedContentWasMalformed(); 67 void ReceivedContentWasMalformed();
63 68
64 // Overridden from net::URLRequest::Delegate: 69 // Overridden from net::URLRequest::Delegate:
65 virtual void OnResponseStarted(net::URLRequest* request); 70 virtual void OnResponseStarted(net::URLRequest* request);
66 virtual void OnReadCompleted(net::URLRequest* request, int bytes_read); 71 virtual void OnReadCompleted(net::URLRequest* request, int bytes_read);
67 72
68 URLFetcher::Delegate* delegate() const { return delegate_; } 73 URLFetcher::Delegate* delegate() const { return delegate_; }
69 static void CancelAll(); 74 static void CancelAll();
70 75
71 private: 76 private:
(...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 status_ = status; 803 status_ = status;
799 804
800 // Checks the response from server. 805 // Checks the response from server.
801 if (response_code_ >= 500 || 806 if (response_code_ >= 500 ||
802 status.os_error() == net::ERR_TEMPORARILY_THROTTLED) { 807 status.os_error() == net::ERR_TEMPORARILY_THROTTLED) {
803 // When encountering a server error, we will send the request again 808 // When encountering a server error, we will send the request again
804 // after backoff time. 809 // after backoff time.
805 ++num_retries_; 810 ++num_retries_;
806 // Restarts the request if we still need to notify the delegate. 811 // Restarts the request if we still need to notify the delegate.
807 if (delegate_) { 812 if (delegate_) {
813 // Note that backoff_delay_ may be 0 because (a) the URLRequestThrottler
814 // code does not necessarily back off on the first error, and (b) it
815 // only backs off on some of the 5xx status codes.
808 fetcher_->backoff_delay_ = backoff_release_time_ - base::TimeTicks::Now(); 816 fetcher_->backoff_delay_ = backoff_release_time_ - base::TimeTicks::Now();
809 if (fetcher_->backoff_delay_ < base::TimeDelta()) 817 if (fetcher_->backoff_delay_ < base::TimeDelta())
810 fetcher_->backoff_delay_ = base::TimeDelta(); 818 fetcher_->backoff_delay_ = base::TimeDelta();
811 819
812 if (fetcher_->automatically_retry_on_5xx_ && 820 if (fetcher_->automatically_retry_on_5xx_ &&
813 num_retries_ <= fetcher_->max_retries()) { 821 num_retries_ <= fetcher_->max_retries()) {
814 io_message_loop_proxy_->PostTask( 822 io_message_loop_proxy_->PostTask(
815 FROM_HERE, 823 FROM_HERE,
816 NewRunnableMethod(this, &Core::StartURLRequestWhenAppropriate)); 824 NewRunnableMethod(this, &Core::StartURLRequestWhenAppropriate));
817 } else { 825 } else {
818 InformDelegateFetchIsComplete(); 826 InformDelegateFetchIsComplete();
819 } 827 }
820 } 828 }
821 } else { 829 } else {
822 if (delegate_) { 830 if (delegate_) {
823 fetcher_->backoff_delay_ = base::TimeDelta(); 831 fetcher_->backoff_delay_ = base::TimeDelta();
824 InformDelegateFetchIsComplete(); 832 InformDelegateFetchIsComplete();
825 } 833 }
826 } 834 }
827 } 835 }
828 836
829 void URLFetcher::Core::InformDelegateFetchIsComplete() { 837 void URLFetcher::Core::InformDelegateFetchIsComplete() {
830 delegate_->OnURLFetchComplete(fetcher_); 838 delegate_->OnURLFetchComplete(fetcher_);
831 } 839 }
832 840
833 void URLFetcher::Core::NotifyMalformedContent() { 841 void URLFetcher::Core::NotifyMalformedContent() {
834 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); 842 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
835 if (url_throttler_entry_ != NULL) 843 if (url_throttler_entry_ != NULL) {
836 url_throttler_entry_->ReceivedContentWasMalformed(); 844 int status_code = response_code_;
845 if (status_code == -1) {
yzshen1 2011/05/25 03:49:06 Might be better to use kInvalidHttpResponseCode.
Jói 2011/05/25 14:30:35 Done.
846 // The status code will generally be known by the time clients
847 // call the |ReceivedContentWasMalformed()| function (which ends up
848 // calling the current function) but if it's not, we need to assume
849 // the response was successful so that the total failure count
850 // used to calculate exponential back-off goes up.
851 status_code = 200;
852 }
853 url_throttler_entry_->ReceivedContentWasMalformed(status_code);
854 }
837 } 855 }
838 856
839 void URLFetcher::Core::ReleaseRequest() { 857 void URLFetcher::Core::ReleaseRequest() {
840 request_.reset(); 858 request_.reset();
841 g_registry.Get().RemoveURLFetcherCore(this); 859 g_registry.Get().RemoveURLFetcherCore(this);
842 } 860 }
843 861
844 base::TimeTicks URLFetcher::Core::GetBackoffReleaseTime() { 862 base::TimeTicks URLFetcher::Core::GetBackoffReleaseTime() {
845 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); 863 DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
846 DCHECK(original_url_throttler_entry_ != NULL); 864 DCHECK(original_url_throttler_entry_ != NULL);
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1015 } 1033 }
1016 1034
1017 // static 1035 // static
1018 int URLFetcher::GetNumFetcherCores() { 1036 int URLFetcher::GetNumFetcherCores() {
1019 return Core::g_registry.Get().size(); 1037 return Core::g_registry.Get().size();
1020 } 1038 }
1021 1039
1022 URLFetcher::Delegate* URLFetcher::delegate() const { 1040 URLFetcher::Delegate* URLFetcher::delegate() const {
1023 return core_->delegate(); 1041 return core_->delegate();
1024 } 1042 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698