Chromium Code Reviews| Index: net/http/http_auth_controller.cc |
| diff --git a/net/http/http_auth_controller.cc b/net/http/http_auth_controller.cc |
| index f438ea46128bfe898b0de6017773799ce7ed00c1..8a342b82e7e88490fa4628eb240f078f1d4ca566 100644 |
| --- a/net/http/http_auth_controller.cc |
| +++ b/net/http/http_auth_controller.cc |
| @@ -273,26 +273,35 @@ int HttpAuthController::HandleAuthChallenge( |
| case HttpAuth::AUTHORIZATION_RESULT_ACCEPT: |
| break; |
| case HttpAuth::AUTHORIZATION_RESULT_INVALID: |
| - InvalidateCurrentHandler(); |
| + InvalidateCurrentHandler(INVALIDATE_HANDLER_AND_CACHED_CREDENTIALS); |
| break; |
| case HttpAuth::AUTHORIZATION_RESULT_REJECT: |
| HistogramAuthEvent(handler_.get(), AUTH_EVENT_REJECT); |
| - InvalidateCurrentHandler(); |
| + InvalidateCurrentHandler(INVALIDATE_HANDLER_AND_CACHED_CREDENTIALS); |
| break; |
| case HttpAuth::AUTHORIZATION_RESULT_STALE: |
| if (http_auth_cache_->UpdateStaleChallenge(auth_origin_, |
| handler_->realm(), |
| handler_->auth_scheme(), |
| challenge_used)) { |
| - handler_.reset(); |
| - identity_ = HttpAuth::Identity(); |
| + InvalidateCurrentHandler(INVALIDATE_HANDLER); |
| } else { |
| // It's possible that a server could incorrectly issue a stale |
| // response when the entry is not in the cache. Just evict the |
| // current value from the cache. |
| - InvalidateCurrentHandler(); |
| + InvalidateCurrentHandler(INVALIDATE_HANDLER_AND_CACHED_CREDENTIALS); |
| } |
| break; |
| + case HttpAuth::AUTHORIZATION_RESULT_DIFFERENT_REALM: |
| + // If the server asks for credentials for one realm and then |
| + // rejects them, we remove the credentials from the cache |
| + // unless it was in response to a preemptive authorization |
| + // header. |
|
wtc
2011/02/22 23:17:32
This comment is confusing because it seems self-co
cbentzel
2011/02/23 14:49:54
It means that the server returns a 401 after we pr
asanka
2011/02/23 18:06:40
I'll clarify the comment.
|
| + InvalidateCurrentHandler( |
| + (identity_.source == HttpAuth::IDENT_SRC_PATH_LOOKUP) ? |
| + INVALIDATE_HANDLER : |
| + INVALIDATE_HANDLER_AND_CACHED_CREDENTIALS); |
| + break; |
| default: |
| NOTREACHED(); |
| break; |
| @@ -403,10 +412,12 @@ bool HttpAuthController::HaveAuth() const { |
| return handler_.get() && !identity_.invalid; |
| } |
| -void HttpAuthController::InvalidateCurrentHandler() { |
| +void HttpAuthController::InvalidateCurrentHandler( |
| + InvalidateHandlerAction action) { |
| DCHECK(CalledOnValidThread()); |
| - InvalidateRejectedAuthFromCache(); |
| + if (action == INVALIDATE_HANDLER_AND_CACHED_CREDENTIALS) |
| + InvalidateRejectedAuthFromCache(); |
| handler_.reset(); |
| identity_ = HttpAuth::Identity(); |
| } |
| @@ -415,13 +426,6 @@ void HttpAuthController::InvalidateRejectedAuthFromCache() { |
| DCHECK(CalledOnValidThread()); |
| DCHECK(HaveAuth()); |
| - // TODO(eroman): this short-circuit can be relaxed. If the realm of |
| - // the preemptively used auth entry matches the realm of the subsequent |
| - // challenge, then we can invalidate the preemptively used entry. |
| - // Otherwise as-is we may send the failed credentials one extra time. |
| - if (identity_.source == HttpAuth::IDENT_SRC_PATH_LOOKUP) |
| - return; |
| - |
| // Clear the cache entry for the identity we just failed on. |
| // Note: we require the username/password to match before invalidating |
| // since the entry in the cache may be newer than what we used last time. |