Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(257)

Side by Side Diff: net/http/http_auth_handler_mock.cc

Issue 1391053002: [net/http auth] Make HttpAuthHandler challenge handling asynchronous. Base URL: https://chromium.googlesource.com/chromium/src.git@auth-handler-init-split
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/http/http_auth_handler_mock.h ('k') | net/http/http_auth_handler_negotiate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/http/http_auth_handler_mock.h" 5 #include "net/http/http_auth_handler_mock.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback_helpers.h"
8 #include "base/location.h" 9 #include "base/location.h"
9 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
10 #include "base/strings/string_util.h" 11 #include "base/strings/string_util.h"
11 #include "base/thread_task_runner_handle.h" 12 #include "base/thread_task_runner_handle.h"
12 #include "net/base/net_errors.h" 13 #include "net/base/net_errors.h"
13 #include "net/http/http_auth_challenge_tokenizer.h" 14 #include "net/http/http_auth_challenge_tokenizer.h"
14 #include "net/http/http_request_info.h" 15 #include "net/http/http_request_info.h"
15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
16 17
17 namespace net { 18 namespace net {
18 19
19 HttpAuthHandlerMock::HttpAuthHandlerMock() 20 HttpAuthHandlerMock::HttpAuthHandlerMock()
20 : HttpAuthHandler("mock"), weak_factory_(this) {} 21 : HttpAuthHandler("mock"), weak_factory_(this) {}
21 22
22 HttpAuthHandlerMock::~HttpAuthHandlerMock() {} 23 HttpAuthHandlerMock::~HttpAuthHandlerMock() {}
23 24
25 void HttpAuthHandlerMock::SetInitExpectation(bool async, int rv) {
26 init_async_ = async;
27 init_rv_ = rv;
28 }
29
24 void HttpAuthHandlerMock::SetGenerateExpectation(bool async, int rv) { 30 void HttpAuthHandlerMock::SetGenerateExpectation(bool async, int rv) {
25 generate_async_ = async; 31 generate_async_ = async;
26 generate_rv_ = rv; 32 generate_rv_ = rv;
27 } 33 }
28 34
29 HttpAuth::AuthorizationResult HttpAuthHandlerMock::HandleAnotherChallenge( 35 HttpAuth::AuthorizationResult HttpAuthHandlerMock::HandleAnotherChallenge(
30 const HttpAuthChallengeTokenizer& challenge) { 36 const HttpAuthChallengeTokenizer& challenge) {
31 EXPECT_TRUE(challenge.SchemeIs(auth_scheme_)); 37 EXPECT_TRUE(challenge.SchemeIs(auth_scheme_))
38 << "Auth scheme of challenge doesn't match scheme of AuthHandler.";
39 EXPECT_TRUE(initialized_) << __FUNCTION__ << " called without calling Init.";
40 EXPECT_TRUE(initialization_succeeded) << __FUNCTION__
41 << " called after a failed Init.";
32 // If we receive a second challenge for a regular scheme, assume it's a 42 // If we receive a second challenge for a regular scheme, assume it's a
33 // rejection. Receiving an empty second challenge when expecting multiple 43 // rejection. Receiving an empty second challenge when expecting multiple
34 // rounds is also considered a rejection. 44 // rounds is also considered a rejection.
35 if (!expect_multiple_challenges_ || challenge.base64_param().empty()) 45 base::StringPiece challenge_params(challenge.params_begin(),
46 challenge.params_end());
47 if (!expect_multiple_challenges_ || challenge_params.empty())
36 return HttpAuth::AUTHORIZATION_RESULT_REJECT; 48 return HttpAuth::AUTHORIZATION_RESULT_REJECT;
37 if (!challenge.SchemeIs(auth_scheme_))
38 return HttpAuth::AUTHORIZATION_RESULT_INVALID;
39 auth_token_ = auth_scheme_; 49 auth_token_ = auth_scheme_;
40 auth_token_.append(" continuation,"); 50 auth_token_.append(" continuation,");
41 auth_token_.append(challenge.base64_param()); 51 auth_token_.append(challenge.params_begin(), challenge.params_end());
42 return HttpAuth::AUTHORIZATION_RESULT_ACCEPT; 52 return HttpAuth::AUTHORIZATION_RESULT_ACCEPT;
43 } 53 }
44 54
45 bool HttpAuthHandlerMock::NeedsIdentity() { 55 bool HttpAuthHandlerMock::NeedsIdentity() {
56 EXPECT_TRUE(initialized_) << __FUNCTION__ << " called without calling Init.";
57 EXPECT_TRUE(initialization_succeeded) << __FUNCTION__
58 << " called after a failed Init.";
46 return first_round_; 59 return first_round_;
47 } 60 }
48 61
49 bool HttpAuthHandlerMock::AllowsDefaultCredentials() { 62 bool HttpAuthHandlerMock::AllowsDefaultCredentials() {
63 EXPECT_TRUE(initialized_) << __FUNCTION__ << " called without calling Init.";
64 EXPECT_TRUE(initialization_succeeded) << __FUNCTION__
65 << " called after a failed Init.";
50 return allows_default_credentials_; 66 return allows_default_credentials_;
51 } 67 }
52 68
53 bool HttpAuthHandlerMock::AllowsExplicitCredentials() { 69 bool HttpAuthHandlerMock::AllowsExplicitCredentials() {
70 EXPECT_TRUE(initialized_) << __FUNCTION__ << " called without calling Init.";
71 EXPECT_TRUE(initialization_succeeded) << __FUNCTION__
72 << " called after a failed Init.";
54 return allows_explicit_credentials_; 73 return allows_explicit_credentials_;
55 } 74 }
56 75
57 int HttpAuthHandlerMock::Init(const HttpAuthChallengeTokenizer& challenge) { 76 int HttpAuthHandlerMock::InitializeFromChallengeInternal(
77 const HttpAuthChallengeTokenizer& challenge,
78 const HttpResponseInfo& response_with_challenge,
79 const CompletionCallback& callback) {
80 EXPECT_FALSE(initialized_) << "Init already called once.";
58 EXPECT_TRUE(challenge.SchemeIs(auth_scheme_)) 81 EXPECT_TRUE(challenge.SchemeIs(auth_scheme_))
59 << "Mismatched scheme for challenge: " << challenge.challenge_text(); 82 << "Mismatched scheme for challenge: " << challenge.challenge_text();
60 EXPECT_TRUE(HttpAuth::IsValidNormalizedScheme(auth_scheme_)) 83 EXPECT_TRUE(HttpAuth::IsValidNormalizedScheme(auth_scheme_))
61 << "Invalid expected auth scheme."; 84 << "Invalid expected auth scheme.";
85
86 base::StringPiece challenge_params(challenge.params_begin(),
87 challenge.params_end());
88 initialized_ = true;
89
62 auth_token_ = auth_scheme_ + " auth_token"; 90 auth_token_ = auth_scheme_ + " auth_token";
63 if (challenge.params_end() != challenge.params_begin()) { 91 if (!challenge_params.empty()) {
64 auth_token_ += ","; 92 auth_token_ += ",";
65 auth_token_.append(challenge.params_begin(), challenge.params_end()); 93 auth_token_.append(challenge.params_begin(), challenge.params_end());
66 } 94 }
95
96 if (init_async_) {
97 callback_ = callback;
98 base::ThreadTaskRunnerHandle::Get()->PostTask(
99 FROM_HERE, base::Bind(&HttpAuthHandlerMock::OnInitializeComplete,
100 weak_factory_.GetWeakPtr()));
101 return ERR_IO_PENDING;
102 }
103
104 initialization_succeeded = (init_rv_ == OK);
105 return init_rv_;
106 }
107
108 void HttpAuthHandlerMock::OnInitializeComplete() {
109 ASSERT_FALSE(callback_.is_null());
110 initialization_succeeded = (init_rv_ == OK);
111 base::ResetAndReturn(&callback_).Run(init_rv_);
112 }
113
114 int HttpAuthHandlerMock::InitializeFromCacheEntryInternal(
115 HttpAuthCache::Entry* cache_entry) {
116 EXPECT_FALSE(initialized_) << "Init already called once.";
117 EXPECT_EQ(auth_scheme_, cache_entry->scheme())
118 << "Mismatched scheme for challenge: " << cache_entry->auth_challenge();
119 EXPECT_TRUE(HttpAuth::IsValidNormalizedScheme(auth_scheme_))
120 << "Invalid expected auth scheme.";
121
122 HttpAuthChallengeTokenizer challenge(cache_entry->auth_challenge().begin(),
123 cache_entry->auth_challenge().end());
124 EXPECT_TRUE(challenge.SchemeIs(auth_scheme_))
125 << "Mismatched scheme for challenge: " << challenge.challenge_text();
126
127 auth_token_ = auth_scheme_ + " preemptive_auth_token";
128 if (challenge.params_begin() != challenge.params_end()) {
129 auth_token_ += ",";
130 auth_token_.append(challenge.params_begin(), challenge.params_end());
131 }
132
133 initialized_ = true;
134 initialization_succeeded = true;
67 return OK; 135 return OK;
68 } 136 }
69 137
70 int HttpAuthHandlerMock::GenerateAuthTokenImpl( 138 int HttpAuthHandlerMock::GenerateAuthTokenImpl(
71 const AuthCredentials* credentials, 139 const AuthCredentials* credentials,
72 const HttpRequestInfo& request, 140 const HttpRequestInfo& request,
73 const CompletionCallback& callback, 141 const CompletionCallback& callback,
74 std::string* auth_token) { 142 std::string* auth_token) {
143 EXPECT_TRUE(initialized_) << __FUNCTION__ << " called without calling Init.";
144 EXPECT_TRUE(initialization_succeeded) << __FUNCTION__
145 << " called after a failed Init.";
75 first_round_ = false; 146 first_round_ = false;
76 request_url_ = request.url; 147 request_url_ = request.url;
77 148
78 if (!credentials || credentials->Empty()) { 149 if (credentials) {
150 EXPECT_TRUE(AllowsExplicitCredentials()) << "Explicit credentials can only "
151 "be specified if the handler "
152 "supports it.";
153 } else {
79 EXPECT_TRUE(AllowsDefaultCredentials()) << "Credentials must be specified " 154 EXPECT_TRUE(AllowsDefaultCredentials()) << "Credentials must be specified "
80 "if the handler doesn't support " 155 "if the handler doesn't support "
81 "default credentials."; 156 "default credentials.";
82 } else {
83 EXPECT_TRUE(AllowsExplicitCredentials()) << "Explicit credentials can only "
84 "be specified if the handler "
85 "supports it.";
86 } 157 }
87 158
88 if (generate_async_) { 159 if (generate_async_) {
89 EXPECT_TRUE(callback_.is_null()) << "GenerateAuthTokenImpl() called while " 160 EXPECT_TRUE(callback_.is_null()) << "GenerateAuthTokenImpl() called while "
90 "a pending request is in progress"; 161 "a pending request is in progress";
91 EXPECT_EQ(nullptr, generate_auth_token_buffer_) 162 EXPECT_EQ(nullptr, generate_auth_token_buffer_)
92 << "GenerateAuthTokenImpl() called before previous token was retrieved"; 163 << "GenerateAuthTokenImpl() called before previous token was retrieved";
93 callback_ = callback; 164 callback_ = callback;
94 generate_auth_token_buffer_ = auth_token; 165 generate_auth_token_buffer_ = auth_token;
95 base::ThreadTaskRunnerHandle::Get()->PostTask( 166 base::ThreadTaskRunnerHandle::Get()->PostTask(
96 FROM_HERE, base::Bind(&HttpAuthHandlerMock::OnGenerateAuthToken, 167 FROM_HERE, base::Bind(&HttpAuthHandlerMock::OnGenerateAuthTokenComplete,
97 weak_factory_.GetWeakPtr())); 168 weak_factory_.GetWeakPtr()));
98 return ERR_IO_PENDING; 169 return ERR_IO_PENDING;
99 } else { 170 } else {
100 if (generate_rv_ == OK) 171 if (generate_rv_ == OK)
101 *auth_token = auth_token_; 172 *auth_token = auth_token_;
102 return generate_rv_; 173 return generate_rv_;
103 } 174 }
104 } 175 }
105 176
106 void HttpAuthHandlerMock::OnGenerateAuthToken() { 177 void HttpAuthHandlerMock::OnGenerateAuthTokenComplete() {
107 EXPECT_TRUE(generate_async_); 178 EXPECT_TRUE(generate_async_);
108 EXPECT_TRUE(!callback_.is_null()); 179 EXPECT_TRUE(!callback_.is_null());
109 if (generate_rv_ == OK) 180 if (generate_rv_ == OK)
110 *generate_auth_token_buffer_ = auth_token_; 181 *generate_auth_token_buffer_ = auth_token_;
111 generate_auth_token_buffer_ = nullptr; 182 generate_auth_token_buffer_ = nullptr;
112 CompletionCallback callback = callback_; 183 base::ResetAndReturn(&callback_).Run(generate_rv_);
113 callback_.Reset();
114 callback.Run(generate_rv_);
115 } 184 }
116 185
117 HttpAuthHandlerMock::Factory::Factory() {} 186 HttpAuthHandlerMock::Factory::Factory() {}
118 187
119 HttpAuthHandlerMock::Factory::~Factory() { 188 HttpAuthHandlerMock::Factory::~Factory() {
120 } 189 }
121 190
122 void HttpAuthHandlerMock::Factory::AddMockHandler( 191 void HttpAuthHandlerMock::Factory::AddMockHandler(
123 scoped_ptr<HttpAuthHandler> handler, 192 scoped_ptr<HttpAuthHandler> handler,
124 HttpAuthHandlerCreateReason reason) { 193 HttpAuthHandlerCreateReason reason) {
(...skipping 17 matching lines...) Expand all
142 } 211 }
143 212
144 scoped_ptr<HttpAuthHandler> 213 scoped_ptr<HttpAuthHandler>
145 HttpAuthHandlerMock::Factory::CreateAuthHandlerForScheme( 214 HttpAuthHandlerMock::Factory::CreateAuthHandlerForScheme(
146 const std::string& scheme) { 215 const std::string& scheme) {
147 scoped_ptr<HttpAuthHandler> handler = 216 scoped_ptr<HttpAuthHandler> handler =
148 GetNextAuthHandler(&challenge_handlers_); 217 GetNextAuthHandler(&challenge_handlers_);
149 EXPECT_TRUE(!handler || handler->auth_scheme() == scheme) 218 EXPECT_TRUE(!handler || handler->auth_scheme() == scheme)
150 << "Next auth handler is for scheme " << handler->auth_scheme() 219 << "Next auth handler is for scheme " << handler->auth_scheme()
151 << " while request scheme is " << scheme; 220 << " while request scheme is " << scheme;
152 return handler.Pass(); 221 return handler;
153 } 222 }
154 223
155 scoped_ptr<HttpAuthHandler> 224 scoped_ptr<HttpAuthHandler>
156 HttpAuthHandlerMock::Factory::CreateAndInitPreemptiveAuthHandler( 225 HttpAuthHandlerMock::Factory::CreateAndInitPreemptiveAuthHandler(
157 HttpAuthCache::Entry* cache_entry, 226 HttpAuthCache::Entry* cache_entry,
158 const HttpAuthChallengeTokenizer& tokenizer,
159 HttpAuth::Target target, 227 HttpAuth::Target target,
160 const BoundNetLog& net_log) { 228 const BoundNetLog& net_log) {
161 scoped_ptr<HttpAuthHandler> handler = 229 scoped_ptr<HttpAuthHandler> handler =
162 GetNextAuthHandler(&preemptive_handlers_); 230 GetNextAuthHandler(&preemptive_handlers_);
163 if (handler) { 231 if (handler)
164 handler->HandleInitialChallenge(tokenizer, target, cache_entry->origin(), 232 handler->InitializeFromCacheEntry(cache_entry, target, net_log);
165 net_log);
166 }
167 return handler; 233 return handler;
168 } 234 }
169 235
170 } // namespace net 236 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_auth_handler_mock.h ('k') | net/http/http_auth_handler_negotiate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698