| // 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 <utility> | 
 |  | 
 | #include "base/bind.h" | 
 | #include "base/bind_helpers.h" | 
 | #include "base/logging.h" | 
 | #include "net/base/net_errors.h" | 
 | #include "net/http/http_auth_challenge_tokenizer.h" | 
 | #include "net/log/net_log_event_type.h" | 
 |  | 
 | namespace net { | 
 |  | 
 | HttpAuthHandler::HttpAuthHandler() | 
 |     : auth_scheme_(HttpAuth::AUTH_SCHEME_MAX), | 
 |       score_(-1), | 
 |       target_(HttpAuth::AUTH_NONE), | 
 |       properties_(-1) { | 
 | } | 
 |  | 
 | HttpAuthHandler::~HttpAuthHandler() = default; | 
 |  | 
 | bool HttpAuthHandler::InitFromChallenge(HttpAuthChallengeTokenizer* challenge, | 
 |                                         HttpAuth::Target target, | 
 |                                         const SSLInfo& ssl_info, | 
 |                                         const GURL& origin, | 
 |                                         const NetLogWithSource& net_log) { | 
 |   origin_ = origin; | 
 |   target_ = target; | 
 |   score_ = -1; | 
 |   properties_ = -1; | 
 |   net_log_ = net_log; | 
 |  | 
 |   auth_challenge_ = challenge->challenge_text(); | 
 |   bool ok = Init(challenge, ssl_info); | 
 |  | 
 |   // 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 { | 
 |  | 
 | NetLogEventType EventTypeFromAuthTarget(HttpAuth::Target target) { | 
 |   switch (target) { | 
 |     case HttpAuth::AUTH_PROXY: | 
 |       return NetLogEventType::AUTH_PROXY; | 
 |     case HttpAuth::AUTH_SERVER: | 
 |       return NetLogEventType::AUTH_SERVER; | 
 |     default: | 
 |       NOTREACHED(); | 
 |       return NetLogEventType::CANCELLED; | 
 |   } | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | int HttpAuthHandler::GenerateAuthToken(const AuthCredentials* credentials, | 
 |                                        const HttpRequestInfo* request, | 
 |                                        CompletionOnceCallback callback, | 
 |                                        std::string* auth_token) { | 
 |   DCHECK(!callback.is_null()); | 
 |   DCHECK(request); | 
 |   DCHECK(credentials != NULL || AllowsDefaultCredentials()); | 
 |   DCHECK(auth_token != NULL); | 
 |   DCHECK(callback_.is_null()); | 
 |   callback_ = std::move(callback); | 
 |   net_log_.BeginEvent(EventTypeFromAuthTarget(target_)); | 
 |   int rv = GenerateAuthTokenImpl( | 
 |       credentials, request, | 
 |       base::BindOnce(&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) { | 
 |   CompletionOnceCallback callback = std::move(callback_); | 
 |   FinishGenerateAuthToken(); | 
 |   DCHECK(!callback.is_null()); | 
 |   std::move(callback).Run(rv); | 
 | } | 
 |  | 
 | void HttpAuthHandler::FinishGenerateAuthToken() { | 
 |   // TODO(cbentzel): Should this be done in OK case only? | 
 |   net_log_.EndEvent(EventTypeFromAuthTarget(target_)); | 
 |   callback_.Reset(); | 
 | } | 
 |  | 
 | }  // namespace net |