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.
5 #ifndef NET_URL_REQUEST_URL_FETCHER_H_
6 #define NET_URL_REQUEST_URL_FETCHER_H_
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"
22 class SequencedTaskRunner
;
29 class HttpRequestHeaders
;
30 class HttpResponseHeaders
;
31 class URLFetcherDelegate
;
32 class URLFetcherResponseWriter
;
33 class URLRequestContextGetter
;
34 class URLRequestStatus
;
35 typedef std::vector
<std::string
> ResponseCookies
;
37 // To use this class, create an instance with the desired URL and a pointer to
38 // the object to be notified when the URL has been loaded:
39 // scoped_ptr<URLFetcher> fetcher =
40 // URLFetcher::Create("http://www.google.com",
44 // You must also set a request context getter:
46 // fetcher->SetRequestContext(&my_request_context_getter);
48 // Then, optionally set properties on this object, like the request context or
50 // fetcher->set_extra_request_headers("X-Foo: bar");
52 // Finally, start the request:
55 // You may cancel the request by destroying the URLFetcher:
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.
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.
71 // NOTE: By default URLFetcher requests are NOT intercepted, except when
72 // interception is explicitly enabled in tests.
73 class NET_EXPORT URLFetcher
{
75 // Imposible http response code. Used to signal that no http response code
78 RESPONSE_CODE_INVALID
= -1
85 DELETE_REQUEST
, // DELETE is already taken on Windows.
86 // <winnt.h> defines a DELETE macro.
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
;
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
;
100 virtual ~URLFetcher();
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 static scoped_ptr
<URLFetcher
> Create(const GURL
& url
,
106 URLFetcher::RequestType request_type
,
107 URLFetcherDelegate
* d
);
109 // Like above, but if there's a URLFetcherFactory registered with the
110 // implementation it will be used. |id| may be used during testing to identify
111 // who is creating the URLFetcher.
112 static scoped_ptr
<URLFetcher
> Create(int id
,
114 URLFetcher::RequestType request_type
,
115 URLFetcherDelegate
* d
);
117 // Cancels all existing URLFetchers. Will notify the URLFetcherDelegates.
118 // Note that any new URLFetchers created while this is running will not be
119 // cancelled. Typically, one would call this in the CleanUp() method of an IO
120 // thread, so that no new URLRequests would be able to start on the IO thread
121 // anyway. This doesn't prevent new URLFetchers from trying to post to the IO
122 // thread though, even though the task won't ever run.
123 static void CancelAll();
125 // Normally, URLFetcher will abort loads that request SSL client certificate
126 // authentication, but this method may be used to cause URLFetchers to ignore
127 // requests for client certificates and continue anonymously. Because such
128 // behaviour affects the URLRequestContext's shared network state and socket
129 // pools, it should only be used for testing.
130 static void SetIgnoreCertificateRequests(bool ignored
);
132 // Sets data only needed by POSTs. All callers making POST requests should
133 // call one of the SetUpload* methods before the request is started.
134 // |upload_content_type| is the MIME type of the content, while
135 // |upload_content| is the data to be sent (the Content-Length header value
136 // will be set to the length of this data).
137 virtual void SetUploadData(const std::string
& upload_content_type
,
138 const std::string
& upload_content
) = 0;
140 // Sets data only needed by POSTs. All callers making POST requests should
141 // call one of the SetUpload* methods before the request is started.
142 // |upload_content_type| is the MIME type of the content, while
143 // |file_path| is the path to the file containing the data to be sent (the
144 // Content-Length header value will be set to the length of this file).
145 // |range_offset| and |range_length| specify the range of the part
146 // to be uploaded. To upload the whole file, (0, kuint64max) can be used.
147 // |file_task_runner| will be used for all file operations.
148 virtual void SetUploadFilePath(
149 const std::string
& upload_content_type
,
150 const base::FilePath
& file_path
,
153 scoped_refptr
<base::TaskRunner
> file_task_runner
) = 0;
155 // Sets data only needed by POSTs. All callers making POST requests should
156 // call one of the SetUpload* methods before the request is started.
157 // |upload_content_type| is the MIME type of the content, while |callback| is
158 // the callback to create the upload data stream (the Content-Length header
159 // value will be set to the length of this data). |callback| may be called
160 // mutliple times if the request is retried.
161 virtual void SetUploadStreamFactory(
162 const std::string
& upload_content_type
,
163 const CreateUploadStreamCallback
& callback
) = 0;
165 // Indicates that the POST data is sent via chunked transfer encoding.
166 // This may only be called before calling Start().
167 // Use AppendChunkToUpload() to give the data chunks after calling Start().
168 virtual void SetChunkedUpload(const std::string
& upload_content_type
) = 0;
170 // Adds the given bytes to a request's POST data transmitted using chunked
171 // transfer encoding.
172 // This method should be called ONLY after calling Start().
173 virtual void AppendChunkToUpload(const std::string
& data
,
174 bool is_last_chunk
) = 0;
176 // Set one or more load flags as defined in net/base/load_flags.h. Must be
177 // called before the request is started.
178 virtual void SetLoadFlags(int load_flags
) = 0;
180 // Returns the current load flags.
181 virtual int GetLoadFlags() const = 0;
183 // The referrer URL for the request. Must be called before the request is
185 virtual void SetReferrer(const std::string
& referrer
) = 0;
187 // The referrer policy to apply when updating the referrer during redirects.
188 // The referrer policy may only be changed before Start() is called.
189 virtual void SetReferrerPolicy(
190 URLRequest::ReferrerPolicy referrer_policy
) = 0;
192 // Set extra headers on the request. Must be called before the request
194 // This replaces the entire extra request headers.
195 virtual void SetExtraRequestHeaders(
196 const std::string
& extra_request_headers
) = 0;
198 // Add header (with format field-name ":" [ field-value ]) to the request
199 // headers. Must be called before the request is started.
200 // This appends the header to the current extra request headers.
201 virtual void AddExtraRequestHeader(const std::string
& header_line
) = 0;
203 // Set the URLRequestContext on the request. Must be called before the
204 // request is started.
205 virtual void SetRequestContext(
206 URLRequestContextGetter
* request_context_getter
) = 0;
208 // Set the URL that should be consulted for the third-party cookie
210 virtual void SetFirstPartyForCookies(
211 const GURL
& first_party_for_cookies
) = 0;
213 // Set the key and data callback that is used when setting the user
214 // data on any URLRequest objects this object creates.
215 virtual void SetURLRequestUserData(
217 const CreateDataCallback
& create_data_callback
) = 0;
219 // If |stop_on_redirect| is true, 3xx responses will cause the fetch to halt
220 // immediately rather than continue through the redirect. OnURLFetchComplete
221 // will be called, with the URLFetcher's URL set to the redirect destination,
222 // its status set to CANCELED, and its response code set to the relevant 3xx
223 // server response code.
224 virtual void SetStopOnRedirect(bool stop_on_redirect
) = 0;
226 // If |retry| is false, 5xx responses will be propagated to the observer. If
227 // it is true URLFetcher will automatically re-execute the request, after
228 // backoff_delay() elapses, up to the maximum number of retries allowed by
229 // SetMaxRetriesOn5xx. Defaults to true.
230 virtual void SetAutomaticallyRetryOn5xx(bool retry
) = 0;
232 // |max_retries| is the maximum number of times URLFetcher will retry a
233 // request that receives a 5XX response. Depends on
234 // SetAutomaticallyRetryOn5xx. Defaults to 0.
235 virtual void SetMaxRetriesOn5xx(int max_retries
) = 0;
236 virtual int GetMaxRetriesOn5xx() const = 0;
238 // Returns the back-off delay before the request will be retried,
239 // when a 5xx response was received.
240 virtual base::TimeDelta
GetBackoffDelay() const = 0;
242 // Retries up to |max_retries| times when requests fail with
243 // ERR_NETWORK_CHANGED. If ERR_NETWORK_CHANGED is received after having
244 // retried |max_retries| times then it is propagated to the observer.
245 virtual void SetAutomaticallyRetryOnNetworkChanges(int max_retries
) = 0;
247 // By default, the response is saved in a string. Call this method to save the
248 // response to a file instead. Must be called before Start().
249 // |file_task_runner| will be used for all file operations.
250 // To save to a temporary file, use SaveResponseToTemporaryFile().
251 // The created file is removed when the URLFetcher is deleted unless you
252 // take ownership by calling GetResponseAsFilePath().
253 virtual void SaveResponseToFileAtPath(
254 const base::FilePath
& file_path
,
255 scoped_refptr
<base::SequencedTaskRunner
> file_task_runner
) = 0;
257 // By default, the response is saved in a string. Call this method to save the
258 // response to a temporary file instead. Must be called before Start().
259 // |file_task_runner| will be used for all file operations.
260 // The created file is removed when the URLFetcher is deleted unless you
261 // take ownership by calling GetResponseAsFilePath().
262 virtual void SaveResponseToTemporaryFile(
263 scoped_refptr
<base::SequencedTaskRunner
> file_task_runner
) = 0;
265 // By default, the response is saved in a string. Call this method to use the
266 // specified writer to save the response. Must be called before Start().
267 virtual void SaveResponseWithWriter(
268 scoped_ptr
<URLFetcherResponseWriter
> response_writer
) = 0;
270 // Retrieve the response headers from the request. Must only be called after
271 // the OnURLFetchComplete callback has run.
272 virtual HttpResponseHeaders
* GetResponseHeaders() const = 0;
274 // Retrieve the remote socket address from the request. Must only
275 // be called after the OnURLFetchComplete callback has run and if
276 // the request has not failed.
277 virtual HostPortPair
GetSocketAddress() const = 0;
279 // Returns true if the request was delivered through a proxy. Must only
280 // be called after the OnURLFetchComplete callback has run and the request
282 virtual bool WasFetchedViaProxy() const = 0;
284 // Start the request. After this is called, you may not change any other
286 virtual void Start() = 0;
288 // Return the URL that we were asked to fetch.
289 virtual const GURL
& GetOriginalURL() const = 0;
291 // Return the URL that this fetcher is processing.
292 virtual const GURL
& GetURL() const = 0;
294 // The status of the URL fetch.
295 virtual const URLRequestStatus
& GetStatus() const = 0;
297 // The http response code received. Will return RESPONSE_CODE_INVALID
298 // if an error prevented any response from being received.
299 virtual int GetResponseCode() const = 0;
302 virtual const ResponseCookies
& GetCookies() const = 0;
304 // Reports that the received content was malformed.
305 virtual void ReceivedContentWasMalformed() = 0;
307 // Get the response as a string. Return false if the fetcher was not
308 // set to store the response as a string.
309 virtual bool GetResponseAsString(std::string
* out_response_string
) const = 0;
311 // Get the path to the file containing the response body. Returns false
312 // if the response body was not saved to a file. If take_ownership is
313 // true, caller takes responsibility for the file, and it will not
314 // be removed once the URLFetcher is destroyed. User should not take
315 // ownership more than once, or call this method after taking ownership.
316 virtual bool GetResponseAsFilePath(
318 base::FilePath
* out_response_path
) const = 0;
323 #endif // NET_URL_REQUEST_URL_FETCHER_H_