| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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_REQUEST_H_ | 5 #ifndef NET_URL_REQUEST_URL_REQUEST_H_ |
| 6 #define NET_URL_REQUEST_URL_REQUEST_H_ | 6 #define NET_URL_REQUEST_URL_REQUEST_H_ |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/basictypes.h" | |
| 12 #include "base/logging.h" | |
| 13 #include "base/ref_counted.h" | 11 #include "base/ref_counted.h" |
| 14 #include "base/time.h" | 12 #include "base/time.h" |
| 15 #include "googleurl/src/gurl.h" | 13 #include "googleurl/src/gurl.h" |
| 16 #include "net/base/load_states.h" | 14 #include "net/base/load_states.h" |
| 17 #include "net/base/ssl_info.h" | |
| 18 #include "net/base/upload_data.h" | |
| 19 #include "net/base/x509_certificate.h" | |
| 20 #include "net/http/http_response_info.h" | 15 #include "net/http/http_response_info.h" |
| 21 #include "net/url_request/url_request_context.h" | |
| 22 #include "net/url_request/url_request_status.h" | 16 #include "net/url_request/url_request_status.h" |
| 23 | 17 |
| 24 namespace net { | 18 namespace net { |
| 19 |
| 25 class IOBuffer; | 20 class IOBuffer; |
| 21 class UploadData; |
| 22 class X509Certificate; |
| 23 |
| 26 } | 24 } |
| 25 |
| 26 class URLRequestContext; |
| 27 class URLRequestJob; | 27 class URLRequestJob; |
| 28 | 28 |
| 29 // This stores the values of the Set-Cookie headers received during the request. | 29 // This stores the values of the Set-Cookie headers received during the request. |
| 30 // Each item in the vector corresponds to a Set-Cookie: line received, | 30 // Each item in the vector corresponds to a Set-Cookie: line received, |
| 31 // excluding the "Set-Cookie:" part. | 31 // excluding the "Set-Cookie:" part. |
| 32 typedef std::vector<std::string> ResponseCookies; | 32 typedef std::vector<std::string> ResponseCookies; |
| 33 | 33 |
| 34 //----------------------------------------------------------------------------- | 34 //----------------------------------------------------------------------------- |
| 35 // A class representing the asynchronous load of a data stream from an URL. | 35 // A class representing the asynchronous load of a data stream from an URL. |
| 36 // | 36 // |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 static bool IsHandledURL(const GURL& url); | 196 static bool IsHandledURL(const GURL& url); |
| 197 | 197 |
| 198 // The original url is the url used to initialize the request, and it may | 198 // The original url is the url used to initialize the request, and it may |
| 199 // differ from the url if the request was redirected. | 199 // differ from the url if the request was redirected. |
| 200 const GURL& original_url() const { return original_url_; } | 200 const GURL& original_url() const { return original_url_; } |
| 201 const GURL& url() const { return url_; } | 201 const GURL& url() const { return url_; } |
| 202 | 202 |
| 203 // The URL that should be consulted for the third-party cookie blocking | 203 // The URL that should be consulted for the third-party cookie blocking |
| 204 // policy. | 204 // policy. |
| 205 const GURL& policy_url() const { return policy_url_; } | 205 const GURL& policy_url() const { return policy_url_; } |
| 206 void set_policy_url(const GURL& policy_url) { | 206 void set_policy_url(const GURL& policy_url); |
| 207 DCHECK(!is_pending_); | |
| 208 policy_url_ = policy_url; | |
| 209 } | |
| 210 | 207 |
| 211 // The request method, as an uppercase string. "GET" is the default value. | 208 // The request method, as an uppercase string. "GET" is the default value. |
| 212 // The request method may only be changed before Start() is called and | 209 // The request method may only be changed before Start() is called and |
| 213 // should only be assigned an uppercase value. | 210 // should only be assigned an uppercase value. |
| 214 const std::string& method() const { return method_; } | 211 const std::string& method() const { return method_; } |
| 215 void set_method(const std::string& method) { | 212 void set_method(const std::string& method); |
| 216 DCHECK(!is_pending_); | |
| 217 method_ = method; | |
| 218 } | |
| 219 | 213 |
| 220 // The referrer URL for the request. This header may actually be suppressed | 214 // The referrer URL for the request. This header may actually be suppressed |
| 221 // from the underlying network request for security reasons (e.g., a HTTPS | 215 // from the underlying network request for security reasons (e.g., a HTTPS |
| 222 // URL will not be sent as the referrer for a HTTP request). The referrer | 216 // URL will not be sent as the referrer for a HTTP request). The referrer |
| 223 // may only be changed before Start() is called. | 217 // may only be changed before Start() is called. |
| 224 const std::string& referrer() const { return referrer_; } | 218 const std::string& referrer() const { return referrer_; } |
| 225 void set_referrer(const std::string& referrer) { | 219 void set_referrer(const std::string& referrer); |
| 226 DCHECK(!is_pending_); | |
| 227 referrer_ = referrer; | |
| 228 } | |
| 229 | 220 |
| 230 // The delegate of the request. This value may be changed at any time, | 221 // The delegate of the request. This value may be changed at any time, |
| 231 // and it is permissible for it to be null. | 222 // and it is permissible for it to be null. |
| 232 Delegate* delegate() const { return delegate_; } | 223 Delegate* delegate() const { return delegate_; } |
| 233 void set_delegate(Delegate* delegate) { delegate_ = delegate; } | 224 void set_delegate(Delegate* delegate) { delegate_ = delegate; } |
| 234 | 225 |
| 235 // The data comprising the request message body is specified as a sequence of | 226 // The data comprising the request message body is specified as a sequence of |
| 236 // data segments and/or files containing data to upload. These methods may | 227 // data segments and/or files containing data to upload. These methods may |
| 237 // be called to construct the data sequence to upload, and they may only be | 228 // be called to construct the data sequence to upload, and they may only be |
| 238 // called before Start() is called. For POST requests, the user must call | 229 // called before Start() is called. For POST requests, the user must call |
| 239 // SetRequestHeaderBy{Id,Name} to set the Content-Type of the request to the | 230 // SetRequestHeaderBy{Id,Name} to set the Content-Type of the request to the |
| 240 // appropriate value before calling Start(). | 231 // appropriate value before calling Start(). |
| 241 // | 232 // |
| 242 // When uploading data, bytes_len must be non-zero. | 233 // When uploading data, bytes_len must be non-zero. |
| 243 // When uploading a file range, length must be non-zero. If length | 234 // When uploading a file range, length must be non-zero. If length |
| 244 // exceeds the end-of-file, the upload is clipped at end-of-file. | 235 // exceeds the end-of-file, the upload is clipped at end-of-file. |
| 245 void AppendBytesToUpload(const char* bytes, int bytes_len); | 236 void AppendBytesToUpload(const char* bytes, int bytes_len); |
| 246 void AppendFileRangeToUpload(const std::wstring& file_path, | 237 void AppendFileRangeToUpload(const std::wstring& file_path, |
| 247 uint64 offset, uint64 length); | 238 uint64 offset, uint64 length); |
| 248 void AppendFileToUpload(const std::wstring& file_path) { | 239 void AppendFileToUpload(const std::wstring& file_path) { |
| 249 AppendFileRangeToUpload(file_path, 0, kuint64max); | 240 AppendFileRangeToUpload(file_path, 0, kuint64max); |
| 250 } | 241 } |
| 251 | 242 |
| 252 // Set the upload data directly. | 243 // Set the upload data directly. |
| 253 void set_upload(net::UploadData* upload) { upload_ = upload; } | 244 void set_upload(net::UploadData* upload); |
| 254 | 245 |
| 255 // Get the upload data directly. | 246 // Get the upload data directly. |
| 256 net::UploadData* get_upload() { return upload_.get(); } | 247 net::UploadData* get_upload(); |
| 257 | 248 |
| 258 // Returns true if the request has a non-empty message body to upload. | 249 // Returns true if the request has a non-empty message body to upload. |
| 259 bool has_upload() const { return upload_ != NULL; } | 250 bool has_upload() const; |
| 260 | 251 |
| 261 // Set an extra request header by ID or name. These methods may only be | 252 // Set an extra request header by ID or name. These methods may only be |
| 262 // called before Start() is called. It is an error to call it later. | 253 // called before Start() is called. It is an error to call it later. |
| 263 void SetExtraRequestHeaderById(int header_id, const std::string& value, | 254 void SetExtraRequestHeaderById(int header_id, const std::string& value, |
| 264 bool overwrite); | 255 bool overwrite); |
| 265 void SetExtraRequestHeaderByName(const std::string& name, | 256 void SetExtraRequestHeaderByName(const std::string& name, |
| 266 const std::string& value, bool overwrite); | 257 const std::string& value, bool overwrite); |
| 267 | 258 |
| 268 // Sets all extra request headers, from a \r\n-delimited string. Any extra | 259 // Sets all extra request headers, from a \r\n-delimited string. Any extra |
| 269 // request headers set by other methods are overwritten by this method. This | 260 // request headers set by other methods are overwritten by this method. This |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 // responses, this may be a time well in the past. | 293 // responses, this may be a time well in the past. |
| 303 const base::Time& response_time() const { | 294 const base::Time& response_time() const { |
| 304 return response_info_.response_time; | 295 return response_info_.response_time; |
| 305 } | 296 } |
| 306 | 297 |
| 307 // Indicate if this response was fetched from disk cache. | 298 // Indicate if this response was fetched from disk cache. |
| 308 bool was_cached() const { return response_info_.was_cached; } | 299 bool was_cached() const { return response_info_.was_cached; } |
| 309 | 300 |
| 310 // Get all response headers, as a HttpResponseHeaders object. See comments | 301 // Get all response headers, as a HttpResponseHeaders object. See comments |
| 311 // in HttpResponseHeaders class as to the format of the data. | 302 // in HttpResponseHeaders class as to the format of the data. |
| 312 net::HttpResponseHeaders* response_headers() const { | 303 net::HttpResponseHeaders* response_headers() const; |
| 313 return response_info_.headers.get(); | |
| 314 } | |
| 315 | 304 |
| 316 // Get the SSL connection info. | 305 // Get the SSL connection info. |
| 317 const net::SSLInfo& ssl_info() const { | 306 const net::SSLInfo& ssl_info() const { |
| 318 return response_info_.ssl_info; | 307 return response_info_.ssl_info; |
| 319 } | 308 } |
| 320 | 309 |
| 321 // Returns the cookie values included in the response, if the request is one | 310 // Returns the cookie values included in the response, if the request is one |
| 322 // that can have cookies. Returns true if the request is a cookie-bearing | 311 // that can have cookies. Returns true if the request is a cookie-bearing |
| 323 // type, false otherwise. This method may only be called once the | 312 // type, false otherwise. This method may only be called once the |
| 324 // delegate's OnResponseStarted method has been called. | 313 // delegate's OnResponseStarted method has been called. |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 #undef HTTP_ATOM | 403 #undef HTTP_ATOM |
| 415 }; | 404 }; |
| 416 | 405 |
| 417 // Returns true if performance profiling should be enabled on the | 406 // Returns true if performance profiling should be enabled on the |
| 418 // URLRequestJob serving this request. | 407 // URLRequestJob serving this request. |
| 419 bool enable_profiling() const { return enable_profiling_; } | 408 bool enable_profiling() const { return enable_profiling_; } |
| 420 | 409 |
| 421 void set_enable_profiling(bool profiling) { enable_profiling_ = profiling; } | 410 void set_enable_profiling(bool profiling) { enable_profiling_ = profiling; } |
| 422 | 411 |
| 423 // Used to specify the context (cookie store, cache) for this request. | 412 // Used to specify the context (cookie store, cache) for this request. |
| 424 URLRequestContext* context() { return context_.get(); } | 413 URLRequestContext* context(); |
| 425 void set_context(URLRequestContext* context) { context_ = context; } | 414 void set_context(URLRequestContext* context); |
| 426 | 415 |
| 427 // Returns the expected content size if available | 416 // Returns the expected content size if available |
| 428 int64 GetExpectedContentSize() const; | 417 int64 GetExpectedContentSize() const; |
| 429 | 418 |
| 430 protected: | 419 protected: |
| 431 // Allow the URLRequestJob class to control the is_pending() flag. | 420 // Allow the URLRequestJob class to control the is_pending() flag. |
| 432 void set_is_pending(bool value) { is_pending_ = value; } | 421 void set_is_pending(bool value) { is_pending_ = value; } |
| 433 | 422 |
| 434 // Allow the URLRequestJob class to set our status too | 423 // Allow the URLRequestJob class to set our status too |
| 435 void set_status(const URLRequestStatus &value) { status_ = value; } | 424 void set_status(const URLRequestStatus &value) { status_ = value; } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 // infinite redirects. | 479 // infinite redirects. |
| 491 int redirect_limit_; | 480 int redirect_limit_; |
| 492 | 481 |
| 493 // Contextual information used for this request (can be NULL). | 482 // Contextual information used for this request (can be NULL). |
| 494 scoped_refptr<URLRequestContext> context_; | 483 scoped_refptr<URLRequestContext> context_; |
| 495 | 484 |
| 496 // Cached value for use after we've orphaned the job handling the | 485 // Cached value for use after we've orphaned the job handling the |
| 497 // first transaction in a request involving redirects. | 486 // first transaction in a request involving redirects. |
| 498 uint64 final_upload_progress_; | 487 uint64 final_upload_progress_; |
| 499 | 488 |
| 500 DISALLOW_EVIL_CONSTRUCTORS(URLRequest); | 489 DISALLOW_COPY_AND_ASSIGN(URLRequest); |
| 501 }; | 490 }; |
| 502 | 491 |
| 503 //----------------------------------------------------------------------------- | 492 //----------------------------------------------------------------------------- |
| 504 // To help ensure that all requests are cleaned up properly, we keep static | 493 // To help ensure that all requests are cleaned up properly, we keep static |
| 505 // counters of live objects. TODO(darin): Move this leak checking stuff into | 494 // counters of live objects. TODO(darin): Move this leak checking stuff into |
| 506 // a common place and generalize it so it can be used everywhere (Bug 566229). | 495 // a common place and generalize it so it can be used everywhere (Bug 566229). |
| 507 | 496 |
| 508 #ifndef NDEBUG | 497 #ifndef NDEBUG |
| 509 | 498 |
| 510 struct URLRequestMetrics { | 499 struct URLRequestMetrics { |
| 511 int object_count; | 500 int object_count; |
| 512 URLRequestMetrics() : object_count(0) {} | 501 URLRequestMetrics() : object_count(0) {} |
| 513 ~URLRequestMetrics() { | 502 ~URLRequestMetrics(); |
| 514 DLOG_IF(WARNING, object_count != 0) << | |
| 515 "Leaking " << object_count << " URLRequest object(s)"; | |
| 516 } | |
| 517 }; | 503 }; |
| 518 | 504 |
| 519 extern URLRequestMetrics url_request_metrics; | 505 extern URLRequestMetrics url_request_metrics; |
| 520 | 506 |
| 521 #define URLREQUEST_COUNT_CTOR() url_request_metrics.object_count++ | 507 #define URLREQUEST_COUNT_CTOR() url_request_metrics.object_count++ |
| 522 #define URLREQUEST_COUNT_DTOR() url_request_metrics.object_count-- | 508 #define URLREQUEST_COUNT_DTOR() url_request_metrics.object_count-- |
| 523 | 509 |
| 524 #else // disable leak checking in release builds... | 510 #else // disable leak checking in release builds... |
| 525 | 511 |
| 526 #define URLREQUEST_COUNT_CTOR() | 512 #define URLREQUEST_COUNT_CTOR() |
| 527 #define URLREQUEST_COUNT_DTOR() | 513 #define URLREQUEST_COUNT_DTOR() |
| 528 | 514 |
| 529 #endif | 515 #endif // #ifndef NDEBUG |
| 530 | |
| 531 | 516 |
| 532 #endif // NET_URL_REQUEST_URL_REQUEST_H_ | 517 #endif // NET_URL_REQUEST_URL_REQUEST_H_ |
| 533 | |
| OLD | NEW |