| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef NET_URL_REQUEST_URL_FETCHER_H_ | |
| 6 #define NET_URL_REQUEST_URL_FETCHER_H_ | |
| 7 | |
| 8 #include <string> | |
| 9 #include <vector> | |
| 10 | |
| 11 #include "base/callback_forward.h" | |
| 12 #include "base/memory/ref_counted.h" | |
| 13 #include "base/memory/scoped_ptr.h" | |
| 14 #include "base/supports_user_data.h" | |
| 15 #include "net/base/net_export.h" | |
| 16 #include "net/url_request/url_request.h" | |
| 17 | |
| 18 class GURL; | |
| 19 | |
| 20 namespace base { | |
| 21 class FilePath; | |
| 22 class MessageLoopProxy; | |
| 23 class SequencedTaskRunner; | |
| 24 class TaskRunner; | |
| 25 class TimeDelta; | |
| 26 } | |
| 27 | |
| 28 namespace net { | |
| 29 class HostPortPair; | |
| 30 class HttpRequestHeaders; | |
| 31 class HttpResponseHeaders; | |
| 32 class URLFetcherDelegate; | |
| 33 class URLFetcherResponseWriter; | |
| 34 class URLRequestContextGetter; | |
| 35 class URLRequestStatus; | |
| 36 typedef std::vector<std::string> ResponseCookies; | |
| 37 | |
| 38 // To use this class, create an instance with the desired URL and a pointer to | |
| 39 // the object to be notified when the URL has been loaded: | |
| 40 // scoped_ptr<URLFetcher> fetcher(URLFetcher::Create("http://www.google.com", | |
| 41 // URLFetcher::GET, | |
| 42 // this)); | |
| 43 // | |
| 44 // You must also set a request context getter: | |
| 45 // | |
| 46 // fetcher->SetRequestContext(&my_request_context_getter); | |
| 47 // | |
| 48 // Then, optionally set properties on this object, like the request context or | |
| 49 // extra headers: | |
| 50 // fetcher->set_extra_request_headers("X-Foo: bar"); | |
| 51 // | |
| 52 // Finally, start the request: | |
| 53 // fetcher->Start(); | |
| 54 // | |
| 55 // You may cancel the request by destroying the URLFetcher: | |
| 56 // fetcher.reset(); | |
| 57 // | |
| 58 // The object you supply as a delegate must inherit from | |
| 59 // URLFetcherDelegate; when the fetch is completed, | |
| 60 // OnURLFetchComplete() will be called with a pointer to the URLFetcher. From | |
| 61 // that point until the original URLFetcher instance is destroyed, you may use | |
| 62 // accessor methods to see the result of the fetch. You should copy these | |
| 63 // objects if you need them to live longer than the URLFetcher instance. If the | |
| 64 // URLFetcher instance is destroyed before the callback happens, the fetch will | |
| 65 // be canceled and no callback will occur. | |
| 66 // | |
| 67 // You may create the URLFetcher instance on any thread; OnURLFetchComplete() | |
| 68 // will be called back on the same thread you use to create the instance. | |
| 69 // | |
| 70 // | |
| 71 // NOTE: By default URLFetcher requests are NOT intercepted, except when | |
| 72 // interception is explicitly enabled in tests. | |
| 73 class NET_EXPORT URLFetcher { | |
| 74 public: | |
| 75 // Imposible http response code. Used to signal that no http response code | |
| 76 // was received. | |
| 77 enum ResponseCode { | |
| 78 RESPONSE_CODE_INVALID = -1 | |
| 79 }; | |
| 80 | |
| 81 enum RequestType { | |
| 82 GET, | |
| 83 POST, | |
| 84 HEAD, | |
| 85 DELETE_REQUEST, // DELETE is already taken on Windows. | |
| 86 // <winnt.h> defines a DELETE macro. | |
| 87 PUT, | |
| 88 PATCH, | |
| 89 }; | |
| 90 | |
| 91 // Used by SetURLRequestUserData. The callback should make a fresh | |
| 92 // base::SupportsUserData::Data object every time it's called. | |
| 93 typedef base::Callback<base::SupportsUserData::Data*()> CreateDataCallback; | |
| 94 | |
| 95 // Used by SetUploadStreamFactory. The callback should assign a fresh upload | |
| 96 // data stream every time it's called. | |
| 97 typedef base::Callback<scoped_ptr<UploadDataStream>()> | |
| 98 CreateUploadStreamCallback; | |
| 99 | |
| 100 virtual ~URLFetcher(); | |
| 101 | |
| 102 // |url| is the URL to send the request to. | |
| 103 // |request_type| is the type of request to make. | |
| 104 // |d| the object that will receive the callback on fetch completion. | |
| 105 // Caller is responsible for destroying the returned URLFetcher. | |
| 106 static URLFetcher* Create(const GURL& url, | |
| 107 URLFetcher::RequestType request_type, | |
| 108 URLFetcherDelegate* d); | |
| 109 | |
| 110 // Like above, but if there's a URLFetcherFactory registered with the | |
| 111 // implementation it will be used. |id| may be used during testing to identify | |
| 112 // who is creating the URLFetcher. | |
| 113 // Caller is responsible for destroying the returned URLFetcher. | |
| 114 static URLFetcher* Create(int id, | |
| 115 const GURL& url, | |
| 116 URLFetcher::RequestType request_type, | |
| 117 URLFetcherDelegate* d); | |
| 118 | |
| 119 // Cancels all existing URLFetchers. Will notify the URLFetcherDelegates. | |
| 120 // Note that any new URLFetchers created while this is running will not be | |
| 121 // cancelled. Typically, one would call this in the CleanUp() method of an IO | |
| 122 // thread, so that no new URLRequests would be able to start on the IO thread | |
| 123 // anyway. This doesn't prevent new URLFetchers from trying to post to the IO | |
| 124 // thread though, even though the task won't ever run. | |
| 125 static void CancelAll(); | |
| 126 | |
| 127 // Normally, URLFetcher will abort loads that request SSL client certificate | |
| 128 // authentication, but this method may be used to cause URLFetchers to ignore | |
| 129 // requests for client certificates and continue anonymously. Because such | |
| 130 // behaviour affects the URLRequestContext's shared network state and socket | |
| 131 // pools, it should only be used for testing. | |
| 132 static void SetIgnoreCertificateRequests(bool ignored); | |
| 133 | |
| 134 // Sets data only needed by POSTs. All callers making POST requests should | |
| 135 // call one of the SetUpload* methods before the request is started. | |
| 136 // |upload_content_type| is the MIME type of the content, while | |
| 137 // |upload_content| is the data to be sent (the Content-Length header value | |
| 138 // will be set to the length of this data). | |
| 139 virtual void SetUploadData(const std::string& upload_content_type, | |
| 140 const std::string& upload_content) = 0; | |
| 141 | |
| 142 // Sets data only needed by POSTs. All callers making POST requests should | |
| 143 // call one of the SetUpload* methods before the request is started. | |
| 144 // |upload_content_type| is the MIME type of the content, while | |
| 145 // |file_path| is the path to the file containing the data to be sent (the | |
| 146 // Content-Length header value will be set to the length of this file). | |
| 147 // |range_offset| and |range_length| specify the range of the part | |
| 148 // to be uploaded. To upload the whole file, (0, kuint64max) can be used. | |
| 149 // |file_task_runner| will be used for all file operations. | |
| 150 virtual void SetUploadFilePath( | |
| 151 const std::string& upload_content_type, | |
| 152 const base::FilePath& file_path, | |
| 153 uint64 range_offset, | |
| 154 uint64 range_length, | |
| 155 scoped_refptr<base::TaskRunner> file_task_runner) = 0; | |
| 156 | |
| 157 // Sets data only needed by POSTs. All callers making POST requests should | |
| 158 // call one of the SetUpload* methods before the request is started. | |
| 159 // |upload_content_type| is the MIME type of the content, while |callback| is | |
| 160 // the callback to create the upload data stream (the Content-Length header | |
| 161 // value will be set to the length of this data). |callback| may be called | |
| 162 // mutliple times if the request is retried. | |
| 163 virtual void SetUploadStreamFactory( | |
| 164 const std::string& upload_content_type, | |
| 165 const CreateUploadStreamCallback& callback) = 0; | |
| 166 | |
| 167 // Indicates that the POST data is sent via chunked transfer encoding. | |
| 168 // This may only be called before calling Start(). | |
| 169 // Use AppendChunkToUpload() to give the data chunks after calling Start(). | |
| 170 virtual void SetChunkedUpload(const std::string& upload_content_type) = 0; | |
| 171 | |
| 172 // Adds the given bytes to a request's POST data transmitted using chunked | |
| 173 // transfer encoding. | |
| 174 // This method should be called ONLY after calling Start(). | |
| 175 virtual void AppendChunkToUpload(const std::string& data, | |
| 176 bool is_last_chunk) = 0; | |
| 177 | |
| 178 // Set one or more load flags as defined in net/base/load_flags.h. Must be | |
| 179 // called before the request is started. | |
| 180 virtual void SetLoadFlags(int load_flags) = 0; | |
| 181 | |
| 182 // Returns the current load flags. | |
| 183 virtual int GetLoadFlags() const = 0; | |
| 184 | |
| 185 // The referrer URL for the request. Must be called before the request is | |
| 186 // started. | |
| 187 virtual void SetReferrer(const std::string& referrer) = 0; | |
| 188 | |
| 189 // The referrer policy to apply when updating the referrer during redirects. | |
| 190 // The referrer policy may only be changed before Start() is called. | |
| 191 virtual void SetReferrerPolicy( | |
| 192 URLRequest::ReferrerPolicy referrer_policy) = 0; | |
| 193 | |
| 194 // Set extra headers on the request. Must be called before the request | |
| 195 // is started. | |
| 196 // This replaces the entire extra request headers. | |
| 197 virtual void SetExtraRequestHeaders( | |
| 198 const std::string& extra_request_headers) = 0; | |
| 199 | |
| 200 // Add header (with format field-name ":" [ field-value ]) to the request | |
| 201 // headers. Must be called before the request is started. | |
| 202 // This appends the header to the current extra request headers. | |
| 203 virtual void AddExtraRequestHeader(const std::string& header_line) = 0; | |
| 204 | |
| 205 // Set the URLRequestContext on the request. Must be called before the | |
| 206 // request is started. | |
| 207 virtual void SetRequestContext( | |
| 208 URLRequestContextGetter* request_context_getter) = 0; | |
| 209 | |
| 210 // Set the URL that should be consulted for the third-party cookie | |
| 211 // blocking policy. | |
| 212 virtual void SetFirstPartyForCookies( | |
| 213 const GURL& first_party_for_cookies) = 0; | |
| 214 | |
| 215 // Set the key and data callback that is used when setting the user | |
| 216 // data on any URLRequest objects this object creates. | |
| 217 virtual void SetURLRequestUserData( | |
| 218 const void* key, | |
| 219 const CreateDataCallback& create_data_callback) = 0; | |
| 220 | |
| 221 // If |stop_on_redirect| is true, 3xx responses will cause the fetch to halt | |
| 222 // immediately rather than continue through the redirect. OnURLFetchComplete | |
| 223 // will be called, with the URLFetcher's URL set to the redirect destination, | |
| 224 // its status set to CANCELED, and its response code set to the relevant 3xx | |
| 225 // server response code. | |
| 226 virtual void SetStopOnRedirect(bool stop_on_redirect) = 0; | |
| 227 | |
| 228 // If |retry| is false, 5xx responses will be propagated to the observer. If | |
| 229 // it is true URLFetcher will automatically re-execute the request, after | |
| 230 // backoff_delay() elapses, up to the maximum number of retries allowed by | |
| 231 // SetMaxRetriesOn5xx. Defaults to true. | |
| 232 virtual void SetAutomaticallyRetryOn5xx(bool retry) = 0; | |
| 233 | |
| 234 // |max_retries| is the maximum number of times URLFetcher will retry a | |
| 235 // request that receives a 5XX response. Depends on | |
| 236 // SetAutomaticallyRetryOn5xx. Defaults to 0. | |
| 237 virtual void SetMaxRetriesOn5xx(int max_retries) = 0; | |
| 238 virtual int GetMaxRetriesOn5xx() const = 0; | |
| 239 | |
| 240 // Returns the back-off delay before the request will be retried, | |
| 241 // when a 5xx response was received. | |
| 242 virtual base::TimeDelta GetBackoffDelay() const = 0; | |
| 243 | |
| 244 // Retries up to |max_retries| times when requests fail with | |
| 245 // ERR_NETWORK_CHANGED. If ERR_NETWORK_CHANGED is received after having | |
| 246 // retried |max_retries| times then it is propagated to the observer. | |
| 247 virtual void SetAutomaticallyRetryOnNetworkChanges(int max_retries) = 0; | |
| 248 | |
| 249 // By default, the response is saved in a string. Call this method to save the | |
| 250 // response to a file instead. Must be called before Start(). | |
| 251 // |file_task_runner| will be used for all file operations. | |
| 252 // To save to a temporary file, use SaveResponseToTemporaryFile(). | |
| 253 // The created file is removed when the URLFetcher is deleted unless you | |
| 254 // take ownership by calling GetResponseAsFilePath(). | |
| 255 virtual void SaveResponseToFileAtPath( | |
| 256 const base::FilePath& file_path, | |
| 257 scoped_refptr<base::SequencedTaskRunner> file_task_runner) = 0; | |
| 258 | |
| 259 // By default, the response is saved in a string. Call this method to save the | |
| 260 // response to a temporary file instead. Must be called before Start(). | |
| 261 // |file_task_runner| will be used for all file operations. | |
| 262 // The created file is removed when the URLFetcher is deleted unless you | |
| 263 // take ownership by calling GetResponseAsFilePath(). | |
| 264 virtual void SaveResponseToTemporaryFile( | |
| 265 scoped_refptr<base::SequencedTaskRunner> file_task_runner) = 0; | |
| 266 | |
| 267 // By default, the response is saved in a string. Call this method to use the | |
| 268 // specified writer to save the response. Must be called before Start(). | |
| 269 virtual void SaveResponseWithWriter( | |
| 270 scoped_ptr<URLFetcherResponseWriter> response_writer) = 0; | |
| 271 | |
| 272 // Retrieve the response headers from the request. Must only be called after | |
| 273 // the OnURLFetchComplete callback has run. | |
| 274 virtual HttpResponseHeaders* GetResponseHeaders() const = 0; | |
| 275 | |
| 276 // Retrieve the remote socket address from the request. Must only | |
| 277 // be called after the OnURLFetchComplete callback has run and if | |
| 278 // the request has not failed. | |
| 279 virtual HostPortPair GetSocketAddress() const = 0; | |
| 280 | |
| 281 // Returns true if the request was delivered through a proxy. Must only | |
| 282 // be called after the OnURLFetchComplete callback has run and the request | |
| 283 // has not failed. | |
| 284 virtual bool WasFetchedViaProxy() const = 0; | |
| 285 | |
| 286 // Start the request. After this is called, you may not change any other | |
| 287 // settings. | |
| 288 virtual void Start() = 0; | |
| 289 | |
| 290 // Return the URL that we were asked to fetch. | |
| 291 virtual const GURL& GetOriginalURL() const = 0; | |
| 292 | |
| 293 // Return the URL that this fetcher is processing. | |
| 294 virtual const GURL& GetURL() const = 0; | |
| 295 | |
| 296 // The status of the URL fetch. | |
| 297 virtual const URLRequestStatus& GetStatus() const = 0; | |
| 298 | |
| 299 // The http response code received. Will return RESPONSE_CODE_INVALID | |
| 300 // if an error prevented any response from being received. | |
| 301 virtual int GetResponseCode() const = 0; | |
| 302 | |
| 303 // Cookies received. | |
| 304 virtual const ResponseCookies& GetCookies() const = 0; | |
| 305 | |
| 306 // Reports that the received content was malformed. | |
| 307 virtual void ReceivedContentWasMalformed() = 0; | |
| 308 | |
| 309 // Get the response as a string. Return false if the fetcher was not | |
| 310 // set to store the response as a string. | |
| 311 virtual bool GetResponseAsString(std::string* out_response_string) const = 0; | |
| 312 | |
| 313 // Get the path to the file containing the response body. Returns false | |
| 314 // if the response body was not saved to a file. If take_ownership is | |
| 315 // true, caller takes responsibility for the file, and it will not | |
| 316 // be removed once the URLFetcher is destroyed. User should not take | |
| 317 // ownership more than once, or call this method after taking ownership. | |
| 318 virtual bool GetResponseAsFilePath( | |
| 319 bool take_ownership, | |
| 320 base::FilePath* out_response_path) const = 0; | |
| 321 }; | |
| 322 | |
| 323 } // namespace net | |
| 324 | |
| 325 #endif // NET_URL_REQUEST_URL_FETCHER_H_ | |
| OLD | NEW |