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