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 // This file contains URLFetcher, a wrapper around net::URLRequest that handles | 5 // This file contains URLFetcher, a wrapper around net::URLRequest that handles |
6 // low-level details like thread safety, ref counting, and incremental buffer | 6 // low-level details like thread safety, ref counting, and incremental buffer |
7 // reading. This is useful for callers who simply want to get the data from a | 7 // reading. This is useful for callers who simply want to get the data from a |
8 // URL and don't care about all the nitty-gritty details. | 8 // URL and don't care about all the nitty-gritty details. |
9 // | 9 // |
10 // NOTE(willchan): Only one "IO" thread is supported for URLFetcher. This is a | 10 // NOTE(willchan): Only one "IO" thread is supported for URLFetcher. This is a |
11 // temporary situation. We will work on allowing support for multiple "io" | 11 // temporary situation. We will work on allowing support for multiple "io" |
12 // threads per process. | 12 // threads per process. |
13 | 13 |
14 #ifndef CHROME_COMMON_NET_URL_FETCHER_H_ | 14 #ifndef CHROME_COMMON_NET_URL_FETCHER_H_ |
15 #define CHROME_COMMON_NET_URL_FETCHER_H_ | 15 #define CHROME_COMMON_NET_URL_FETCHER_H_ |
16 #pragma once | 16 #pragma once |
17 | 17 |
18 #include <string> | 18 #include <string> |
19 #include <vector> | 19 #include <vector> |
20 | 20 |
21 #include "base/memory/ref_counted.h" | 21 #include "base/memory/ref_counted.h" |
22 #include "base/message_loop.h" | 22 #include "base/message_loop.h" |
23 #include "base/platform_file.h" | |
23 #include "base/time.h" | 24 #include "base/time.h" |
24 | 25 |
26 class FilePath; | |
25 class GURL; | 27 class GURL; |
26 | 28 |
29 namespace base { | |
30 class MessageLoopProxy; | |
31 } // namespace base | |
32 | |
27 namespace net { | 33 namespace net { |
28 class HostPortPair; | 34 class HostPortPair; |
29 class HttpResponseHeaders; | 35 class HttpResponseHeaders; |
30 class URLRequestContextGetter; | 36 class URLRequestContextGetter; |
31 class URLRequestStatus; | 37 class URLRequestStatus; |
32 typedef std::vector<std::string> ResponseCookies; | 38 typedef std::vector<std::string> ResponseCookies; |
33 } // namespace net | 39 } // namespace net |
34 | 40 |
35 // To use this class, create an instance with the desired URL and a pointer to | 41 // To use this class, create an instance with the desired URL and a pointer to |
36 // the object to be notified when the URL has been loaded: | 42 // the object to be notified when the URL has been loaded: |
(...skipping 24 matching lines...) Expand all Loading... | |
61 // interception is explicitly enabled in tests. | 67 // interception is explicitly enabled in tests. |
62 | 68 |
63 class URLFetcher { | 69 class URLFetcher { |
64 public: | 70 public: |
65 enum RequestType { | 71 enum RequestType { |
66 GET, | 72 GET, |
67 POST, | 73 POST, |
68 HEAD, | 74 HEAD, |
69 }; | 75 }; |
70 | 76 |
77 // Where should the response be saved? Use set_response_destination() | |
78 // to choose. | |
79 enum ResponseDestinationType { | |
80 STRING, // Default | |
81 TEMP_FILE | |
82 }; | |
83 | |
71 class Delegate { | 84 class Delegate { |
72 public: | 85 public: |
73 // This will be called when the URL has been fetched, successfully or not. | 86 // TODO(skerner): This will be removed in favor of the |data|-free |
74 // |response_code| is the HTTP response code (200, 404, etc.) if | 87 // version below. Leaving this for now to make the initial code review |
75 // applicable. |url|, |status| and |data| are all valid until the | 88 // easy to read. |
76 // URLFetcher instance is destroyed. | |
77 virtual void OnURLFetchComplete(const URLFetcher* source, | 89 virtual void OnURLFetchComplete(const URLFetcher* source, |
78 const GURL& url, | 90 const GURL& url, |
79 const net::URLRequestStatus& status, | 91 const net::URLRequestStatus& status, |
80 int response_code, | 92 int response_code, |
81 const net::ResponseCookies& cookies, | 93 const net::ResponseCookies& cookies, |
82 const std::string& data) = 0; | 94 const std::string& data); |
95 | |
96 // This will be called when the URL has been fetched, successfully or not. | |
97 // |response_code| is the HTTP response code (200, 404, etc.) if | |
98 // applicable. |url| and |status| are all valid until the URLFetcher | |
99 // instance is destroyed. | |
darin (slow to review)
2011/05/16 04:57:04
I don't understand why you need these additional m
Sam Kerner (Chrome)
2011/05/17 04:09:34
One of them (the new OnURLFetchComplete() ) will r
| |
100 virtual void OnURLFetchComplete(const URLFetcher* source, | |
101 const GURL& url, | |
102 const net::URLRequestStatus& status, | |
103 int response_code, | |
104 const net::ResponseCookies& cookies); | |
105 | |
106 // Called on a file writing error. Only called when writing the response | |
107 // to a file. | |
108 // REVIEWER PLEASE NOTE: This method would be unnecessary if the failure | |
109 // could be encoded in a net::URLRequestStatus. However, it seems odd | |
110 // to put a file system error in that object. Is it worth having this | |
111 // method? | |
112 virtual void OnFileWriteError(const URLFetcher* source, | |
113 const GURL& url, | |
114 base::PlatformFileError error); | |
83 | 115 |
84 protected: | 116 protected: |
85 virtual ~Delegate() {} | 117 virtual ~Delegate() {} |
86 }; | 118 }; |
87 | 119 |
88 // URLFetcher::Create uses the currently registered Factory to create the | 120 // URLFetcher::Create uses the currently registered Factory to create the |
89 // URLFetcher. Factory is intended for testing. | 121 // URLFetcher. Factory is intended for testing. |
90 class Factory { | 122 class Factory { |
91 public: | 123 public: |
92 virtual URLFetcher* CreateURLFetcher(int id, | 124 virtual URLFetcher* CreateURLFetcher(int id, |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
176 // when a 5xx response was received. | 208 // when a 5xx response was received. |
177 base::TimeDelta backoff_delay() const { return backoff_delay_; } | 209 base::TimeDelta backoff_delay() const { return backoff_delay_; } |
178 | 210 |
179 // Sets the back-off delay, allowing to mock 5xx requests in unit-tests. | 211 // Sets the back-off delay, allowing to mock 5xx requests in unit-tests. |
180 #if defined(UNIT_TEST) | 212 #if defined(UNIT_TEST) |
181 void set_backoff_delay(base::TimeDelta backoff_delay) { | 213 void set_backoff_delay(base::TimeDelta backoff_delay) { |
182 backoff_delay_ = backoff_delay; | 214 backoff_delay_ = backoff_delay; |
183 } | 215 } |
184 #endif // defined(UNIT_TEST) | 216 #endif // defined(UNIT_TEST) |
185 | 217 |
218 ResponseDestinationType response_destination() { | |
219 return response_destination_; | |
220 } | |
221 | |
222 // Where should the response be saved? This should only be called before | |
223 // calling Start(). If the response should be saved to a file, you need | |
224 // to call set_file_message_loop_proxy() to give the thread on which file | |
225 // operations may be done. | |
226 void set_response_destination(ResponseDestinationType response_destination) { | |
darin (slow to review)
2011/05/16 04:57:04
It seems a bit verbose to use an enum here. Maybe
Sam Kerner (Chrome)
2011/05/17 04:09:34
Done. Made the enum private.
| |
227 response_destination_ = response_destination; | |
228 } | |
229 | |
230 // Set the message loop proxy for file operations. Used to write the | |
231 // response to a file. | |
232 void set_file_message_loop_proxy( | |
233 scoped_refptr<base::MessageLoopProxy> file_message_loop_proxy); | |
234 | |
186 // Retrieve the response headers from the request. Must only be called after | 235 // Retrieve the response headers from the request. Must only be called after |
187 // the OnURLFetchComplete callback has run. | 236 // the OnURLFetchComplete callback has run. |
188 virtual net::HttpResponseHeaders* response_headers() const; | 237 virtual net::HttpResponseHeaders* response_headers() const; |
189 | 238 |
190 // Retrieve the remote socket address from the request. Must only | 239 // Retrieve the remote socket address from the request. Must only |
191 // be called after the OnURLFetchComplete callback has run and if | 240 // be called after the OnURLFetchComplete callback has run and if |
192 // the request has not failed. | 241 // the request has not failed. |
193 net::HostPortPair socket_address() const; | 242 net::HostPortPair socket_address() const; |
194 | 243 |
195 // Returns true if the request was delivered through a proxy. Must only | 244 // Returns true if the request was delivered through a proxy. Must only |
196 // be called after the OnURLFetchComplete callback has run and the request | 245 // be called after the OnURLFetchComplete callback has run and the request |
197 // has not failed. | 246 // has not failed. |
198 bool was_fetched_via_proxy() const; | 247 bool was_fetched_via_proxy() const; |
199 | 248 |
200 // Start the request. After this is called, you may not change any other | 249 // Start the request. After this is called, you may not change any other |
201 // settings. | 250 // settings. |
202 virtual void Start(); | 251 virtual void Start(); |
203 | 252 |
204 // Return the URL that this fetcher is processing. | 253 // Return the URL that this fetcher is processing. |
205 const GURL& url() const; | 254 const GURL& url() const; |
206 | 255 |
207 // Reports that the received content was malformed. | 256 // Reports that the received content was malformed. |
208 void ReceivedContentWasMalformed(); | 257 void ReceivedContentWasMalformed(); |
209 | 258 |
259 // Get the response as a string. Return false if the fetcher was not | |
260 // set to store the response as a string. | |
261 bool GetResponseAsString(std::string* response_string) const; | |
262 | |
263 // Get the path to the file containing the response body. Returns false | |
264 // if the response body was not saved to a file. | |
265 bool GetResponseAsFilePath(FilePath* response_path) const; | |
266 | |
210 // Cancels all existing URLFetchers. Will notify the URLFetcher::Delegates. | 267 // Cancels all existing URLFetchers. Will notify the URLFetcher::Delegates. |
211 // Note that any new URLFetchers created while this is running will not be | 268 // Note that any new URLFetchers created while this is running will not be |
212 // cancelled. Typically, one would call this in the CleanUp() method of an IO | 269 // cancelled. Typically, one would call this in the CleanUp() method of an IO |
213 // thread, so that no new URLRequests would be able to start on the IO thread | 270 // thread, so that no new URLRequests would be able to start on the IO thread |
214 // anyway. This doesn't prevent new URLFetchers from trying to post to the IO | 271 // anyway. This doesn't prevent new URLFetchers from trying to post to the IO |
215 // thread though, even though the task won't ever run. | 272 // thread though, even though the task won't ever run. |
216 static void CancelAll(); | 273 static void CancelAll(); |
217 | 274 |
218 protected: | 275 protected: |
219 // Returns the delegate. | 276 // Returns the delegate. |
(...skipping 18 matching lines...) Expand all Loading... | |
238 // If |automatically_retry_on_5xx_| is false, 5xx responses will be | 295 // If |automatically_retry_on_5xx_| is false, 5xx responses will be |
239 // propagated to the observer, if it is true URLFetcher will automatically | 296 // propagated to the observer, if it is true URLFetcher will automatically |
240 // re-execute the request, after the back-off delay has expired. | 297 // re-execute the request, after the back-off delay has expired. |
241 // true by default. | 298 // true by default. |
242 bool automatically_retry_on_5xx_; | 299 bool automatically_retry_on_5xx_; |
243 // Back-off time delay. 0 by default. | 300 // Back-off time delay. 0 by default. |
244 base::TimeDelta backoff_delay_; | 301 base::TimeDelta backoff_delay_; |
245 // Maximum retries allowed. | 302 // Maximum retries allowed. |
246 int max_retries_; | 303 int max_retries_; |
247 | 304 |
305 // Where should responses be saved? | |
306 ResponseDestinationType response_destination_; | |
307 | |
248 static bool g_interception_enabled; | 308 static bool g_interception_enabled; |
249 | 309 |
250 DISALLOW_COPY_AND_ASSIGN(URLFetcher); | 310 DISALLOW_COPY_AND_ASSIGN(URLFetcher); |
251 }; | 311 }; |
252 | 312 |
253 #endif // CHROME_COMMON_NET_URL_FETCHER_H_ | 313 #endif // CHROME_COMMON_NET_URL_FETCHER_H_ |
OLD | NEW |