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 <map> |
8 #include <string> | 9 #include <string> |
9 #include <vector> | 10 #include <vector> |
10 | 11 |
11 #include "base/file_path.h" | 12 #include "base/file_path.h" |
| 13 #include "base/linked_ptr.h" |
12 #include "base/logging.h" | 14 #include "base/logging.h" |
13 #include "base/ref_counted.h" | 15 #include "base/ref_counted.h" |
| 16 #include "base/scoped_ptr.h" |
14 #include "googleurl/src/gurl.h" | 17 #include "googleurl/src/gurl.h" |
15 #include "net/base/load_states.h" | 18 #include "net/base/load_states.h" |
16 #include "net/http/http_response_info.h" | 19 #include "net/http/http_response_info.h" |
17 #include "net/url_request/url_request_status.h" | 20 #include "net/url_request/url_request_status.h" |
18 | 21 |
19 namespace base { | 22 namespace base { |
20 class Time; | 23 class Time; |
21 } // namespace base | 24 } // namespace base |
22 | 25 |
23 namespace net { | 26 namespace net { |
(...skipping 17 matching lines...) Expand all Loading... |
41 // consumer, and the instance is not required to live on the heap or be | 44 // consumer, and the instance is not required to live on the heap or be |
42 // allocated in any special way. It is also valid to delete an URLRequest | 45 // allocated in any special way. It is also valid to delete an URLRequest |
43 // object during the handling of a callback to its delegate. Of course, once | 46 // object during the handling of a callback to its delegate. Of course, once |
44 // the URLRequest is deleted, no further callbacks to its delegate will occur. | 47 // the URLRequest is deleted, no further callbacks to its delegate will occur. |
45 // | 48 // |
46 // NOTE: All usage of all instances of this class should be on the same thread. | 49 // NOTE: All usage of all instances of this class should be on the same thread. |
47 // | 50 // |
48 class URLRequest { | 51 class URLRequest { |
49 public: | 52 public: |
50 // Derive from this class and add your own data members to associate extra | 53 // Derive from this class and add your own data members to associate extra |
51 // information with a URLRequest. Use user_data() and set_user_data() | 54 // information with a URLRequest. Use GetUserData(key) and SetUserData() |
52 class UserData { | 55 class UserData { |
53 public: | 56 public: |
54 UserData() {} | 57 UserData() {} |
55 virtual ~UserData() {} | 58 virtual ~UserData() {} |
56 }; | 59 }; |
57 | 60 |
58 // Callback function implemented by protocol handlers to create new jobs. | 61 // Callback function implemented by protocol handlers to create new jobs. |
59 // The factory may return NULL to indicate an error, which will cause other | 62 // The factory may return NULL to indicate an error, which will cause other |
60 // factories to be queried. If no factory handles the request, then the | 63 // factories to be queried. If no factory handles the request, then the |
61 // default job will be used. | 64 // default job will be used. |
62 typedef URLRequestJob* (ProtocolFactory)(URLRequest* request, | 65 typedef URLRequestJob* (ProtocolFactory)(URLRequest* request, |
63 const std::string& scheme); | 66 const std::string& scheme); |
64 | 67 |
65 // This class handles network interception. Use with | 68 // This class handles network interception. Use with |
66 // (Un)RegisterRequestInterceptor. | 69 // (Un)RegisterRequestInterceptor. |
67 class Interceptor { | 70 class Interceptor { |
68 public: | 71 public: |
69 virtual ~Interceptor() {} | 72 virtual ~Interceptor() {} |
70 | 73 |
71 // Called for every request made. Should return a new job to handle the | 74 // Called for every request made. Should return a new job to handle the |
72 // request if it should be intercepted, or NULL to allow the request to | 75 // request if it should be intercepted, or NULL to allow the request to |
73 // be handled in the normal manner. | 76 // be handled in the normal manner. |
74 virtual URLRequestJob* MaybeIntercept(URLRequest* request) = 0; | 77 virtual URLRequestJob* MaybeIntercept(URLRequest* request) = 0; |
| 78 |
| 79 // Called after having received a redirect response, but prior to the |
| 80 // the request delegate being informed of the redirect. Can return a new |
| 81 // job to replace the existing job if it should be intercepted, or NULL |
| 82 // to allow the normal handling to continue. If a new job is provided, |
| 83 // the delegate never sees the original redirect response, instead the |
| 84 // response produced by the intercept job will be returned. |
| 85 virtual URLRequestJob* MaybeInterceptRedirect(URLRequest* request, |
| 86 const GURL& location) { |
| 87 return NULL; |
| 88 } |
| 89 |
| 90 // Called after having received a final response, but prior to the |
| 91 // the request delegate being informed of the response. This is also |
| 92 // called when there is no server response at all to allow interception |
| 93 // on dns or network errors. Can return a new job to replace the existing |
| 94 // job if it should be intercepted, or NULL to allow the normal handling to |
| 95 // continue. If a new job is provided, the delegate never sees the original |
| 96 // response, instead the response produced by the intercept job will be |
| 97 // returned. |
| 98 virtual URLRequestJob* MaybeInterceptResponse(URLRequest* request) { |
| 99 return NULL; |
| 100 } |
75 }; | 101 }; |
76 | 102 |
77 // The delegate's methods are called from the message loop of the thread | 103 // The delegate's methods are called from the message loop of the thread |
78 // on which the request's Start() method is called. See above for the | 104 // on which the request's Start() method is called. See above for the |
79 // ordering of callbacks. | 105 // ordering of callbacks. |
80 // | 106 // |
81 // The callbacks will be called in the following order: | 107 // The callbacks will be called in the following order: |
82 // Start() | 108 // Start() |
83 // - OnReceivedRedirect* (zero or more calls, for the number of redirects) | 109 // - OnReceivedRedirect* (zero or more calls, for the number of redirects) |
84 // - OnAuthRequired* (zero or more calls, for the number of | 110 // - OnAuthRequired* (zero or more calls, for the number of |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 }; | 176 }; |
151 | 177 |
152 // Initialize an URL request. | 178 // Initialize an URL request. |
153 URLRequest(const GURL& url, Delegate* delegate); | 179 URLRequest(const GURL& url, Delegate* delegate); |
154 | 180 |
155 // If destroyed after Start() has been called but while IO is pending, | 181 // If destroyed after Start() has been called but while IO is pending, |
156 // then the request will be effectively canceled and the delegate | 182 // then the request will be effectively canceled and the delegate |
157 // will not have any more of its methods called. | 183 // will not have any more of its methods called. |
158 ~URLRequest(); | 184 ~URLRequest(); |
159 | 185 |
160 // The user data allows the owner to associate data with this request. | 186 // The user data allows the clients to associate data with this request. |
161 // This request will TAKE OWNERSHIP of the given pointer, and will delete | 187 // Multiple user data values can be stored under different keys. |
162 // the object if it is changed or the request is destroyed. | 188 // This request will TAKE OWNERSHIP of the given data pointer, and will |
163 UserData* user_data() const { | 189 // delete the object if it is changed or the request is destroyed. |
164 return user_data_; | 190 UserData* GetUserData(void* key) const; |
165 } | 191 void SetUserData(void* key, UserData* data); |
166 void set_user_data(UserData* user_data) { | |
167 if (user_data_) | |
168 delete user_data_; | |
169 user_data_ = user_data; | |
170 } | |
171 | 192 |
172 // Registers a new protocol handler for the given scheme. If the scheme is | 193 // Registers a new protocol handler for the given scheme. If the scheme is |
173 // already handled, this will overwrite the given factory. To delete the | 194 // already handled, this will overwrite the given factory. To delete the |
174 // protocol factory, use NULL for the factory BUT this WILL NOT put back | 195 // protocol factory, use NULL for the factory BUT this WILL NOT put back |
175 // any previously registered protocol factory. It will have returned | 196 // any previously registered protocol factory. It will have returned |
176 // the previously registered factory (or NULL if none is registered) when | 197 // the previously registered factory (or NULL if none is registered) when |
177 // the scheme was first registered so that the caller can manually put it | 198 // the scheme was first registered so that the caller can manually put it |
178 // back if desired. | 199 // back if desired. |
179 // | 200 // |
180 // The scheme must be all-lowercase ASCII. See the ProtocolFactory | 201 // The scheme must be all-lowercase ASCII. See the ProtocolFactory |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 // Allow the URLRequestJob class to control the is_pending() flag. | 464 // Allow the URLRequestJob class to control the is_pending() flag. |
444 void set_is_pending(bool value) { is_pending_ = value; } | 465 void set_is_pending(bool value) { is_pending_ = value; } |
445 | 466 |
446 // Allow the URLRequestJob class to set our status too | 467 // Allow the URLRequestJob class to set our status too |
447 void set_status(const URLRequestStatus& value) { status_ = value; } | 468 void set_status(const URLRequestStatus& value) { status_ = value; } |
448 | 469 |
449 // Allow the URLRequestJob to redirect this request. Returns net::OK if | 470 // Allow the URLRequestJob to redirect this request. Returns net::OK if |
450 // successful, otherwise an error code is returned. | 471 // successful, otherwise an error code is returned. |
451 int Redirect(const GURL& location, int http_status_code); | 472 int Redirect(const GURL& location, int http_status_code); |
452 | 473 |
| 474 // Called by URLRequestJob to allow interception when a redirect occurs. |
| 475 void ReceivedRedirect(const GURL& location); |
| 476 |
| 477 // Called by URLRequestJob to allow interception when the final response |
| 478 // occurs. |
| 479 void ResponseStarted(); |
| 480 |
| 481 // Allow an interceptor's URLRequestJob to restart this request. |
| 482 // Should only be called if the original job has not started a resposne. |
| 483 void Restart(); |
| 484 |
453 private: | 485 private: |
454 friend class URLRequestJob; | 486 friend class URLRequestJob; |
455 | 487 |
| 488 void StartJob(URLRequestJob* job); |
| 489 void RestartWithJob(URLRequestJob *job); |
| 490 |
456 // Detaches the job from this request in preparation for this object going | 491 // Detaches the job from this request in preparation for this object going |
457 // away or the job being replaced. The job will not call us back when it has | 492 // away or the job being replaced. The job will not call us back when it has |
458 // been orphaned. | 493 // been orphaned. |
459 void OrphanJob(); | 494 void OrphanJob(); |
460 | 495 |
461 // Cancels the request and set the error and ssl info for this request to the | 496 // Cancels the request and set the error and ssl info for this request to the |
462 // passed values. | 497 // passed values. |
463 void DoCancel(int os_error, const net::SSLInfo& ssl_info); | 498 void DoCancel(int os_error, const net::SSLInfo& ssl_info); |
464 | 499 |
465 // Discard headers which have meaning in POST (Content-Length, Content-Type, | 500 // Discard headers which have meaning in POST (Content-Length, Content-Type, |
(...skipping 23 matching lines...) Expand all Loading... |
489 URLRequestStatus status_; | 524 URLRequestStatus status_; |
490 | 525 |
491 // The HTTP response info, lazily initialized. | 526 // The HTTP response info, lazily initialized. |
492 net::HttpResponseInfo response_info_; | 527 net::HttpResponseInfo response_info_; |
493 | 528 |
494 // Tells us whether the job is outstanding. This is true from the time | 529 // Tells us whether the job is outstanding. This is true from the time |
495 // Start() is called to the time we dispatch RequestComplete and indicates | 530 // Start() is called to the time we dispatch RequestComplete and indicates |
496 // whether the job is active. | 531 // whether the job is active. |
497 bool is_pending_; | 532 bool is_pending_; |
498 | 533 |
499 // Externally-defined data associated with this request | 534 // Externally-defined data accessible by key |
500 UserData* user_data_; | 535 typedef std::map<void*, linked_ptr<UserData> > UserDataMap; |
| 536 UserDataMap user_data_; |
501 | 537 |
502 // Whether to enable performance profiling on the job serving this request. | 538 // Whether to enable performance profiling on the job serving this request. |
503 bool enable_profiling_; | 539 bool enable_profiling_; |
504 | 540 |
505 // Number of times we're willing to redirect. Used to guard against | 541 // Number of times we're willing to redirect. Used to guard against |
506 // infinite redirects. | 542 // infinite redirects. |
507 int redirect_limit_; | 543 int redirect_limit_; |
508 | 544 |
509 // Contextual information used for this request (can be NULL). | 545 // Contextual information used for this request (can be NULL). |
510 scoped_refptr<URLRequestContext> context_; | 546 scoped_refptr<URLRequestContext> context_; |
(...skipping 28 matching lines...) Expand all Loading... |
539 #define URLREQUEST_COUNT_DTOR() url_request_metrics.object_count-- | 575 #define URLREQUEST_COUNT_DTOR() url_request_metrics.object_count-- |
540 | 576 |
541 #else // disable leak checking in release builds... | 577 #else // disable leak checking in release builds... |
542 | 578 |
543 #define URLREQUEST_COUNT_CTOR() | 579 #define URLREQUEST_COUNT_CTOR() |
544 #define URLREQUEST_COUNT_DTOR() | 580 #define URLREQUEST_COUNT_DTOR() |
545 | 581 |
546 #endif // #ifndef NDEBUG | 582 #endif // #ifndef NDEBUG |
547 | 583 |
548 #endif // NET_URL_REQUEST_URL_REQUEST_H_ | 584 #endif // NET_URL_REQUEST_URL_REQUEST_H_ |
OLD | NEW |