Chromium Code Reviews| Index: net/url_request/url_request.cc |
| diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc |
| index 02667b5afe128d4eba237b2ecfc56c3dddff1767..dee35fae43f15028907219da722fd5f43dd34d46 100644 |
| --- a/net/url_request/url_request.cc |
| +++ b/net/url_request/url_request.cc |
| @@ -9,6 +9,7 @@ |
| #include "base/message_loop.h" |
| #include "base/metrics/stats_counters.h" |
| #include "base/synchronization/lock.h" |
| +#include "net/base/auth.h" |
| #include "net/base/host_port_pair.h" |
| #include "net/base/load_flags.h" |
| #include "net/base/net_errors.h" |
| @@ -144,7 +145,10 @@ URLRequest::URLRequest(const GURL& url, Delegate* delegate) |
| blocked_on_delegate_(false), |
| ALLOW_THIS_IN_INITIALIZER_LIST( |
| before_request_callback_(this, &URLRequest::BeforeRequestComplete)), |
| - has_notified_completion_(false) { |
| + has_notified_completion_(false), |
| + ALLOW_THIS_IN_INITIALIZER_LIST( |
| + auth_required_callback_( |
| + this, &URLRequest::NotifyAuthRequiredComplete)) { |
| SIMPLE_STATS_COUNTER("URLRequestCount"); |
| // Sanity check out environment. |
| @@ -770,11 +774,45 @@ void URLRequest::NotifyAuthRequired(AuthChallengeInfo* auth_info) { |
| // URLRequestTestHTTP.BasicAuthWithCookies. In both cases we observe a |
| // call sequence of OnBeforeSendHeaders -> OnSendHeaders -> |
| // OnBeforeSendHeaders. |
|
battre
2011/09/24 13:17:55
i think this comment becomes obsolete now. Could y
|
| - if (context_ && context_->network_delegate()) |
| - context_->network_delegate()->NotifyAuthRequired(this, *auth_info); |
| + int rv = OK; |
| + auth_info_ = auth_info; |
| + if (context_ && context_->network_delegate()) { |
| + rv = context_->network_delegate()->NotifyAuthRequired( |
| + this, *auth_info, &auth_required_callback_, &auth_credentials_); |
| + } |
| + |
| + if (rv == ERR_IO_PENDING) { |
| + SetBlockedOnDelegate(); |
|
battre
2011/09/24 13:17:55
the corresponding SetUnblockedOnDelegate(); is mis
cbentzel
2011/09/26 21:13:36
Done.
|
| + } else { |
| + NotifyAuthRequiredComplete(rv); |
| + } |
| +} |
| + |
| +void URLRequest::NotifyAuthRequiredComplete(int result) { |
| + // NotifyAuthRequired may be called multiple times, such as |
| + // when an authentication attempt fails. Clear out the data |
| + // so it can be reset on another round. |
| + AuthCredentials credentials = auth_credentials_; |
| + auth_credentials_ = AuthCredentials(); |
| + scoped_refptr<AuthChallengeInfo> auth_info; |
| + auth_info.swap(auth_info_); |
| + |
| + if (result != OK) |
| + return; |
| + |
| + // TODO(cbentzel): Should the ERR_EMPTY_RESPONSE be handled? This might |
| + // be equivalent to canceling authentication, |
|
battre
2011/09/24 13:17:55
probably yes
cbentzel
2011/09/26 21:13:36
Done.
|
| + |
| + // If the NetworkDelegate provided a username and password, try |
| + // using that. |
| + if (credentials.is_valid) { |
| + SetAuth(credentials.username, credentials.password); |
| + return; |
| + } |
| + // Otherwise, defer to the URLRequest Delegate. |
| if (delegate_) |
| - delegate_->OnAuthRequired(this, auth_info); |
| + delegate_->OnAuthRequired(this, auth_info.get()); |
| } |
| void URLRequest::NotifyCertificateRequested( |