diff options
Diffstat (limited to 'chromium/net/http/http_auth_handler.cc')
-rw-r--r-- | chromium/net/http/http_auth_handler.cc | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/chromium/net/http/http_auth_handler.cc b/chromium/net/http/http_auth_handler.cc new file mode 100644 index 00000000000..ab809faefae --- /dev/null +++ b/chromium/net/http/http_auth_handler.cc @@ -0,0 +1,108 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/http/http_auth_handler.h" + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/logging.h" +#include "net/base/net_errors.h" + +namespace net { + +HttpAuthHandler::HttpAuthHandler() + : auth_scheme_(HttpAuth::AUTH_SCHEME_MAX), + score_(-1), + target_(HttpAuth::AUTH_NONE), + properties_(-1) { +} + +HttpAuthHandler::~HttpAuthHandler() { +} + +bool HttpAuthHandler::InitFromChallenge( + HttpAuth::ChallengeTokenizer* challenge, + HttpAuth::Target target, + const GURL& origin, + const BoundNetLog& net_log) { + origin_ = origin; + target_ = target; + score_ = -1; + properties_ = -1; + net_log_ = net_log; + + auth_challenge_ = challenge->challenge_text(); + bool ok = Init(challenge); + + // Init() is expected to set the scheme, realm, score, and properties. The + // realm may be empty. + DCHECK(!ok || score_ != -1); + DCHECK(!ok || properties_ != -1); + DCHECK(!ok || auth_scheme_ != HttpAuth::AUTH_SCHEME_MAX); + + return ok; +} + +namespace { + +NetLog::EventType EventTypeFromAuthTarget(HttpAuth::Target target) { + switch (target) { + case HttpAuth::AUTH_PROXY: + return NetLog::TYPE_AUTH_PROXY; + case HttpAuth::AUTH_SERVER: + return NetLog::TYPE_AUTH_SERVER; + default: + NOTREACHED(); + return NetLog::TYPE_CANCELLED; + } +} + +} // namespace + +int HttpAuthHandler::GenerateAuthToken( + const AuthCredentials* credentials, const HttpRequestInfo* request, + const CompletionCallback& callback, std::string* auth_token) { + // TODO(cbentzel): Enforce non-NULL callback after cleaning up SocketStream. + DCHECK(request); + DCHECK(credentials != NULL || AllowsDefaultCredentials()); + DCHECK(auth_token != NULL); + DCHECK(callback_.is_null()); + callback_ = callback; + net_log_.BeginEvent(EventTypeFromAuthTarget(target_)); + int rv = GenerateAuthTokenImpl( + credentials, request, + base::Bind(&HttpAuthHandler::OnGenerateAuthTokenComplete, + base::Unretained(this)), + auth_token); + if (rv != ERR_IO_PENDING) + FinishGenerateAuthToken(); + return rv; +} + +bool HttpAuthHandler::NeedsIdentity() { + return true; +} + +bool HttpAuthHandler::AllowsDefaultCredentials() { + return false; +} + +bool HttpAuthHandler::AllowsExplicitCredentials() { + return true; +} + +void HttpAuthHandler::OnGenerateAuthTokenComplete(int rv) { + CompletionCallback callback = callback_; + FinishGenerateAuthToken(); + if (!callback.is_null()) + callback.Run(rv); +} + +void HttpAuthHandler::FinishGenerateAuthToken() { + // TOOD(cbentzel): Should this be done in OK case only? + net_log_.EndEvent(EventTypeFromAuthTarget(target_)); + callback_.Reset(); +} + +} // namespace net |