Index: net/http/http_auth.cc |
diff --git a/net/http/http_auth.cc b/net/http/http_auth.cc |
index 295a988b5bc58c6ba2a4400292bcf415ab276ede..f8b826dc33120932d35e68a3ea160299a69514d4 100644 |
--- a/net/http/http_auth.cc |
+++ b/net/http/http_auth.cc |
@@ -4,168 +4,17 @@ |
#include "net/http/http_auth.h" |
-#include <algorithm> |
- |
#include "base/basictypes.h" |
-#include "base/bind.h" |
-#include "base/strings/string_tokenizer.h" |
#include "base/strings/string_util.h" |
-#include "base/values.h" |
-#include "net/base/net_errors.h" |
-#include "net/http/http_auth_challenge_tokenizer.h" |
-#include "net/http/http_auth_handler.h" |
-#include "net/http/http_auth_handler_factory.h" |
-#include "net/http/http_auth_scheme_set.h" |
#include "net/http/http_request_headers.h" |
-#include "net/http/http_response_headers.h" |
-#include "net/http/http_util.h" |
namespace net { |
-namespace { |
- |
-// Hardcoded map of HTTP authentication scheme priorities. Higher priorities are |
-// preferred over lower. |
-struct SchemePriority { |
- const char* scheme; |
- int priority; |
-} kSchemeScores[] = { |
- {"basic", 1}, |
- {"digest", 2}, |
- {"ntlm", 3}, |
- {"negotiate", 4}, |
-}; |
- |
-// Priority assigned to unknown authentication schemes. They are currently |
-// ranked lower than Basic, which might be a bit too conservative. |
-const int kSchemePriorityDefault = 0; |
- |
-// Not a valid priority. |
-const int kSchemePriorityInvalid = -1; |
- |
-// Higher priority schemes are preferred over lower priority schemes. |
-int GetSchemePriority(const std::string& scheme) { |
- DCHECK(HttpAuth::IsValidNormalizedScheme(scheme)); |
- for (const auto& iter : kSchemeScores) { |
- if (scheme == iter.scheme) |
- return iter.priority; |
- } |
- return kSchemePriorityDefault; |
-} |
- |
-scoped_ptr<base::Value> AuthHandlerCreationFailureParams( |
- const std::string* challenge, |
- int error, |
- NetLogCaptureMode capture_mode) { |
- scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
- dict->SetString("challenge", *challenge); |
- dict->SetInteger("net_error", error); |
- return dict.Pass(); |
-} |
- |
-} // namespace |
- |
HttpAuth::Identity::Identity() : source(IDENT_SRC_NONE), invalid(true) {} |
HttpAuth::Identity::~Identity() {} |
// static |
-void HttpAuth::ChooseBestChallenge( |
- HttpAuthHandlerFactory* http_auth_handler_factory, |
- const HttpResponseHeaders* headers, |
- Target target, |
- const GURL& origin, |
- const HttpAuthSchemeSet& disabled_schemes, |
- const BoundNetLog& net_log, |
- scoped_ptr<HttpAuthHandler>* handler) { |
- DCHECK(http_auth_handler_factory); |
- DCHECK(!handler->get()); |
- |
- int best_priority = kSchemePriorityInvalid; |
- scoped_ptr<HttpAuthHandler> best; |
- const std::string header_name = GetChallengeHeaderName(target); |
- std::string cur_challenge; |
- void* iter = nullptr; |
- |
- while (headers->EnumerateHeader(&iter, header_name, &cur_challenge)) { |
- HttpAuthChallengeTokenizer challenge_tokenizer(cur_challenge.begin(), |
- cur_challenge.end()); |
- std::string cur_auth_scheme = challenge_tokenizer.NormalizedScheme(); |
- if (cur_auth_scheme.empty()) |
- continue; |
- |
- if (disabled_schemes.Contains(cur_auth_scheme)) |
- continue; |
- |
- // Always prefer the highest priority scheme available. If two handlers are |
- // of equal priority, then the handler based on the earlier challenge wins. |
- int cur_priority = GetSchemePriority(cur_auth_scheme); |
- if (best.get() && best_priority >= cur_priority) |
- continue; |
- |
- // Immediately trying to create a handler may be wasteful because we may see |
- // a higher ranking challenge later on in the headers. However, this is |
- // rare. Servers typically specify higher priority schemes before lower |
- // priority schemes. |
- scoped_ptr<HttpAuthHandler> current_handler; |
- current_handler = http_auth_handler_factory->CreateAuthHandlerForScheme( |
- challenge_tokenizer.NormalizedScheme()); |
- if (!current_handler) { |
- net_log.AddEvent(NetLog::TYPE_AUTH_HANDLER_CREATION_FAILURE, |
- base::Bind(&AuthHandlerCreationFailureParams, |
- &cur_challenge, ERR_UNSUPPORTED_AUTH_SCHEME)); |
- continue; |
- } |
- int rv = current_handler->HandleInitialChallenge(challenge_tokenizer, |
- target, origin, net_log); |
- if (rv != OK) { |
- net_log.AddEvent( |
- NetLog::TYPE_AUTH_HANDLER_CREATION_FAILURE, |
- base::Bind(&AuthHandlerCreationFailureParams, &cur_challenge, rv)); |
- continue; |
- } |
- DCHECK(current_handler.get()); |
- DCHECK_EQ(cur_auth_scheme, current_handler->auth_scheme()); |
- best.swap(current_handler); |
- best_priority = cur_priority; |
- } |
- handler->swap(best); |
-} |
- |
-// static |
-HttpAuth::AuthorizationResult HttpAuth::HandleChallengeResponse( |
- HttpAuthHandler* handler, |
- const HttpResponseHeaders* headers, |
- Target target, |
- const HttpAuthSchemeSet& disabled_schemes, |
- std::string* challenge_used) { |
- DCHECK(handler); |
- DCHECK(headers); |
- DCHECK(challenge_used); |
- challenge_used->clear(); |
- const std::string& current_scheme = handler->auth_scheme(); |
- if (disabled_schemes.Contains(current_scheme)) |
- return HttpAuth::AUTHORIZATION_RESULT_REJECT; |
- const std::string header_name = GetChallengeHeaderName(target); |
- void* iter = NULL; |
- std::string challenge; |
- HttpAuth::AuthorizationResult authorization_result = |
- HttpAuth::AUTHORIZATION_RESULT_INVALID; |
- while (headers->EnumerateHeader(&iter, header_name, &challenge)) { |
- HttpAuthChallengeTokenizer props(challenge.begin(), challenge.end()); |
- if (!props.SchemeIs(current_scheme)) |
- continue; |
- authorization_result = handler->HandleAnotherChallenge(props); |
- if (authorization_result != HttpAuth::AUTHORIZATION_RESULT_INVALID) { |
- *challenge_used = challenge; |
- return authorization_result; |
- } |
- } |
- // Finding no matches is equivalent to rejection. |
- return HttpAuth::AUTHORIZATION_RESULT_REJECT; |
-} |
- |
-// static |
std::string HttpAuth::GetChallengeHeaderName(Target target) { |
switch (target) { |
case AUTH_PROXY: |