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 #ifndef NET_URL_REQUEST_URL_FETCHER_CORE_H_ | 5 #ifndef NET_URL_REQUEST_URL_FETCHER_CORE_H_ |
6 #define NET_URL_REQUEST_URL_FETCHER_CORE_H_ | 6 #define NET_URL_REQUEST_URL_FETCHER_CORE_H_ |
7 | 7 |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
12 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
13 #include "base/debug/stack_trace.h" | 13 #include "base/debug/stack_trace.h" |
14 #include "base/file_path.h" | 14 #include "base/file_path.h" |
15 #include "base/lazy_instance.h" | 15 #include "base/lazy_instance.h" |
16 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
17 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/scoped_ptr.h" |
18 #include "base/memory/weak_ptr.h" | 18 #include "base/memory/weak_ptr.h" |
19 #include "base/platform_file.h" | 19 #include "base/platform_file.h" |
20 #include "base/timer.h" | 20 #include "base/timer.h" |
21 #include "googleurl/src/gurl.h" | 21 #include "googleurl/src/gurl.h" |
22 #include "net/base/host_port_pair.h" | 22 #include "net/base/host_port_pair.h" |
23 #include "net/base/network_change_notifier.h" | |
23 #include "net/http/http_request_headers.h" | 24 #include "net/http/http_request_headers.h" |
24 #include "net/url_request/url_fetcher.h" | 25 #include "net/url_request/url_fetcher.h" |
25 #include "net/url_request/url_request.h" | 26 #include "net/url_request/url_request.h" |
26 #include "net/url_request/url_request_status.h" | 27 #include "net/url_request/url_request_status.h" |
27 | 28 |
28 namespace base { | 29 namespace base { |
29 class SingleThreadTaskRunner; | 30 class SingleThreadTaskRunner; |
30 } // namespace base | 31 } // namespace base |
31 | 32 |
32 namespace net { | 33 namespace net { |
33 class HttpResponseHeaders; | 34 class HttpResponseHeaders; |
34 class IOBuffer; | 35 class IOBuffer; |
35 class URLFetcherDelegate; | 36 class URLFetcherDelegate; |
36 class URLRequestContextGetter; | 37 class URLRequestContextGetter; |
37 class URLRequestThrottlerEntryInterface; | 38 class URLRequestThrottlerEntryInterface; |
38 | 39 |
39 class URLFetcherCore | 40 class URLFetcherCore |
40 : public base::RefCountedThreadSafe<URLFetcherCore>, | 41 : public base::RefCountedThreadSafe<URLFetcherCore>, |
41 public URLRequest::Delegate { | 42 public URLRequest::Delegate, |
43 public NetworkChangeNotifier::ConnectionTypeObserver { | |
42 public: | 44 public: |
43 URLFetcherCore(URLFetcher* fetcher, | 45 URLFetcherCore(URLFetcher* fetcher, |
44 const GURL& original_url, | 46 const GURL& original_url, |
45 URLFetcher::RequestType request_type, | 47 URLFetcher::RequestType request_type, |
46 URLFetcherDelegate* d); | 48 URLFetcherDelegate* d); |
47 | 49 |
48 // Starts the load. It's important that this not happen in the constructor | 50 // Starts the load. It's important that this not happen in the constructor |
49 // because it causes the IO thread to begin AddRef()ing and Release()ing | 51 // because it causes the IO thread to begin AddRef()ing and Release()ing |
50 // us. If our caller hasn't had time to fully construct us and take a | 52 // us. If our caller hasn't had time to fully construct us and take a |
51 // reference, the IO thread could interrupt things, run a task, Release() | 53 // reference, the IO thread could interrupt things, run a task, Release() |
(...skipping 30 matching lines...) Expand all Loading... | |
82 // Set the key and data callback that is used when setting the user | 84 // Set the key and data callback that is used when setting the user |
83 // data on any URLRequest objects this object creates. | 85 // data on any URLRequest objects this object creates. |
84 void SetURLRequestUserData( | 86 void SetURLRequestUserData( |
85 const void* key, | 87 const void* key, |
86 const URLFetcher::CreateDataCallback& create_data_callback); | 88 const URLFetcher::CreateDataCallback& create_data_callback); |
87 void SetStopOnRedirect(bool stop_on_redirect); | 89 void SetStopOnRedirect(bool stop_on_redirect); |
88 void SetAutomaticallyRetryOn5xx(bool retry); | 90 void SetAutomaticallyRetryOn5xx(bool retry); |
89 void SetMaxRetries(int max_retries); | 91 void SetMaxRetries(int max_retries); |
90 int GetMaxRetries() const; | 92 int GetMaxRetries() const; |
91 base::TimeDelta GetBackoffDelay() const; | 93 base::TimeDelta GetBackoffDelay() const; |
94 void SetAutomaticallyRetryOnNetworkChanges(int max_retries); | |
92 void SaveResponseToFileAtPath( | 95 void SaveResponseToFileAtPath( |
93 const FilePath& file_path, | 96 const FilePath& file_path, |
94 scoped_refptr<base::TaskRunner> file_task_runner); | 97 scoped_refptr<base::TaskRunner> file_task_runner); |
95 void SaveResponseToTemporaryFile( | 98 void SaveResponseToTemporaryFile( |
96 scoped_refptr<base::TaskRunner> file_task_runner); | 99 scoped_refptr<base::TaskRunner> file_task_runner); |
97 HttpResponseHeaders* GetResponseHeaders() const; | 100 HttpResponseHeaders* GetResponseHeaders() const; |
98 HostPortPair GetSocketAddress() const; | 101 HostPortPair GetSocketAddress() const; |
99 bool WasFetchedViaProxy() const; | 102 bool WasFetchedViaProxy() const; |
100 const GURL& GetOriginalURL() const; | 103 const GURL& GetOriginalURL() const; |
101 const GURL& GetURL() const; | 104 const GURL& GetURL() const; |
(...skipping 13 matching lines...) Expand all Loading... | |
115 FilePath* out_response_path); | 118 FilePath* out_response_path); |
116 | 119 |
117 // Overridden from URLRequest::Delegate: | 120 // Overridden from URLRequest::Delegate: |
118 virtual void OnReceivedRedirect(URLRequest* request, | 121 virtual void OnReceivedRedirect(URLRequest* request, |
119 const GURL& new_url, | 122 const GURL& new_url, |
120 bool* defer_redirect) OVERRIDE; | 123 bool* defer_redirect) OVERRIDE; |
121 virtual void OnResponseStarted(URLRequest* request) OVERRIDE; | 124 virtual void OnResponseStarted(URLRequest* request) OVERRIDE; |
122 virtual void OnReadCompleted(URLRequest* request, | 125 virtual void OnReadCompleted(URLRequest* request, |
123 int bytes_read) OVERRIDE; | 126 int bytes_read) OVERRIDE; |
124 | 127 |
128 // Overridden from NetworkChangeNotifier::ConnectionTypeObserver: | |
129 virtual void OnConnectionTypeChanged( | |
130 NetworkChangeNotifier::ConnectionType type) OVERRIDE; | |
131 | |
125 URLFetcherDelegate* delegate() const { return delegate_; } | 132 URLFetcherDelegate* delegate() const { return delegate_; } |
126 static void CancelAll(); | 133 static void CancelAll(); |
127 static int GetNumFetcherCores(); | 134 static int GetNumFetcherCores(); |
128 static void SetEnableInterceptionForTests(bool enabled); | 135 static void SetEnableInterceptionForTests(bool enabled); |
129 | 136 |
130 private: | 137 private: |
131 friend class base::RefCountedThreadSafe<URLFetcherCore>; | 138 friend class base::RefCountedThreadSafe<URLFetcherCore>; |
132 | 139 |
133 // How should the response be stored? | 140 // How should the response be stored? |
134 enum ResponseDestinationType { | 141 enum ResponseDestinationType { |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
378 // use this to ensure that |url_| is set to the redirect destination rather | 385 // use this to ensure that |url_| is set to the redirect destination rather |
379 // than the originally-fetched URL. | 386 // than the originally-fetched URL. |
380 bool stopped_on_redirect_; | 387 bool stopped_on_redirect_; |
381 | 388 |
382 // If |automatically_retry_on_5xx_| is false, 5xx responses will be | 389 // If |automatically_retry_on_5xx_| is false, 5xx responses will be |
383 // propagated to the observer, if it is true URLFetcher will automatically | 390 // propagated to the observer, if it is true URLFetcher will automatically |
384 // re-execute the request, after the back-off delay has expired. | 391 // re-execute the request, after the back-off delay has expired. |
385 // true by default. | 392 // true by default. |
386 bool automatically_retry_on_5xx_; | 393 bool automatically_retry_on_5xx_; |
387 // Maximum retries allowed. | 394 // Maximum retries allowed. |
388 int max_retries_; | 395 int max_retries_; |
pauljensen
2012/12/07 23:00:05
Might be nice to comment this more explicitly, dit
Joao da Silva
2012/12/10 15:32:42
Done. Also renamed these fields and the setter/get
| |
389 // Back-off time delay. 0 by default. | 396 // Back-off time delay. 0 by default. |
390 base::TimeDelta backoff_delay_; | 397 base::TimeDelta backoff_delay_; |
391 | 398 |
399 // Number of times to retry when the request fails with ERR_NETWORK_CHANGED. | |
400 // Defaults to 0. | |
pauljensen
2012/12/07 23:00:05
nit: Maybe change to "0 by default." to match two
Joao da Silva
2012/12/10 15:32:42
Done.
| |
401 int max_retries_on_network_changes_; | |
402 | |
392 // Timer to poll the progress of uploading for POST and PUT requests. | 403 // Timer to poll the progress of uploading for POST and PUT requests. |
393 // When crbug.com/119629 is fixed, scoped_ptr is not necessary here. | 404 // When crbug.com/119629 is fixed, scoped_ptr is not necessary here. |
394 scoped_ptr<base::RepeatingTimer<URLFetcherCore> > | 405 scoped_ptr<base::RepeatingTimer<URLFetcherCore> > |
395 upload_progress_checker_timer_; | 406 upload_progress_checker_timer_; |
396 // Number of bytes sent so far. | 407 // Number of bytes sent so far. |
397 int64 current_upload_bytes_; | 408 int64 current_upload_bytes_; |
398 // Number of bytes received so far. | 409 // Number of bytes received so far. |
399 int64 current_response_bytes_; | 410 int64 current_response_bytes_; |
400 // Total expected bytes to receive (-1 if it cannot be determined). | 411 // Total expected bytes to receive (-1 if it cannot be determined). |
401 int64 total_response_bytes_; | 412 int64 total_response_bytes_; |
402 | 413 |
403 // TODO(willchan): Get rid of this after debugging crbug.com/90971. | 414 // TODO(willchan): Get rid of this after debugging crbug.com/90971. |
404 base::debug::StackTrace stack_trace_; | 415 base::debug::StackTrace stack_trace_; |
405 | 416 |
406 static base::LazyInstance<Registry> g_registry; | 417 static base::LazyInstance<Registry> g_registry; |
407 | 418 |
408 DISALLOW_COPY_AND_ASSIGN(URLFetcherCore); | 419 DISALLOW_COPY_AND_ASSIGN(URLFetcherCore); |
409 }; | 420 }; |
410 | 421 |
411 } // namespace net | 422 } // namespace net |
412 | 423 |
413 #endif // NET_URL_REQUEST_URL_FETCHER_CORE_H_ | 424 #endif // NET_URL_REQUEST_URL_FETCHER_CORE_H_ |
OLD | NEW |