| Index: net/http/http_network_transaction.cc
|
| ===================================================================
|
| --- net/http/http_network_transaction.cc (revision 12402)
|
| +++ net/http/http_network_transaction.cc (working copy)
|
| @@ -35,7 +35,8 @@
|
|
|
| HttpNetworkTransaction::HttpNetworkTransaction(HttpNetworkSession* session,
|
| ClientSocketFactory* csf)
|
| - : ALLOW_THIS_IN_INITIALIZER_LIST(
|
| + : pending_auth_target_(HttpAuth::AUTH_NONE),
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(
|
| io_callback_(this, &HttpNetworkTransaction::OnIOComplete)),
|
| user_callback_(NULL),
|
| session_(session),
|
| @@ -92,20 +93,24 @@
|
| const std::wstring& username,
|
| const std::wstring& password,
|
| CompletionCallback* callback) {
|
| + HttpAuth::Target target = pending_auth_target_;
|
| + if (target == HttpAuth::AUTH_NONE) {
|
| + NOTREACHED();
|
| + return ERR_UNEXPECTED;
|
| + }
|
|
|
| - DCHECK(NeedAuth(HttpAuth::AUTH_PROXY) ||
|
| - NeedAuth(HttpAuth::AUTH_SERVER));
|
| + pending_auth_target_ = HttpAuth::AUTH_NONE;
|
|
|
| - // Figure out whether this username password is for proxy or server.
|
| - // Proxy gets set first, then server.
|
| - HttpAuth::Target target = NeedAuth(HttpAuth::AUTH_PROXY) ?
|
| - HttpAuth::AUTH_PROXY : HttpAuth::AUTH_SERVER;
|
| + DCHECK(auth_identity_[target].invalid ||
|
| + (username.empty() && password.empty()));
|
|
|
| - // Update the username/password.
|
| - auth_identity_[target].source = HttpAuth::IDENT_SRC_EXTERNAL;
|
| - auth_identity_[target].invalid = false;
|
| - auth_identity_[target].username = username;
|
| - auth_identity_[target].password = password;
|
| + if (auth_identity_[target].invalid) {
|
| + // Update the username/password.
|
| + auth_identity_[target].source = HttpAuth::IDENT_SRC_EXTERNAL;
|
| + auth_identity_[target].invalid = false;
|
| + auth_identity_[target].username = username;
|
| + auth_identity_[target].password = password;
|
| + }
|
|
|
| PrepareForAuthRestart(target);
|
|
|
| @@ -1094,8 +1099,6 @@
|
| }
|
|
|
| int rv = HandleAuthChallenge();
|
| - if (rv == WILL_RESTART_TRANSACTION)
|
| - return OK;
|
| if (rv != OK)
|
| return rv;
|
|
|
| @@ -1179,6 +1182,7 @@
|
| }
|
|
|
| void HttpNetworkTransaction::ResetStateForRestart() {
|
| + pending_auth_target_ = HttpAuth::AUTH_NONE;
|
| header_buf_.reset();
|
| header_buf_capacity_ = 0;
|
| header_buf_len_ = 0;
|
| @@ -1470,11 +1474,10 @@
|
| return OK;
|
| }
|
|
|
| - bool has_identity_to_try;
|
| if (auth_handler_[target]->NeedsIdentity()) {
|
| // Pick a new auth identity to try, by looking to the URL and auth cache.
|
| // If an identity to try is found, it is saved to auth_identity_[target].
|
| - has_identity_to_try = SelectNextAuthIdentityToTry(target);
|
| + SelectNextAuthIdentityToTry(target);
|
| } else {
|
| // Proceed with a null identity.
|
| //
|
| @@ -1484,19 +1487,17 @@
|
| auth_identity_[target].invalid = false;
|
| auth_identity_[target].username.clear();
|
| auth_identity_[target].password.clear();
|
| - has_identity_to_try = true;
|
| }
|
| - DCHECK(has_identity_to_try == !auth_identity_[target].invalid);
|
|
|
| - if (has_identity_to_try) {
|
| - DCHECK(user_callback_);
|
| - PrepareForAuthRestart(target);
|
| - return WILL_RESTART_TRANSACTION;
|
| + // Make a note that we are waiting for auth. This variable is inspected
|
| + // when the client calls RestartWithAuth() to pick up where we left off.
|
| + pending_auth_target_ = target;
|
| +
|
| + if (auth_identity_[target].invalid) {
|
| + // We have exhausted all identity possibilities, all we can do now is
|
| + // pass the challenge information back to the client.
|
| + PopulateAuthChallenge(target);
|
| }
|
| -
|
| - // We have exhausted all identity possibilities, all we can do now is
|
| - // pass the challenge information back to the client.
|
| - PopulateAuthChallenge(target);
|
| return OK;
|
| }
|
|
|
|
|