summaryrefslogtreecommitdiff
path: root/chromium/net/http/http_auth_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/http/http_auth_handler.cc')
-rw-r--r--chromium/net/http/http_auth_handler.cc108
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