1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set> 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/mock_host_resolver.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_errors.h" 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_auth.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/http/http_auth_filter.h" 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_auth_handler.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/http/http_auth_handler_factory.h" 173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/http/http_auth_handler_mock.h" 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_response_headers.h" 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_util.h" 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "net/http/mock_allow_url_security_manager.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net { 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace { 263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickHttpAuthHandlerMock* CreateMockHandler(bool connection_based) { 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HttpAuthHandlerMock* auth_handler = new HttpAuthHandlerMock(); 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick auth_handler->set_connection_based(connection_based); 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string challenge_text = "Basic"; 313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HttpAuth::ChallengeTokenizer challenge(challenge_text.begin(), 323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick challenge_text.end()); 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL origin("www.example.com"); 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(auth_handler->InitFromChallenge(&challenge, 353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HttpAuth::AUTH_SERVER, 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick origin, 373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BoundNetLog())); 383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return auth_handler; 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickHttpResponseHeaders* HeadersFromResponseText(const std::string& response) { 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return new HttpResponseHeaders( 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HttpUtil::AssembleRawHeaders(response.c_str(), response.length())); 443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 46731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickHttpAuth::AuthorizationResult HandleChallengeResponse( 47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool connection_based, 48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& headers_text, 49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string* challenge_used) { 50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_ptr<HttpAuthHandlerMock> mock_handler( 51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CreateMockHandler(connection_based)); 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::set<HttpAuth::Scheme> disabled_schemes; 53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<HttpResponseHeaders> headers( 54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HeadersFromResponseText(headers_text)); 55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return HttpAuth::HandleChallengeResponse( 56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mock_handler.get(), 57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick headers.get(), 58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuth::AUTH_SERVER, 59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick disabled_schemes, 60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick challenge_used); 61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} // namespace 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpAuthTest, ChooseBestChallenge) { 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static const struct { 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* headers; 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::Scheme challenge_scheme; 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const char* challenge_realm; 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } tests[] = { 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Basic is the only challenge type, pick it. 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Y: Digest realm=\"X\", nonce=\"aaaaaaaaaa\"\n" 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "www-authenticate: Basic realm=\"BasicRealm\"\n", 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SCHEME_BASIC, 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "BasicRealm", 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Fake is the only challenge type, but it is unsupported. 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Y: Digest realm=\"FooBar\", nonce=\"aaaaaaaaaa\"\n" 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "www-authenticate: Fake realm=\"FooBar\"\n", 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SCHEME_MAX, 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Pick Digest over Basic. 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "www-authenticate: Basic realm=\"FooBar\"\n" 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "www-authenticate: Fake realm=\"FooBar\"\n" 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "www-authenticate: nonce=\"aaaaaaaaaa\"\n" 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "www-authenticate: Digest realm=\"DigestRealm\", nonce=\"aaaaaaaaaa\"\n", 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SCHEME_DIGEST, 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "DigestRealm", 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Handle an empty header correctly. 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Y: Digest realm=\"X\", nonce=\"aaaaaaaaaa\"\n" 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "www-authenticate:\n", 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SCHEME_MAX, 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }, 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott { 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Choose Negotiate over NTLM on all platforms. 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(ahendrickson): This may be flaky on Linux and OSX as it 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // relies on being able to load one of the known .so files 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // for gssapi. 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "WWW-Authenticate: Negotiate\n" 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "WWW-Authenticate: NTLM\n", 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HttpAuth::AUTH_SCHEME_NEGOTIATE, 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "", 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GURL origin("http://www.example.com"); 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::set<HttpAuth::Scheme> disabled_schemes; 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MockAllowURLSecurityManager url_security_manager; 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_ptr<HostResolver> host_resolver(new MockHostResolver()); 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<HttpAuthHandlerRegistryFactory> http_auth_handler_factory( 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuthHandlerFactory::CreateDefault(host_resolver.get())); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch http_auth_handler_factory->SetURLSecurityManager( 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "negotiate", &url_security_manager); 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Make a HttpResponseHeaders object. 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string headers_with_status_line("HTTP/1.1 401 Unauthorized\n"); 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott headers_with_status_line += tests[i].headers; 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_refptr<HttpResponseHeaders> headers( 1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick HeadersFromResponseText(headers_with_status_line)); 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<HttpAuthHandler> handler; 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpAuth::ChooseBestChallenge(http_auth_handler_factory.get(), 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch headers.get(), 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuth::AUTH_SERVER, 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott origin, 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch disabled_schemes, 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BoundNetLog(), 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott &handler); 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (handler.get()) { 14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(tests[i].challenge_scheme, handler->auth_scheme()); 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ(tests[i].challenge_realm, handler->realm().c_str()); 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } else { 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(HttpAuth::AUTH_SCHEME_MAX, tests[i].challenge_scheme); 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("", tests[i].challenge_realm); 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 152731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(HttpAuthTest, HandleChallengeResponse) { 1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string challenge_used; 154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* const kMockChallenge = 155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "HTTP/1.1 401 Unauthorized\n" 156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "WWW-Authenticate: Mock token_here\n"; 157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* const kBasicChallenge = 158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "HTTP/1.1 401 Unauthorized\n" 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "WWW-Authenticate: Basic realm=\"happy\"\n"; 160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* const kMissingChallenge = 161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "HTTP/1.1 401 Unauthorized\n"; 162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* const kEmptyChallenge = 163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "HTTP/1.1 401 Unauthorized\n" 164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "WWW-Authenticate: \n"; 165513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* const kBasicAndMockChallenges = 166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "HTTP/1.1 401 Unauthorized\n" 167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "WWW-Authenticate: Basic realm=\"happy\"\n" 168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "WWW-Authenticate: Mock token_here\n"; 169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* const kTwoMockChallenges = 170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "HTTP/1.1 401 Unauthorized\n" 171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "WWW-Authenticate: Mock token_a\n" 172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "WWW-Authenticate: Mock token_b\n"; 173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Request based schemes should treat any new challenges as rejections of the 175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // previous authentication attempt. (There is a slight exception for digest 176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // authentication and the stale parameter, but that is covered in the 177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // http_auth_handler_digest_unittests). 178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ( 179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuth::AUTHORIZATION_RESULT_REJECT, 180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HandleChallengeResponse(false, kMockChallenge, &challenge_used)); 1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ("Mock token_here", challenge_used); 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ( 184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuth::AUTHORIZATION_RESULT_REJECT, 185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HandleChallengeResponse(false, kBasicChallenge, &challenge_used)); 186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ("", challenge_used); 187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ( 189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuth::AUTHORIZATION_RESULT_REJECT, 190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HandleChallengeResponse(false, kMissingChallenge, &challenge_used)); 191731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ("", challenge_used); 192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ( 194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuth::AUTHORIZATION_RESULT_REJECT, 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HandleChallengeResponse(false, kEmptyChallenge, &challenge_used)); 196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ("", challenge_used); 197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ( 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuth::AUTHORIZATION_RESULT_REJECT, 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HandleChallengeResponse(false, kBasicAndMockChallenges, &challenge_used)); 2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ("Mock token_here", challenge_used); 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ( 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuth::AUTHORIZATION_RESULT_REJECT, 205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HandleChallengeResponse(false, kTwoMockChallenges, &challenge_used)); 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ("Mock token_a", challenge_used); 207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Connection based schemes will treat new auth challenges for the same scheme 209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // as acceptance (and continuance) of the current approach. If there are 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // no auth challenges for the same scheme, the response will be treated as 211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // a rejection. 212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ( 213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuth::AUTHORIZATION_RESULT_ACCEPT, 214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HandleChallengeResponse(true, kMockChallenge, &challenge_used)); 215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ("Mock token_here", challenge_used); 216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ( 218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuth::AUTHORIZATION_RESULT_REJECT, 219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HandleChallengeResponse(true, kBasicChallenge, &challenge_used)); 220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ("", challenge_used); 221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ( 223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuth::AUTHORIZATION_RESULT_REJECT, 224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HandleChallengeResponse(true, kMissingChallenge, &challenge_used)); 225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ("", challenge_used); 226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ( 228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuth::AUTHORIZATION_RESULT_REJECT, 229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HandleChallengeResponse(true, kEmptyChallenge, &challenge_used)); 230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ("", challenge_used); 231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ( 233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuth::AUTHORIZATION_RESULT_ACCEPT, 234731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HandleChallengeResponse(true, kBasicAndMockChallenges, &challenge_used)); 235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ("Mock token_here", challenge_used); 236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ( 238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpAuth::AUTHORIZATION_RESULT_ACCEPT, 239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HandleChallengeResponse(true, kTwoMockChallenges, &challenge_used)); 240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ("Mock token_a", challenge_used); 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpAuthTest, ChallengeTokenizer) { 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string challenge_str = "Basic realm=\"foobar\""; 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott challenge_str.end()); 247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(std::string("Basic"), challenge.scheme()); 251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.GetNext()); 252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("realm"), parameters.name()); 254513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(std::string("foobar"), parameters.value()); 255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(parameters.GetNext()); 256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use a name=value property with no quote marks. 259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpAuthTest, ChallengeTokenizerNoQuotes) { 260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string challenge_str = "Basic realm=foobar@baz.com"; 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott challenge_str.end()); 263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(std::string("Basic"), challenge.scheme()); 267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.GetNext()); 268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("realm"), parameters.name()); 270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("foobar@baz.com"), parameters.value()); 271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(parameters.GetNext()); 272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use a name=value property with mismatching quote marks. 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(HttpAuthTest, ChallengeTokenizerMismatchedQuotes) { 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string challenge_str = "Basic realm=\"foobar@baz.com"; 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch challenge_str.end()); 279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(std::string("Basic"), challenge.scheme()); 283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.GetNext()); 284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("realm"), parameters.name()); 286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("foobar@baz.com"), parameters.value()); 287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(parameters.GetNext()); 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use a name= property without a value and with mismatching quote marks. 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(HttpAuthTest, ChallengeTokenizerMismatchedQuotesNoValue) { 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string challenge_str = "Basic realm=\""; 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch challenge_str.end()); 295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(std::string("Basic"), challenge.scheme()); 299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.GetNext()); 300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("realm"), parameters.name()); 302731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string(""), parameters.value()); 303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(parameters.GetNext()); 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use a name=value property with mismatching quote marks and spaces in the 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// value. 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(HttpAuthTest, ChallengeTokenizerMismatchedQuotesSpaces) { 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string challenge_str = "Basic realm=\"foo bar"; 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch challenge_str.end()); 312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 314731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(std::string("Basic"), challenge.scheme()); 316731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.GetNext()); 317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("realm"), parameters.name()); 319731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("foo bar"), parameters.value()); 320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(parameters.GetNext()); 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use multiple name=value properties with mismatching quote marks in the last 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// value. 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(HttpAuthTest, ChallengeTokenizerMismatchedQuotesMultiple) { 326513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch std::string challenge_str = "Digest qop=auth-int, algorithm=md5, realm=\"foo"; 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch challenge_str.end()); 329731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 330731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 331731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(std::string("Digest"), challenge.scheme()); 333731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.GetNext()); 334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("qop"), parameters.name()); 336513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(std::string("auth-int"), parameters.value()); 337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.GetNext()); 338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("algorithm"), parameters.name()); 340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("md5"), parameters.value()); 341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.GetNext()); 342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("realm"), parameters.name()); 344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("foo"), parameters.value()); 345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(parameters.GetNext()); 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use a name= property which has no value. 349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpAuthTest, ChallengeTokenizerNoValue) { 350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string challenge_str = "Digest qop="; 351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuth::ChallengeTokenizer challenge( 352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott challenge_str.begin(), challenge_str.end()); 353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(std::string("Digest"), challenge.scheme()); 357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(parameters.GetNext()); 358513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_FALSE(parameters.valid()); 359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Specify multiple properties, comma separated. 362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpAuthTest, ChallengeTokenizerMultiple) { 363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string challenge_str = 364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Digest algorithm=md5, realm=\"Oblivion\", qop=auth-int"; 365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott challenge_str.end()); 367731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 368731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 369731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(std::string("Digest"), challenge.scheme()); 371731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.GetNext()); 372731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 373731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("algorithm"), parameters.name()); 374731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("md5"), parameters.value()); 375731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.GetNext()); 376731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 377731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("realm"), parameters.name()); 378513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(std::string("Oblivion"), parameters.value()); 379731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.GetNext()); 380731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 381731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("qop"), parameters.name()); 382731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("auth-int"), parameters.value()); 383731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(parameters.GetNext()); 384513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_TRUE(parameters.valid()); 385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use a challenge which has no property. 388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpAuthTest, ChallengeTokenizerNoProperty) { 389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string challenge_str = "NTLM"; 390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott HttpAuth::ChallengeTokenizer challenge( 391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott challenge_str.begin(), challenge_str.end()); 392731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 393731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 394731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(parameters.valid()); 395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(std::string("NTLM"), challenge.scheme()); 396731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_FALSE(parameters.GetNext()); 397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use a challenge with Base64 encoded token. 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(HttpAuthTest, ChallengeTokenizerBase64) { 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string challenge_str = "NTLM SGVsbG8sIFdvcmxkCg==="; 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch challenge_str.end()); 404731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(std::string("NTLM"), challenge.scheme()); 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notice the two equal statements below due to padding removal. 407731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(std::string("SGVsbG8sIFdvcmxkCg=="), challenge.base64_param()); 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpAuthTest, GetChallengeHeaderName) { 411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string name; 412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott name = HttpAuth::GetChallengeHeaderName(HttpAuth::AUTH_SERVER); 414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("WWW-Authenticate", name.c_str()); 415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott name = HttpAuth::GetChallengeHeaderName(HttpAuth::AUTH_PROXY); 417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("Proxy-Authenticate", name.c_str()); 418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpAuthTest, GetAuthorizationHeaderName) { 421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string name; 422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott name = HttpAuth::GetAuthorizationHeaderName(HttpAuth::AUTH_SERVER); 424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("Authorization", name.c_str()); 425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott name = HttpAuth::GetAuthorizationHeaderName(HttpAuth::AUTH_PROXY); 427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_STREQ("Proxy-Authorization", name.c_str()); 428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace net 431