Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / net / http / http_auth_handler.cc
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