Home | History | Annotate | Download | only in http
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "net/http/http_auth_handler.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/bind_helpers.h"
      9 #include "base/logging.h"
     10 #include "net/base/net_errors.h"
     11 #include "net/http/http_auth_challenge_tokenizer.h"
     12 
     13 namespace net {
     14 
     15 HttpAuthHandler::HttpAuthHandler()
     16     : auth_scheme_(HttpAuth::AUTH_SCHEME_MAX),
     17       score_(-1),
     18       target_(HttpAuth::AUTH_NONE),
     19       properties_(-1) {
     20 }
     21 
     22 HttpAuthHandler::~HttpAuthHandler() {
     23 }
     24 
     25 bool HttpAuthHandler::InitFromChallenge(
     26     HttpAuthChallengeTokenizer* challenge,
     27     HttpAuth::Target target,
     28     const GURL& origin,
     29     const BoundNetLog& net_log) {
     30   origin_ = origin;
     31   target_ = target;
     32   score_ = -1;
     33   properties_ = -1;
     34   net_log_ = net_log;
     35 
     36   auth_challenge_ = challenge->challenge_text();
     37   bool ok = Init(challenge);
     38 
     39   // Init() is expected to set the scheme, realm, score, and properties.  The
     40   // realm may be empty.
     41   DCHECK(!ok || score_ != -1);
     42   DCHECK(!ok || properties_ != -1);
     43   DCHECK(!ok || auth_scheme_ != HttpAuth::AUTH_SCHEME_MAX);
     44 
     45   return ok;
     46 }
     47 
     48 namespace {
     49 
     50 NetLog::EventType EventTypeFromAuthTarget(HttpAuth::Target target) {
     51   switch (target) {
     52     case HttpAuth::AUTH_PROXY:
     53       return NetLog::TYPE_AUTH_PROXY;
     54     case HttpAuth::AUTH_SERVER:
     55       return NetLog::TYPE_AUTH_SERVER;
     56     default:
     57       NOTREACHED();
     58       return NetLog::TYPE_CANCELLED;
     59   }
     60 }
     61 
     62 }  // namespace
     63 
     64 int HttpAuthHandler::GenerateAuthToken(
     65     const AuthCredentials* credentials, const HttpRequestInfo* request,
     66     const CompletionCallback& callback, std::string* auth_token) {
     67   // TODO(cbentzel): Enforce non-NULL callback after cleaning up SocketStream.
     68   DCHECK(request);
     69   DCHECK(credentials != NULL || AllowsDefaultCredentials());
     70   DCHECK(auth_token != NULL);
     71   DCHECK(callback_.is_null());
     72   callback_ = callback;
     73   net_log_.BeginEvent(EventTypeFromAuthTarget(target_));
     74   int rv = GenerateAuthTokenImpl(
     75       credentials, request,
     76       base::Bind(&HttpAuthHandler::OnGenerateAuthTokenComplete,
     77                  base::Unretained(this)),
     78       auth_token);
     79   if (rv != ERR_IO_PENDING)
     80     FinishGenerateAuthToken();
     81   return rv;
     82 }
     83 
     84 bool HttpAuthHandler::NeedsIdentity() {
     85   return true;
     86 }
     87 
     88 bool HttpAuthHandler::AllowsDefaultCredentials() {
     89   return false;
     90 }
     91 
     92 bool HttpAuthHandler::AllowsExplicitCredentials() {
     93   return true;
     94 }
     95 
     96 void HttpAuthHandler::OnGenerateAuthTokenComplete(int rv) {
     97   CompletionCallback callback = callback_;
     98   FinishGenerateAuthToken();
     99   if (!callback.is_null())
    100     callback.Run(rv);
    101 }
    102 
    103 void HttpAuthHandler::FinishGenerateAuthToken() {
    104   // TOOD(cbentzel): Should this be done in OK case only?
    105   net_log_.EndEvent(EventTypeFromAuthTarget(target_));
    106   callback_.Reset();
    107 }
    108 
    109 }  // namespace net
    110