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

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

Issue 2518633002: [Merge M55] [net/auth] Deal better with ERR_INVALID_AUTH_CREDENTIALS error. (Closed)
Patch Set: Created 4 years, 1 month 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.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_network_transaction.h" 5 #include "net/http/http_network_transaction.h"
6 6
7 #include <math.h> // ceil 7 #include <math.h> // ceil
8 #include <stdarg.h> 8 #include <stdarg.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 4118 matching lines...) Expand 10 before | Expand all | Expand 10 after
4129 ASSERT_TRUE(response); 4129 ASSERT_TRUE(response);
4130 ASSERT_TRUE(response->headers); 4130 ASSERT_TRUE(response->headers);
4131 EXPECT_EQ(407, response->headers->response_code()); 4131 EXPECT_EQ(407, response->headers->response_code());
4132 EXPECT_FALSE(trans->IsReadyToRestartForAuth()); 4132 EXPECT_FALSE(trans->IsReadyToRestartForAuth());
4133 EXPECT_TRUE(response->auth_challenge); 4133 EXPECT_TRUE(response->auth_challenge);
4134 4134
4135 trans.reset(); 4135 trans.reset();
4136 session->CloseAllConnections(); 4136 session->CloseAllConnections();
4137 } 4137 }
4138 4138
4139 // A more nuanced test than GenerateAuthToken test which asserts that
4140 // ERR_INVALID_AUTH_CREDENTIALS does not cause the auth scheme to be
4141 // unnecessarily invalidated, and that if the server co-operates, the
4142 // authentication handshake can continue with the same scheme but with a
4143 // different identity.
4144 TEST_F(HttpNetworkTransactionTest, NonPermanentGenerateAuthTokenError) {
4145 HttpRequestInfo request;
4146 request.method = "GET";
4147 request.url = GURL("http://www.example.org/");
4148
4149 std::unique_ptr<HttpAuthHandlerMock::Factory> auth_handler_factory(
4150 new HttpAuthHandlerMock::Factory());
4151 auth_handler_factory->set_do_init_from_challenge(true);
4152
4153 // First handler. Uses default credentials, but barfs at generate auth token.
4154 std::unique_ptr<HttpAuthHandlerMock> mock_handler(new HttpAuthHandlerMock());
4155 mock_handler->set_allows_default_credentials(true);
4156 mock_handler->set_allows_explicit_credentials(true);
4157 mock_handler->set_connection_based(true);
4158 mock_handler->SetGenerateExpectation(true, ERR_INVALID_AUTH_CREDENTIALS);
4159 auth_handler_factory->AddMockHandler(mock_handler.release(),
4160 HttpAuth::AUTH_SERVER);
4161
4162 // Add another handler for the second challenge. It supports default
4163 // credentials, but they shouldn't be used, since they were already tried.
4164 mock_handler.reset(new HttpAuthHandlerMock());
4165 mock_handler->set_allows_default_credentials(true);
4166 mock_handler->set_allows_explicit_credentials(true);
4167 mock_handler->set_connection_based(true);
4168 auth_handler_factory->AddMockHandler(mock_handler.release(),
4169 HttpAuth::AUTH_SERVER);
4170 session_deps_.http_auth_handler_factory = std::move(auth_handler_factory);
4171
4172 std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
4173
4174 MockWrite data_writes1[] = {
4175 MockWrite("GET / HTTP/1.1\r\n"
4176 "Host: www.example.org\r\n"
4177 "Connection: keep-alive\r\n\r\n"),
4178 };
4179
4180 MockRead data_reads1[] = {
4181 MockRead("HTTP/1.1 401 Authentication Required\r\n"
4182 "WWW-Authenticate: Mock\r\n"
4183 "Connection: keep-alive\r\n\r\n"),
4184 };
4185
4186 // Identical to data_writes1[]. The AuthHandler encounters a
4187 // ERR_INVALID_AUTH_CREDENTIALS during the GenerateAuthToken stage, so the
4188 // transaction procceds without an authorization header.
4189 MockWrite data_writes2[] = {
4190 MockWrite("GET / HTTP/1.1\r\n"
4191 "Host: www.example.org\r\n"
4192 "Connection: keep-alive\r\n\r\n"),
4193 };
4194
4195 MockRead data_reads2[] = {
4196 MockRead("HTTP/1.1 401 Authentication Required\r\n"
4197 "WWW-Authenticate: Mock\r\n"
4198 "Connection: keep-alive\r\n\r\n"),
4199 };
4200
4201 MockWrite data_writes3[] = {
4202 MockWrite("GET / HTTP/1.1\r\n"
4203 "Host: www.example.org\r\n"
4204 "Connection: keep-alive\r\n"
4205 "Authorization: auth_token\r\n\r\n"),
4206 };
4207
4208 MockRead data_reads3[] = {
4209 MockRead("HTTP/1.1 200 OK\r\n"
4210 "Content-Length: 5\r\n"
4211 "Content-Type: text/plain\r\n"
4212 "Connection: keep-alive\r\n\r\n"
4213 "Hello"),
4214 };
4215
4216 StaticSocketDataProvider data1(data_reads1, arraysize(data_reads1),
4217 data_writes1, arraysize(data_writes1));
4218 session_deps_.socket_factory->AddSocketDataProvider(&data1);
4219
4220 StaticSocketDataProvider data2(data_reads2, arraysize(data_reads2),
4221 data_writes2, arraysize(data_writes2));
4222 session_deps_.socket_factory->AddSocketDataProvider(&data2);
4223
4224 StaticSocketDataProvider data3(data_reads3, arraysize(data_reads3),
4225 data_writes3, arraysize(data_writes3));
4226 session_deps_.socket_factory->AddSocketDataProvider(&data3);
4227
4228 std::unique_ptr<HttpNetworkTransaction> trans(
4229 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
4230
4231 TestCompletionCallback callback;
4232 int rv = trans->Start(&request, callback.callback(), NetLogWithSource());
4233 EXPECT_THAT(callback.GetResult(rv), IsOk());
4234
4235 const HttpResponseInfo* response = trans->GetResponseInfo();
4236 ASSERT_TRUE(response);
4237 ASSERT_TRUE(response->headers);
4238 EXPECT_TRUE(HttpVersion(1, 1) == response->headers->GetHttpVersion());
4239
4240 // The following three tests assert that an authentication challenge was
4241 // received and that the stack is ready to respond to the challenge using
4242 // ambient credentials.
4243 EXPECT_EQ(401, response->headers->response_code());
4244 EXPECT_TRUE(trans->IsReadyToRestartForAuth());
4245 EXPECT_FALSE(response->auth_challenge);
4246
4247 rv = trans->RestartWithAuth(AuthCredentials(), callback.callback());
4248 EXPECT_THAT(callback.GetResult(rv), IsOk());
4249 response = trans->GetResponseInfo();
4250 ASSERT_TRUE(response);
4251 ASSERT_TRUE(response->headers);
4252
4253 // The following three tests assert that an authentication challenge was
4254 // received and that the stack needs explicit credentials before it is ready
4255 // to respond to the challenge.
4256 EXPECT_EQ(401, response->headers->response_code());
4257 EXPECT_FALSE(trans->IsReadyToRestartForAuth());
4258 EXPECT_TRUE(response->auth_challenge);
4259
4260 rv = trans->RestartWithAuth(AuthCredentials(), callback.callback());
4261 EXPECT_THAT(callback.GetResult(rv), IsOk());
4262 response = trans->GetResponseInfo();
4263 ASSERT_TRUE(response);
4264 ASSERT_TRUE(response->headers);
4265 EXPECT_EQ(200, response->headers->response_code());
4266
4267 trans.reset();
4268 session->CloseAllConnections();
4269 }
4270
4139 // Test the load timing for HTTPS requests with an HTTP proxy. 4271 // Test the load timing for HTTPS requests with an HTTP proxy.
4140 TEST_F(HttpNetworkTransactionTest, HttpProxyLoadTimingNoPacTwoRequests) { 4272 TEST_F(HttpNetworkTransactionTest, HttpProxyLoadTimingNoPacTwoRequests) {
4141 HttpRequestInfo request1; 4273 HttpRequestInfo request1;
4142 request1.method = "GET"; 4274 request1.method = "GET";
4143 request1.url = GURL("https://www.example.org/1"); 4275 request1.url = GURL("https://www.example.org/1");
4144 4276
4145 HttpRequestInfo request2; 4277 HttpRequestInfo request2;
4146 request2.method = "GET"; 4278 request2.method = "GET";
4147 request2.url = GURL("https://www.example.org/2"); 4279 request2.url = GURL("https://www.example.org/2");
4148 4280
(...skipping 7241 matching lines...) Expand 10 before | Expand all | Expand 10 after
11390 MockWrite write; 11522 MockWrite write;
11391 MockRead read; 11523 MockRead read;
11392 int expected_rv; 11524 int expected_rv;
11393 const MockWrite* extra_write; 11525 const MockWrite* extra_write;
11394 const MockRead* extra_read; 11526 const MockRead* extra_read;
11395 }; 11527 };
11396 11528
11397 static const int kNoSSL = 500; 11529 static const int kNoSSL = 500;
11398 11530
11399 struct TestConfig { 11531 struct TestConfig {
11532 int line_number;
11400 const char* const proxy_url; 11533 const char* const proxy_url;
11401 AuthTiming proxy_auth_timing; 11534 AuthTiming proxy_auth_timing;
11402 int proxy_auth_rv; 11535 int first_generate_proxy_token_rv;
11403 const char* const server_url; 11536 const char* const server_url;
11404 AuthTiming server_auth_timing; 11537 AuthTiming server_auth_timing;
11405 int server_auth_rv; 11538 int first_generate_server_token_rv;
11406 int num_auth_rounds; 11539 int num_auth_rounds;
11407 int first_ssl_round; 11540 int first_ssl_round;
11408 TestRound rounds[3]; 11541 TestRound rounds[4];
11409 } test_configs[] = { 11542 } test_configs[] = {
11410 // Non-authenticating HTTP server with a direct connection. 11543 // Non-authenticating HTTP server with a direct connection.
11411 {NULL, 11544 {__LINE__,
11545 nullptr,
11412 AUTH_NONE, 11546 AUTH_NONE,
11413 OK, 11547 OK,
11414 kServer, 11548 kServer,
11415 AUTH_NONE, 11549 AUTH_NONE,
11416 OK, 11550 OK,
11417 1, 11551 1,
11418 kNoSSL, 11552 kNoSSL,
11419 {TestRound(kGet, kSuccess, OK)}}, 11553 {TestRound(kGet, kSuccess, OK)}},
11420 // Authenticating HTTP server with a direct connection. 11554 // Authenticating HTTP server with a direct connection.
11421 {NULL, 11555 {__LINE__,
11556 nullptr,
11422 AUTH_NONE, 11557 AUTH_NONE,
11423 OK, 11558 OK,
11424 kServer, 11559 kServer,
11425 AUTH_SYNC, 11560 AUTH_SYNC,
11426 OK, 11561 OK,
11427 2, 11562 2,
11428 kNoSSL, 11563 kNoSSL,
11429 {TestRound(kGet, kServerChallenge, OK), 11564 {TestRound(kGet, kServerChallenge, OK),
11430 TestRound(kGetAuth, kSuccess, OK)}}, 11565 TestRound(kGetAuth, kSuccess, OK)}},
11431 {NULL, 11566 {__LINE__,
11567 nullptr,
11432 AUTH_NONE, 11568 AUTH_NONE,
11433 OK, 11569 OK,
11434 kServer, 11570 kServer,
11435 AUTH_SYNC, 11571 AUTH_SYNC,
11436 ERR_INVALID_AUTH_CREDENTIALS, 11572 ERR_INVALID_AUTH_CREDENTIALS,
11573 3,
11574 kNoSSL,
11575 {TestRound(kGet, kServerChallenge, OK),
11576 TestRound(kGet, kServerChallenge, OK),
11577 TestRound(kGetAuth, kSuccess, OK)}},
11578 {__LINE__,
11579 nullptr,
11580 AUTH_NONE,
11581 OK,
11582 kServer,
11583 AUTH_SYNC,
11584 ERR_UNSUPPORTED_AUTH_SCHEME,
11585 2,
11586 kNoSSL,
11587 {TestRound(kGet, kServerChallenge, OK), TestRound(kGet, kSuccess, OK)}},
11588 {__LINE__,
11589 nullptr,
11590 AUTH_NONE,
11591 OK,
11592 kServer,
11593 AUTH_SYNC,
11594 ERR_UNDOCUMENTED_SECURITY_LIBRARY_STATUS,
11595 2,
11596 kNoSSL,
11597 {TestRound(kGet, kServerChallenge, OK), TestRound(kGet, kSuccess, OK)}},
11598 {__LINE__,
11599 kProxy,
11600 AUTH_SYNC,
11601 ERR_FAILED,
11602 kServer,
11603 AUTH_NONE,
11604 OK,
11605 2,
11606 kNoSSL,
11607 {TestRound(kGetProxy, kProxyChallenge, OK),
11608 TestRound(kGetProxy, kFailure, ERR_FAILED)}},
11609 {__LINE__,
11610 kProxy,
11611 AUTH_ASYNC,
11612 ERR_FAILED,
11613 kServer,
11614 AUTH_NONE,
11615 OK,
11616 2,
11617 kNoSSL,
11618 {TestRound(kGetProxy, kProxyChallenge, OK),
11619 TestRound(kGetProxy, kFailure, ERR_FAILED)}},
11620 {__LINE__,
11621 nullptr,
11622 AUTH_NONE,
11623 OK,
11624 kServer,
11625 AUTH_SYNC,
11626 ERR_FAILED,
11437 2, 11627 2,
11438 kNoSSL, 11628 kNoSSL,
11439 {TestRound(kGet, kServerChallenge, OK), 11629 {TestRound(kGet, kServerChallenge, OK),
11440 TestRound(kGetAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}}, 11630 TestRound(kGet, kFailure, ERR_FAILED)}},
11441 {NULL, 11631 {__LINE__,
11632 nullptr,
11442 AUTH_NONE, 11633 AUTH_NONE,
11443 OK, 11634 OK,
11444 kServer, 11635 kServer,
11636 AUTH_ASYNC,
11637 ERR_FAILED,
11638 2,
11639 kNoSSL,
11640 {TestRound(kGet, kServerChallenge, OK),
11641 TestRound(kGet, kFailure, ERR_FAILED)}},
11642 {__LINE__,
11643 nullptr,
11644 AUTH_NONE,
11645 OK,
11646 kServer,
11445 AUTH_ASYNC, 11647 AUTH_ASYNC,
11446 OK, 11648 OK,
11447 2, 11649 2,
11448 kNoSSL, 11650 kNoSSL,
11449 {TestRound(kGet, kServerChallenge, OK), 11651 {TestRound(kGet, kServerChallenge, OK),
11450 TestRound(kGetAuth, kSuccess, OK)}}, 11652 TestRound(kGetAuth, kSuccess, OK)}},
11451 {NULL, 11653 {__LINE__,
11654 nullptr,
11452 AUTH_NONE, 11655 AUTH_NONE,
11453 OK, 11656 OK,
11454 kServer, 11657 kServer,
11455 AUTH_ASYNC, 11658 AUTH_ASYNC,
11456 ERR_INVALID_AUTH_CREDENTIALS, 11659 ERR_INVALID_AUTH_CREDENTIALS,
11457 2, 11660 3,
11458 kNoSSL, 11661 kNoSSL,
11459 {TestRound(kGet, kServerChallenge, OK), 11662 {TestRound(kGet, kServerChallenge, OK),
11460 TestRound(kGetAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}}, 11663 // The second round uses a HttpAuthHandlerMock that always succeeds.
11664 TestRound(kGet, kServerChallenge, OK),
11665 TestRound(kGetAuth, kSuccess, OK)}},
11461 // Non-authenticating HTTP server through a non-authenticating proxy. 11666 // Non-authenticating HTTP server through a non-authenticating proxy.
11462 {kProxy, 11667 {__LINE__,
11668 kProxy,
11463 AUTH_NONE, 11669 AUTH_NONE,
11464 OK, 11670 OK,
11465 kServer, 11671 kServer,
11466 AUTH_NONE, 11672 AUTH_NONE,
11467 OK, 11673 OK,
11468 1, 11674 1,
11469 kNoSSL, 11675 kNoSSL,
11470 {TestRound(kGetProxy, kSuccess, OK)}}, 11676 {TestRound(kGetProxy, kSuccess, OK)}},
11471 // Authenticating HTTP server through a non-authenticating proxy. 11677 // Authenticating HTTP server through a non-authenticating proxy.
11472 {kProxy, 11678 {__LINE__,
11679 kProxy,
11473 AUTH_NONE, 11680 AUTH_NONE,
11474 OK, 11681 OK,
11475 kServer, 11682 kServer,
11476 AUTH_SYNC, 11683 AUTH_SYNC,
11477 OK, 11684 OK,
11478 2, 11685 2,
11479 kNoSSL, 11686 kNoSSL,
11480 {TestRound(kGetProxy, kServerChallenge, OK), 11687 {TestRound(kGetProxy, kServerChallenge, OK),
11481 TestRound(kGetAuthThroughProxy, kSuccess, OK)}}, 11688 TestRound(kGetAuthThroughProxy, kSuccess, OK)}},
11482 {kProxy, 11689 {__LINE__,
11690 kProxy,
11483 AUTH_NONE, 11691 AUTH_NONE,
11484 OK, 11692 OK,
11485 kServer, 11693 kServer,
11486 AUTH_SYNC, 11694 AUTH_SYNC,
11487 ERR_INVALID_AUTH_CREDENTIALS, 11695 ERR_INVALID_AUTH_CREDENTIALS,
11488 2, 11696 3,
11489 kNoSSL, 11697 kNoSSL,
11490 {TestRound(kGetProxy, kServerChallenge, OK), 11698 {TestRound(kGetProxy, kServerChallenge, OK),
11491 TestRound(kGetAuthThroughProxy, kFailure, 11699 TestRound(kGetProxy, kServerChallenge, OK),
11492 ERR_INVALID_AUTH_CREDENTIALS)}}, 11700 TestRound(kGetAuthThroughProxy, kSuccess, OK)}},
11493 {kProxy, 11701 {__LINE__,
11702 kProxy,
11494 AUTH_NONE, 11703 AUTH_NONE,
11495 OK, 11704 OK,
11496 kServer, 11705 kServer,
11497 AUTH_ASYNC, 11706 AUTH_ASYNC,
11498 OK, 11707 OK,
11499 2, 11708 2,
11500 kNoSSL, 11709 kNoSSL,
11501 {TestRound(kGetProxy, kServerChallenge, OK), 11710 {TestRound(kGetProxy, kServerChallenge, OK),
11502 TestRound(kGetAuthThroughProxy, kSuccess, OK)}}, 11711 TestRound(kGetAuthThroughProxy, kSuccess, OK)}},
11503 {kProxy, 11712 {__LINE__,
11713 kProxy,
11504 AUTH_NONE, 11714 AUTH_NONE,
11505 OK, 11715 OK,
11506 kServer, 11716 kServer,
11507 AUTH_ASYNC, 11717 AUTH_ASYNC,
11508 ERR_INVALID_AUTH_CREDENTIALS, 11718 ERR_INVALID_AUTH_CREDENTIALS,
11509 2, 11719 2,
11510 kNoSSL, 11720 kNoSSL,
11511 {TestRound(kGetProxy, kServerChallenge, OK), 11721 {TestRound(kGetProxy, kServerChallenge, OK),
11512 TestRound(kGetAuthThroughProxy, kFailure, 11722 TestRound(kGetProxy, kSuccess, OK)}},
11513 ERR_INVALID_AUTH_CREDENTIALS)}},
11514 // Non-authenticating HTTP server through an authenticating proxy. 11723 // Non-authenticating HTTP server through an authenticating proxy.
11515 {kProxy, 11724 {__LINE__,
11725 kProxy,
11516 AUTH_SYNC, 11726 AUTH_SYNC,
11517 OK, 11727 OK,
11518 kServer, 11728 kServer,
11519 AUTH_NONE, 11729 AUTH_NONE,
11520 OK, 11730 OK,
11521 2, 11731 2,
11522 kNoSSL, 11732 kNoSSL,
11523 {TestRound(kGetProxy, kProxyChallenge, OK), 11733 {TestRound(kGetProxy, kProxyChallenge, OK),
11524 TestRound(kGetProxyAuth, kSuccess, OK)}}, 11734 TestRound(kGetProxyAuth, kSuccess, OK)}},
11525 {kProxy, 11735 {__LINE__,
11736 kProxy,
11526 AUTH_SYNC, 11737 AUTH_SYNC,
11527 ERR_INVALID_AUTH_CREDENTIALS, 11738 ERR_INVALID_AUTH_CREDENTIALS,
11528 kServer, 11739 kServer,
11529 AUTH_NONE, 11740 AUTH_NONE,
11530 OK, 11741 OK,
11531 2, 11742 2,
11532 kNoSSL, 11743 kNoSSL,
11533 {TestRound(kGetProxy, kProxyChallenge, OK), 11744 {TestRound(kGetProxy, kProxyChallenge, OK),
11534 TestRound(kGetProxyAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}}, 11745 TestRound(kGetProxy, kSuccess, OK)}},
11535 {kProxy, 11746 {__LINE__,
11747 kProxy,
11536 AUTH_ASYNC, 11748 AUTH_ASYNC,
11537 OK, 11749 OK,
11538 kServer, 11750 kServer,
11539 AUTH_NONE, 11751 AUTH_NONE,
11540 OK, 11752 OK,
11541 2, 11753 2,
11542 kNoSSL, 11754 kNoSSL,
11543 {TestRound(kGetProxy, kProxyChallenge, OK), 11755 {TestRound(kGetProxy, kProxyChallenge, OK),
11544 TestRound(kGetProxyAuth, kSuccess, OK)}}, 11756 TestRound(kGetProxyAuth, kSuccess, OK)}},
11545 {kProxy, 11757 {__LINE__,
11758 kProxy,
11546 AUTH_ASYNC, 11759 AUTH_ASYNC,
11547 ERR_INVALID_AUTH_CREDENTIALS, 11760 ERR_INVALID_AUTH_CREDENTIALS,
11548 kServer, 11761 kServer,
11549 AUTH_NONE, 11762 AUTH_NONE,
11550 OK, 11763 OK,
11551 2, 11764 2,
11552 kNoSSL, 11765 kNoSSL,
11553 {TestRound(kGetProxy, kProxyChallenge, OK), 11766 {TestRound(kGetProxy, kProxyChallenge, OK),
11554 TestRound(kGetProxyAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}}, 11767 TestRound(kGetProxy, kSuccess, OK)}},
11768 {__LINE__,
11769 kProxy,
11770 AUTH_ASYNC,
11771 ERR_INVALID_AUTH_CREDENTIALS,
11772 kServer,
11773 AUTH_NONE,
11774 OK,
11775 3,
11776 kNoSSL,
11777 {TestRound(kGetProxy, kProxyChallenge, OK),
11778 TestRound(kGetProxy, kProxyChallenge, OK),
11779 TestRound(kGetProxyAuth, kSuccess, OK)}},
11555 // Authenticating HTTP server through an authenticating proxy. 11780 // Authenticating HTTP server through an authenticating proxy.
11556 {kProxy, 11781 {__LINE__,
11782 kProxy,
11557 AUTH_SYNC, 11783 AUTH_SYNC,
11558 OK, 11784 OK,
11559 kServer, 11785 kServer,
11560 AUTH_SYNC, 11786 AUTH_SYNC,
11561 OK, 11787 OK,
11562 3, 11788 3,
11563 kNoSSL, 11789 kNoSSL,
11564 {TestRound(kGetProxy, kProxyChallenge, OK), 11790 {TestRound(kGetProxy, kProxyChallenge, OK),
11565 TestRound(kGetProxyAuth, kServerChallenge, OK), 11791 TestRound(kGetProxyAuth, kServerChallenge, OK),
11566 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}}, 11792 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}},
11567 {kProxy, 11793 {__LINE__,
11794 kProxy,
11568 AUTH_SYNC, 11795 AUTH_SYNC,
11569 OK, 11796 OK,
11570 kServer, 11797 kServer,
11571 AUTH_SYNC, 11798 AUTH_SYNC,
11572 ERR_INVALID_AUTH_CREDENTIALS, 11799 ERR_INVALID_AUTH_CREDENTIALS,
11573 3, 11800 3,
11574 kNoSSL, 11801 kNoSSL,
11575 {TestRound(kGetProxy, kProxyChallenge, OK), 11802 {TestRound(kGetProxy, kProxyChallenge, OK),
11576 TestRound(kGetProxyAuth, kServerChallenge, OK), 11803 TestRound(kGetProxyAuth, kServerChallenge, OK),
11577 TestRound(kGetAuthWithProxyAuth, kFailure, 11804 TestRound(kGetProxyAuth, kSuccess, OK)}},
11578 ERR_INVALID_AUTH_CREDENTIALS)}}, 11805 {__LINE__,
11579 {kProxy, 11806 kProxy,
11580 AUTH_ASYNC, 11807 AUTH_ASYNC,
11581 OK, 11808 OK,
11582 kServer, 11809 kServer,
11583 AUTH_SYNC, 11810 AUTH_SYNC,
11584 OK, 11811 OK,
11585 3, 11812 3,
11586 kNoSSL, 11813 kNoSSL,
11587 {TestRound(kGetProxy, kProxyChallenge, OK), 11814 {TestRound(kGetProxy, kProxyChallenge, OK),
11588 TestRound(kGetProxyAuth, kServerChallenge, OK), 11815 TestRound(kGetProxyAuth, kServerChallenge, OK),
11589 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}}, 11816 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}},
11590 {kProxy, 11817 {__LINE__,
11818 kProxy,
11591 AUTH_ASYNC, 11819 AUTH_ASYNC,
11592 OK, 11820 OK,
11593 kServer, 11821 kServer,
11594 AUTH_SYNC, 11822 AUTH_SYNC,
11595 ERR_INVALID_AUTH_CREDENTIALS, 11823 ERR_INVALID_AUTH_CREDENTIALS,
11596 3, 11824 3,
11597 kNoSSL, 11825 kNoSSL,
11598 {TestRound(kGetProxy, kProxyChallenge, OK), 11826 {TestRound(kGetProxy, kProxyChallenge, OK),
11599 TestRound(kGetProxyAuth, kServerChallenge, OK), 11827 TestRound(kGetProxyAuth, kServerChallenge, OK),
11600 TestRound(kGetAuthWithProxyAuth, kFailure, 11828 TestRound(kGetProxyAuth, kSuccess, OK)}},
11601 ERR_INVALID_AUTH_CREDENTIALS)}}, 11829 {__LINE__,
11602 {kProxy, 11830 kProxy,
11603 AUTH_SYNC, 11831 AUTH_SYNC,
11604 OK, 11832 OK,
11605 kServer, 11833 kServer,
11606 AUTH_ASYNC, 11834 AUTH_ASYNC,
11607 OK, 11835 OK,
11608 3, 11836 3,
11609 kNoSSL, 11837 kNoSSL,
11610 {TestRound(kGetProxy, kProxyChallenge, OK), 11838 {TestRound(kGetProxy, kProxyChallenge, OK),
11611 TestRound(kGetProxyAuth, kServerChallenge, OK), 11839 TestRound(kGetProxyAuth, kServerChallenge, OK),
11612 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}}, 11840 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}},
11613 {kProxy, 11841 {__LINE__,
11842 kProxy,
11843 AUTH_SYNC,
11844 ERR_INVALID_AUTH_CREDENTIALS,
11845 kServer,
11846 AUTH_ASYNC,
11847 OK,
11848 4,
11849 kNoSSL,
11850 {TestRound(kGetProxy, kProxyChallenge, OK),
11851 TestRound(kGetProxy, kProxyChallenge, OK),
11852 TestRound(kGetProxyAuth, kServerChallenge, OK),
11853 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}},
11854 {__LINE__,
11855 kProxy,
11614 AUTH_SYNC, 11856 AUTH_SYNC,
11615 OK, 11857 OK,
11616 kServer, 11858 kServer,
11617 AUTH_ASYNC, 11859 AUTH_ASYNC,
11618 ERR_INVALID_AUTH_CREDENTIALS, 11860 ERR_INVALID_AUTH_CREDENTIALS,
11619 3, 11861 3,
11620 kNoSSL, 11862 kNoSSL,
11621 {TestRound(kGetProxy, kProxyChallenge, OK), 11863 {TestRound(kGetProxy, kProxyChallenge, OK),
11622 TestRound(kGetProxyAuth, kServerChallenge, OK), 11864 TestRound(kGetProxyAuth, kServerChallenge, OK),
11623 TestRound(kGetAuthWithProxyAuth, kFailure, 11865 TestRound(kGetProxyAuth, kSuccess, OK)}},
11624 ERR_INVALID_AUTH_CREDENTIALS)}}, 11866 {__LINE__,
11625 {kProxy, 11867 kProxy,
11626 AUTH_ASYNC, 11868 AUTH_ASYNC,
11627 OK, 11869 OK,
11628 kServer, 11870 kServer,
11629 AUTH_ASYNC, 11871 AUTH_ASYNC,
11630 OK, 11872 OK,
11631 3, 11873 3,
11632 kNoSSL, 11874 kNoSSL,
11633 {TestRound(kGetProxy, kProxyChallenge, OK), 11875 {TestRound(kGetProxy, kProxyChallenge, OK),
11634 TestRound(kGetProxyAuth, kServerChallenge, OK), 11876 TestRound(kGetProxyAuth, kServerChallenge, OK),
11635 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}}, 11877 TestRound(kGetAuthWithProxyAuth, kSuccess, OK)}},
11636 {kProxy, 11878 {__LINE__,
11879 kProxy,
11637 AUTH_ASYNC, 11880 AUTH_ASYNC,
11638 OK, 11881 OK,
11639 kServer, 11882 kServer,
11640 AUTH_ASYNC, 11883 AUTH_ASYNC,
11641 ERR_INVALID_AUTH_CREDENTIALS, 11884 ERR_INVALID_AUTH_CREDENTIALS,
11642 3, 11885 3,
11643 kNoSSL, 11886 kNoSSL,
11644 {TestRound(kGetProxy, kProxyChallenge, OK), 11887 {TestRound(kGetProxy, kProxyChallenge, OK),
11645 TestRound(kGetProxyAuth, kServerChallenge, OK), 11888 TestRound(kGetProxyAuth, kServerChallenge, OK),
11646 TestRound(kGetAuthWithProxyAuth, kFailure, 11889 TestRound(kGetProxyAuth, kSuccess, OK)}},
11647 ERR_INVALID_AUTH_CREDENTIALS)}}, 11890 {__LINE__,
11891 kProxy,
11892 AUTH_ASYNC,
11893 ERR_INVALID_AUTH_CREDENTIALS,
11894 kServer,
11895 AUTH_ASYNC,
11896 ERR_INVALID_AUTH_CREDENTIALS,
11897 4,
11898 kNoSSL,
11899 {TestRound(kGetProxy, kProxyChallenge, OK),
11900 TestRound(kGetProxy, kProxyChallenge, OK),
11901 TestRound(kGetProxyAuth, kServerChallenge, OK),
11902 TestRound(kGetProxyAuth, kSuccess, OK)}},
11648 // Non-authenticating HTTPS server with a direct connection. 11903 // Non-authenticating HTTPS server with a direct connection.
11649 {NULL, 11904 {__LINE__,
11905 nullptr,
11650 AUTH_NONE, 11906 AUTH_NONE,
11651 OK, 11907 OK,
11652 kSecureServer, 11908 kSecureServer,
11653 AUTH_NONE, 11909 AUTH_NONE,
11654 OK, 11910 OK,
11655 1, 11911 1,
11656 0, 11912 0,
11657 {TestRound(kGet, kSuccess, OK)}}, 11913 {TestRound(kGet, kSuccess, OK)}},
11658 // Authenticating HTTPS server with a direct connection. 11914 // Authenticating HTTPS server with a direct connection.
11659 {NULL, 11915 {__LINE__,
11916 nullptr,
11660 AUTH_NONE, 11917 AUTH_NONE,
11661 OK, 11918 OK,
11662 kSecureServer, 11919 kSecureServer,
11663 AUTH_SYNC, 11920 AUTH_SYNC,
11664 OK, 11921 OK,
11665 2, 11922 2,
11666 0, 11923 0,
11667 {TestRound(kGet, kServerChallenge, OK), 11924 {TestRound(kGet, kServerChallenge, OK),
11668 TestRound(kGetAuth, kSuccess, OK)}}, 11925 TestRound(kGetAuth, kSuccess, OK)}},
11669 {NULL, 11926 {__LINE__,
11927 nullptr,
11670 AUTH_NONE, 11928 AUTH_NONE,
11671 OK, 11929 OK,
11672 kSecureServer, 11930 kSecureServer,
11673 AUTH_SYNC, 11931 AUTH_SYNC,
11674 ERR_INVALID_AUTH_CREDENTIALS, 11932 ERR_INVALID_AUTH_CREDENTIALS,
11675 2, 11933 2,
11676 0, 11934 0,
11677 {TestRound(kGet, kServerChallenge, OK), 11935 {TestRound(kGet, kServerChallenge, OK), TestRound(kGet, kSuccess, OK)}},
11678 TestRound(kGetAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}}, 11936 {__LINE__,
11679 {NULL, 11937 nullptr,
11680 AUTH_NONE, 11938 AUTH_NONE,
11681 OK, 11939 OK,
11682 kSecureServer, 11940 kSecureServer,
11683 AUTH_ASYNC, 11941 AUTH_ASYNC,
11684 OK, 11942 OK,
11685 2, 11943 2,
11686 0, 11944 0,
11687 {TestRound(kGet, kServerChallenge, OK), 11945 {TestRound(kGet, kServerChallenge, OK),
11688 TestRound(kGetAuth, kSuccess, OK)}}, 11946 TestRound(kGetAuth, kSuccess, OK)}},
11689 {NULL, 11947 {__LINE__,
11948 nullptr,
11690 AUTH_NONE, 11949 AUTH_NONE,
11691 OK, 11950 OK,
11692 kSecureServer, 11951 kSecureServer,
11693 AUTH_ASYNC, 11952 AUTH_ASYNC,
11694 ERR_INVALID_AUTH_CREDENTIALS, 11953 ERR_INVALID_AUTH_CREDENTIALS,
11695 2, 11954 2,
11696 0, 11955 0,
11697 {TestRound(kGet, kServerChallenge, OK), 11956 {TestRound(kGet, kServerChallenge, OK), TestRound(kGet, kSuccess, OK)}},
11698 TestRound(kGetAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}},
11699 // Non-authenticating HTTPS server with a non-authenticating proxy. 11957 // Non-authenticating HTTPS server with a non-authenticating proxy.
11700 {kProxy, 11958 {__LINE__,
11959 kProxy,
11701 AUTH_NONE, 11960 AUTH_NONE,
11702 OK, 11961 OK,
11703 kSecureServer, 11962 kSecureServer,
11704 AUTH_NONE, 11963 AUTH_NONE,
11705 OK, 11964 OK,
11706 1, 11965 1,
11707 0, 11966 0,
11708 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kSuccess)}}, 11967 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kSuccess)}},
11709 // Authenticating HTTPS server through a non-authenticating proxy. 11968 // Authenticating HTTPS server through a non-authenticating proxy.
11710 {kProxy, 11969 {__LINE__,
11970 kProxy,
11711 AUTH_NONE, 11971 AUTH_NONE,
11712 OK, 11972 OK,
11713 kSecureServer, 11973 kSecureServer,
11714 AUTH_SYNC, 11974 AUTH_SYNC,
11715 OK, 11975 OK,
11716 2, 11976 2,
11717 0, 11977 0,
11718 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge), 11978 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge),
11719 TestRound(kGetAuth, kSuccess, OK)}}, 11979 TestRound(kGetAuth, kSuccess, OK)}},
11720 {kProxy, 11980 {__LINE__,
11981 kProxy,
11721 AUTH_NONE, 11982 AUTH_NONE,
11722 OK, 11983 OK,
11723 kSecureServer, 11984 kSecureServer,
11724 AUTH_SYNC, 11985 AUTH_SYNC,
11725 ERR_INVALID_AUTH_CREDENTIALS, 11986 ERR_INVALID_AUTH_CREDENTIALS,
11726 2, 11987 2,
11727 0, 11988 0,
11728 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge), 11989 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge),
11729 TestRound(kGetAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}}, 11990 TestRound(kGet, kSuccess, OK)}},
11730 {kProxy, 11991 {__LINE__,
11992 kProxy,
11731 AUTH_NONE, 11993 AUTH_NONE,
11732 OK, 11994 OK,
11733 kSecureServer, 11995 kSecureServer,
11734 AUTH_ASYNC, 11996 AUTH_ASYNC,
11735 OK, 11997 OK,
11736 2, 11998 2,
11737 0, 11999 0,
11738 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge), 12000 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge),
11739 TestRound(kGetAuth, kSuccess, OK)}}, 12001 TestRound(kGetAuth, kSuccess, OK)}},
11740 {kProxy, 12002 {__LINE__,
12003 kProxy,
11741 AUTH_NONE, 12004 AUTH_NONE,
11742 OK, 12005 OK,
11743 kSecureServer, 12006 kSecureServer,
11744 AUTH_ASYNC, 12007 AUTH_ASYNC,
11745 ERR_INVALID_AUTH_CREDENTIALS, 12008 ERR_INVALID_AUTH_CREDENTIALS,
11746 2, 12009 2,
11747 0, 12010 0,
11748 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge), 12011 {TestRound(kConnect, kProxyConnected, OK, &kGet, &kServerChallenge),
11749 TestRound(kGetAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}}, 12012 TestRound(kGet, kSuccess, OK)}},
11750 // Non-Authenticating HTTPS server through an authenticating proxy. 12013 // Non-Authenticating HTTPS server through an authenticating proxy.
11751 {kProxy, 12014 {__LINE__,
12015 kProxy,
11752 AUTH_SYNC, 12016 AUTH_SYNC,
11753 OK, 12017 OK,
11754 kSecureServer, 12018 kSecureServer,
11755 AUTH_NONE, 12019 AUTH_NONE,
11756 OK, 12020 OK,
11757 2, 12021 2,
11758 1, 12022 1,
11759 {TestRound(kConnect, kProxyChallenge, OK), 12023 {TestRound(kConnect, kProxyChallenge, OK),
11760 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, &kSuccess)}}, 12024 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, &kSuccess)}},
11761 {kProxy, 12025 {__LINE__,
12026 kProxy,
11762 AUTH_SYNC, 12027 AUTH_SYNC,
11763 ERR_INVALID_AUTH_CREDENTIALS, 12028 ERR_INVALID_AUTH_CREDENTIALS,
11764 kSecureServer, 12029 kSecureServer,
11765 AUTH_NONE, 12030 AUTH_NONE,
11766 OK, 12031 OK,
11767 2, 12032 2,
11768 kNoSSL, 12033 kNoSSL,
11769 {TestRound(kConnect, kProxyChallenge, OK), 12034 {TestRound(kConnect, kProxyChallenge, OK),
11770 TestRound(kConnectProxyAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}}, 12035 TestRound(kConnect, kProxyConnected, OK, &kGet, &kSuccess)}},
11771 {kProxy, 12036 {__LINE__,
12037 kProxy,
12038 AUTH_SYNC,
12039 ERR_UNSUPPORTED_AUTH_SCHEME,
12040 kSecureServer,
12041 AUTH_NONE,
12042 OK,
12043 2,
12044 kNoSSL,
12045 {TestRound(kConnect, kProxyChallenge, OK),
12046 TestRound(kConnect, kProxyConnected, OK, &kGet, &kSuccess)}},
12047 {__LINE__,
12048 kProxy,
12049 AUTH_SYNC,
12050 ERR_UNEXPECTED,
12051 kSecureServer,
12052 AUTH_NONE,
12053 OK,
12054 2,
12055 kNoSSL,
12056 {TestRound(kConnect, kProxyChallenge, OK),
12057 TestRound(kConnect, kProxyConnected, ERR_UNEXPECTED)}},
12058 {__LINE__,
12059 kProxy,
11772 AUTH_ASYNC, 12060 AUTH_ASYNC,
11773 OK, 12061 OK,
11774 kSecureServer, 12062 kSecureServer,
11775 AUTH_NONE, 12063 AUTH_NONE,
11776 OK, 12064 OK,
11777 2, 12065 2,
11778 1, 12066 1,
11779 {TestRound(kConnect, kProxyChallenge, OK), 12067 {TestRound(kConnect, kProxyChallenge, OK),
11780 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, &kSuccess)}}, 12068 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, &kSuccess)}},
11781 {kProxy, 12069 {__LINE__,
12070 kProxy,
11782 AUTH_ASYNC, 12071 AUTH_ASYNC,
11783 ERR_INVALID_AUTH_CREDENTIALS, 12072 ERR_INVALID_AUTH_CREDENTIALS,
11784 kSecureServer, 12073 kSecureServer,
11785 AUTH_NONE, 12074 AUTH_NONE,
11786 OK, 12075 OK,
11787 2, 12076 2,
11788 kNoSSL, 12077 kNoSSL,
11789 {TestRound(kConnect, kProxyChallenge, OK), 12078 {TestRound(kConnect, kProxyChallenge, OK),
11790 TestRound(kConnectProxyAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}}, 12079 TestRound(kConnect, kProxyConnected, OK, &kGet, &kSuccess)}},
11791 // Authenticating HTTPS server through an authenticating proxy. 12080 // Authenticating HTTPS server through an authenticating proxy.
11792 {kProxy, 12081 {__LINE__,
12082 kProxy,
11793 AUTH_SYNC, 12083 AUTH_SYNC,
11794 OK, 12084 OK,
11795 kSecureServer, 12085 kSecureServer,
11796 AUTH_SYNC, 12086 AUTH_SYNC,
11797 OK, 12087 OK,
11798 3, 12088 3,
11799 1, 12089 1,
11800 {TestRound(kConnect, kProxyChallenge, OK), 12090 {TestRound(kConnect, kProxyChallenge, OK),
11801 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, 12091 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet,
11802 &kServerChallenge), 12092 &kServerChallenge),
11803 TestRound(kGetAuth, kSuccess, OK)}}, 12093 TestRound(kGetAuth, kSuccess, OK)}},
11804 {kProxy, 12094 {__LINE__,
12095 kProxy,
11805 AUTH_SYNC, 12096 AUTH_SYNC,
11806 OK, 12097 OK,
11807 kSecureServer, 12098 kSecureServer,
11808 AUTH_SYNC, 12099 AUTH_SYNC,
11809 ERR_INVALID_AUTH_CREDENTIALS, 12100 ERR_INVALID_AUTH_CREDENTIALS,
11810 3, 12101 3,
11811 1, 12102 1,
11812 {TestRound(kConnect, kProxyChallenge, OK), 12103 {TestRound(kConnect, kProxyChallenge, OK),
11813 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, 12104 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet,
11814 &kServerChallenge), 12105 &kServerChallenge),
11815 TestRound(kGetAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}}, 12106 TestRound(kGet, kSuccess, OK)}},
11816 {kProxy, 12107 {__LINE__,
12108 kProxy,
11817 AUTH_ASYNC, 12109 AUTH_ASYNC,
11818 OK, 12110 OK,
11819 kSecureServer, 12111 kSecureServer,
11820 AUTH_SYNC, 12112 AUTH_SYNC,
11821 OK, 12113 OK,
11822 3, 12114 3,
11823 1, 12115 1,
11824 {TestRound(kConnect, kProxyChallenge, OK), 12116 {TestRound(kConnect, kProxyChallenge, OK),
11825 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, 12117 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet,
11826 &kServerChallenge), 12118 &kServerChallenge),
11827 TestRound(kGetAuth, kSuccess, OK)}}, 12119 TestRound(kGetAuth, kSuccess, OK)}},
11828 {kProxy, 12120 {__LINE__,
12121 kProxy,
11829 AUTH_ASYNC, 12122 AUTH_ASYNC,
11830 OK, 12123 OK,
11831 kSecureServer, 12124 kSecureServer,
11832 AUTH_SYNC, 12125 AUTH_SYNC,
11833 ERR_INVALID_AUTH_CREDENTIALS, 12126 ERR_INVALID_AUTH_CREDENTIALS,
11834 3, 12127 3,
11835 1, 12128 1,
11836 {TestRound(kConnect, kProxyChallenge, OK), 12129 {TestRound(kConnect, kProxyChallenge, OK),
11837 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, 12130 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet,
11838 &kServerChallenge), 12131 &kServerChallenge),
11839 TestRound(kGetAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}}, 12132 TestRound(kGet, kSuccess, OK)}},
11840 {kProxy, 12133 {__LINE__,
12134 kProxy,
11841 AUTH_SYNC, 12135 AUTH_SYNC,
11842 OK, 12136 OK,
11843 kSecureServer, 12137 kSecureServer,
11844 AUTH_ASYNC, 12138 AUTH_ASYNC,
11845 OK, 12139 OK,
11846 3, 12140 3,
11847 1, 12141 1,
11848 {TestRound(kConnect, kProxyChallenge, OK), 12142 {TestRound(kConnect, kProxyChallenge, OK),
11849 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, 12143 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet,
11850 &kServerChallenge), 12144 &kServerChallenge),
11851 TestRound(kGetAuth, kSuccess, OK)}}, 12145 TestRound(kGetAuth, kSuccess, OK)}},
11852 {kProxy, 12146 {__LINE__,
12147 kProxy,
11853 AUTH_SYNC, 12148 AUTH_SYNC,
11854 OK, 12149 OK,
11855 kSecureServer, 12150 kSecureServer,
11856 AUTH_ASYNC, 12151 AUTH_ASYNC,
11857 ERR_INVALID_AUTH_CREDENTIALS, 12152 ERR_INVALID_AUTH_CREDENTIALS,
11858 3, 12153 3,
11859 1, 12154 1,
11860 {TestRound(kConnect, kProxyChallenge, OK), 12155 {TestRound(kConnect, kProxyChallenge, OK),
11861 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, 12156 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet,
11862 &kServerChallenge), 12157 &kServerChallenge),
11863 TestRound(kGetAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}}, 12158 TestRound(kGet, kSuccess, OK)}},
11864 {kProxy, 12159 {__LINE__,
12160 kProxy,
11865 AUTH_ASYNC, 12161 AUTH_ASYNC,
11866 OK, 12162 OK,
11867 kSecureServer, 12163 kSecureServer,
11868 AUTH_ASYNC, 12164 AUTH_ASYNC,
11869 OK, 12165 OK,
11870 3, 12166 3,
11871 1, 12167 1,
11872 {TestRound(kConnect, kProxyChallenge, OK), 12168 {TestRound(kConnect, kProxyChallenge, OK),
11873 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, 12169 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet,
11874 &kServerChallenge), 12170 &kServerChallenge),
11875 TestRound(kGetAuth, kSuccess, OK)}}, 12171 TestRound(kGetAuth, kSuccess, OK)}},
11876 {kProxy, 12172 {__LINE__,
12173 kProxy,
11877 AUTH_ASYNC, 12174 AUTH_ASYNC,
11878 OK, 12175 OK,
11879 kSecureServer, 12176 kSecureServer,
11880 AUTH_ASYNC, 12177 AUTH_ASYNC,
11881 ERR_INVALID_AUTH_CREDENTIALS, 12178 ERR_INVALID_AUTH_CREDENTIALS,
11882 3, 12179 3,
11883 1, 12180 1,
11884 {TestRound(kConnect, kProxyChallenge, OK), 12181 {TestRound(kConnect, kProxyChallenge, OK),
11885 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet, 12182 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet,
11886 &kServerChallenge), 12183 &kServerChallenge),
11887 TestRound(kGetAuth, kFailure, ERR_INVALID_AUTH_CREDENTIALS)}}, 12184 TestRound(kGet, kSuccess, OK)}},
12185 {__LINE__,
12186 kProxy,
12187 AUTH_ASYNC,
12188 ERR_INVALID_AUTH_CREDENTIALS,
12189 kSecureServer,
12190 AUTH_ASYNC,
12191 ERR_INVALID_AUTH_CREDENTIALS,
12192 4,
12193 2,
12194 {TestRound(kConnect, kProxyChallenge, OK),
12195 TestRound(kConnect, kProxyChallenge, OK),
12196 TestRound(kConnectProxyAuth, kProxyConnected, OK, &kGet,
12197 &kServerChallenge),
12198 TestRound(kGet, kSuccess, OK)}},
11888 }; 12199 };
11889 12200
11890 for (size_t i = 0; i < arraysize(test_configs); ++i) { 12201 for (const auto& test_config : test_configs) {
12202 SCOPED_TRACE(::testing::Message() << "Test config at "
12203 << test_config.line_number);
11891 HttpAuthHandlerMock::Factory* auth_factory( 12204 HttpAuthHandlerMock::Factory* auth_factory(
11892 new HttpAuthHandlerMock::Factory()); 12205 new HttpAuthHandlerMock::Factory());
11893 session_deps_.http_auth_handler_factory.reset(auth_factory); 12206 session_deps_.http_auth_handler_factory.reset(auth_factory);
11894 SSLInfo empty_ssl_info; 12207 SSLInfo empty_ssl_info;
11895 const TestConfig& test_config = test_configs[i];
11896 12208
11897 // Set up authentication handlers as necessary. 12209 // Set up authentication handlers as necessary.
11898 if (test_config.proxy_auth_timing != AUTH_NONE) { 12210 if (test_config.proxy_auth_timing != AUTH_NONE) {
11899 for (int n = 0; n < 2; n++) { 12211 for (int n = 0; n < 3; n++) {
11900 HttpAuthHandlerMock* auth_handler(new HttpAuthHandlerMock()); 12212 HttpAuthHandlerMock* auth_handler(new HttpAuthHandlerMock());
11901 std::string auth_challenge = "Mock realm=proxy"; 12213 std::string auth_challenge = "Mock realm=proxy";
11902 GURL origin(test_config.proxy_url); 12214 GURL origin(test_config.proxy_url);
11903 HttpAuthChallengeTokenizer tokenizer(auth_challenge.begin(), 12215 HttpAuthChallengeTokenizer tokenizer(auth_challenge.begin(),
11904 auth_challenge.end()); 12216 auth_challenge.end());
11905 auth_handler->InitFromChallenge(&tokenizer, HttpAuth::AUTH_PROXY, 12217 auth_handler->InitFromChallenge(&tokenizer, HttpAuth::AUTH_PROXY,
11906 empty_ssl_info, origin, 12218 empty_ssl_info, origin,
11907 NetLogWithSource()); 12219 NetLogWithSource());
11908 auth_handler->SetGenerateExpectation( 12220 auth_handler->SetGenerateExpectation(
11909 test_config.proxy_auth_timing == AUTH_ASYNC, 12221 test_config.proxy_auth_timing == AUTH_ASYNC,
11910 test_config.proxy_auth_rv); 12222 n == 0 ? test_config.first_generate_proxy_token_rv : OK);
11911 auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_PROXY); 12223 auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_PROXY);
11912 } 12224 }
11913 } 12225 }
11914 if (test_config.server_auth_timing != AUTH_NONE) { 12226 if (test_config.server_auth_timing != AUTH_NONE) {
11915 HttpAuthHandlerMock* auth_handler(new HttpAuthHandlerMock()); 12227 HttpAuthHandlerMock* auth_handler(new HttpAuthHandlerMock());
11916 std::string auth_challenge = "Mock realm=server"; 12228 std::string auth_challenge = "Mock realm=server";
11917 GURL origin(test_config.server_url); 12229 GURL origin(test_config.server_url);
11918 HttpAuthChallengeTokenizer tokenizer(auth_challenge.begin(), 12230 HttpAuthChallengeTokenizer tokenizer(auth_challenge.begin(),
11919 auth_challenge.end()); 12231 auth_challenge.end());
11920 auth_handler->InitFromChallenge(&tokenizer, HttpAuth::AUTH_SERVER, 12232 auth_handler->InitFromChallenge(&tokenizer, HttpAuth::AUTH_SERVER,
11921 empty_ssl_info, origin, 12233 empty_ssl_info, origin,
11922 NetLogWithSource()); 12234 NetLogWithSource());
11923 auth_handler->SetGenerateExpectation( 12235 auth_handler->SetGenerateExpectation(
11924 test_config.server_auth_timing == AUTH_ASYNC, 12236 test_config.server_auth_timing == AUTH_ASYNC,
11925 test_config.server_auth_rv); 12237 test_config.first_generate_server_token_rv);
11926 auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_SERVER); 12238 auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_SERVER);
12239
12240 // The second handler always succeeds. It should only be used where there
12241 // are multiple auth sessions for server auth in the same network
12242 // transaction using the same auth scheme.
12243 std::unique_ptr<HttpAuthHandlerMock> second_handler =
12244 base::MakeUnique<HttpAuthHandlerMock>();
12245 second_handler->InitFromChallenge(&tokenizer, HttpAuth::AUTH_SERVER,
12246 empty_ssl_info, origin,
12247 NetLogWithSource());
12248 second_handler->SetGenerateExpectation(true, OK);
12249 auth_factory->AddMockHandler(second_handler.release(),
12250 HttpAuth::AUTH_SERVER);
11927 } 12251 }
11928 if (test_config.proxy_url) { 12252 if (test_config.proxy_url) {
11929 session_deps_.proxy_service = 12253 session_deps_.proxy_service =
11930 ProxyService::CreateFixed(test_config.proxy_url); 12254 ProxyService::CreateFixed(test_config.proxy_url);
11931 } else { 12255 } else {
11932 session_deps_.proxy_service = ProxyService::CreateDirect(); 12256 session_deps_.proxy_service = ProxyService::CreateDirect();
11933 } 12257 }
11934 12258
11935 HttpRequestInfo request; 12259 HttpRequestInfo request;
11936 request.method = "GET"; 12260 request.method = "GET";
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
11991 if (round == 0) { 12315 if (round == 0) {
11992 rv = trans.Start(&request, callback.callback(), NetLogWithSource()); 12316 rv = trans.Start(&request, callback.callback(), NetLogWithSource());
11993 } else { 12317 } else {
11994 rv = trans.RestartWithAuth( 12318 rv = trans.RestartWithAuth(
11995 AuthCredentials(kFoo, kBar), callback.callback()); 12319 AuthCredentials(kFoo, kBar), callback.callback());
11996 } 12320 }
11997 if (rv == ERR_IO_PENDING) 12321 if (rv == ERR_IO_PENDING)
11998 rv = callback.WaitForResult(); 12322 rv = callback.WaitForResult();
11999 12323
12000 // Compare results with expected data. 12324 // Compare results with expected data.
12001 EXPECT_EQ(read_write_round.expected_rv, rv); 12325 EXPECT_THAT(rv, IsError(read_write_round.expected_rv));
12002 const HttpResponseInfo* response = trans.GetResponseInfo(); 12326 const HttpResponseInfo* response = trans.GetResponseInfo();
12003 if (read_write_round.expected_rv != OK) { 12327 if (read_write_round.expected_rv != OK) {
12004 EXPECT_EQ(round + 1, test_config.num_auth_rounds); 12328 EXPECT_EQ(round + 1, test_config.num_auth_rounds);
12005 continue; 12329 continue;
12006 } 12330 }
12007 if (round + 1 < test_config.num_auth_rounds) { 12331 if (round + 1 < test_config.num_auth_rounds) {
12008 EXPECT_TRUE(response->auth_challenge); 12332 EXPECT_TRUE(response->auth_challenge);
12009 } else { 12333 } else {
12010 EXPECT_FALSE(response->auth_challenge); 12334 EXPECT_FALSE(response->auth_challenge);
12335 EXPECT_FALSE(trans.IsReadyToRestartForAuth());
12011 } 12336 }
12012 } 12337 }
12013 } 12338 }
12014 } 12339 }
12015 12340
12016 TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) { 12341 TEST_F(HttpNetworkTransactionTest, MultiRoundAuth) {
12017 // Do multi-round authentication and make sure it works correctly. 12342 // Do multi-round authentication and make sure it works correctly.
12018 HttpAuthHandlerMock::Factory* auth_factory( 12343 HttpAuthHandlerMock::Factory* auth_factory(
12019 new HttpAuthHandlerMock::Factory()); 12344 new HttpAuthHandlerMock::Factory());
12020 session_deps_.http_auth_handler_factory.reset(auth_factory); 12345 session_deps_.http_auth_handler_factory.reset(auth_factory);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
12114 // First round of authentication. 12439 // First round of authentication.
12115 auth_handler->SetGenerateExpectation(false, OK); 12440 auth_handler->SetGenerateExpectation(false, OK);
12116 rv = trans.Start(&request, callback.callback(), NetLogWithSource()); 12441 rv = trans.Start(&request, callback.callback(), NetLogWithSource());
12117 if (rv == ERR_IO_PENDING) 12442 if (rv == ERR_IO_PENDING)
12118 rv = callback.WaitForResult(); 12443 rv = callback.WaitForResult();
12119 EXPECT_THAT(rv, IsOk()); 12444 EXPECT_THAT(rv, IsOk());
12120 response = trans.GetResponseInfo(); 12445 response = trans.GetResponseInfo();
12121 ASSERT_TRUE(response); 12446 ASSERT_TRUE(response);
12122 EXPECT_TRUE(response->auth_challenge); 12447 EXPECT_TRUE(response->auth_challenge);
12123 EXPECT_EQ(0, transport_pool->IdleSocketCountInGroup(kSocketGroup)); 12448 EXPECT_EQ(0, transport_pool->IdleSocketCountInGroup(kSocketGroup));
12449 EXPECT_EQ(HttpAuthHandlerMock::State::WAIT_FOR_GENERATE_AUTH_TOKEN,
12450 auth_handler->state());
12124 12451
12125 // In between rounds, another request comes in for the same domain. 12452 // In between rounds, another request comes in for the same domain.
12126 // It should not be able to grab the TCP socket that trans has already 12453 // It should not be able to grab the TCP socket that trans has already
12127 // claimed. 12454 // claimed.
12128 HttpNetworkTransaction trans_compete(DEFAULT_PRIORITY, session.get()); 12455 HttpNetworkTransaction trans_compete(DEFAULT_PRIORITY, session.get());
12129 TestCompletionCallback callback_compete; 12456 TestCompletionCallback callback_compete;
12130 rv = trans_compete.Start(&request, callback_compete.callback(), 12457 rv = trans_compete.Start(&request, callback_compete.callback(),
12131 NetLogWithSource()); 12458 NetLogWithSource());
12132 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 12459 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
12133 // callback_compete.WaitForResult at this point would stall forever, 12460 // callback_compete.WaitForResult at this point would stall forever,
12134 // since the HttpNetworkTransaction does not release the request back to 12461 // since the HttpNetworkTransaction does not release the request back to
12135 // the pool until after authentication completes. 12462 // the pool until after authentication completes.
12136 12463
12137 // Second round of authentication. 12464 // Second round of authentication.
12138 auth_handler->SetGenerateExpectation(false, OK); 12465 auth_handler->SetGenerateExpectation(false, OK);
12139 rv = trans.RestartWithAuth(AuthCredentials(kFoo, kBar), callback.callback()); 12466 rv = trans.RestartWithAuth(AuthCredentials(kFoo, kBar), callback.callback());
12140 if (rv == ERR_IO_PENDING) 12467 if (rv == ERR_IO_PENDING)
12141 rv = callback.WaitForResult(); 12468 rv = callback.WaitForResult();
12142 EXPECT_THAT(rv, IsOk()); 12469 EXPECT_THAT(rv, IsOk());
12143 response = trans.GetResponseInfo(); 12470 response = trans.GetResponseInfo();
12144 ASSERT_TRUE(response); 12471 ASSERT_TRUE(response);
12145 EXPECT_FALSE(response->auth_challenge); 12472 EXPECT_FALSE(response->auth_challenge);
12146 EXPECT_EQ(0, transport_pool->IdleSocketCountInGroup(kSocketGroup)); 12473 EXPECT_EQ(0, transport_pool->IdleSocketCountInGroup(kSocketGroup));
12474 EXPECT_EQ(HttpAuthHandlerMock::State::WAIT_FOR_GENERATE_AUTH_TOKEN,
12475 auth_handler->state());
12147 12476
12148 // Third round of authentication. 12477 // Third round of authentication.
12149 auth_handler->SetGenerateExpectation(false, OK); 12478 auth_handler->SetGenerateExpectation(false, OK);
12150 rv = trans.RestartWithAuth(AuthCredentials(), callback.callback()); 12479 rv = trans.RestartWithAuth(AuthCredentials(), callback.callback());
12151 if (rv == ERR_IO_PENDING) 12480 if (rv == ERR_IO_PENDING)
12152 rv = callback.WaitForResult(); 12481 rv = callback.WaitForResult();
12153 EXPECT_THAT(rv, IsOk()); 12482 EXPECT_THAT(rv, IsOk());
12154 response = trans.GetResponseInfo(); 12483 response = trans.GetResponseInfo();
12155 ASSERT_TRUE(response); 12484 ASSERT_TRUE(response);
12156 EXPECT_FALSE(response->auth_challenge); 12485 EXPECT_FALSE(response->auth_challenge);
12157 EXPECT_EQ(0, transport_pool->IdleSocketCountInGroup(kSocketGroup)); 12486 EXPECT_EQ(0, transport_pool->IdleSocketCountInGroup(kSocketGroup));
12487 EXPECT_EQ(HttpAuthHandlerMock::State::WAIT_FOR_GENERATE_AUTH_TOKEN,
12488 auth_handler->state());
12158 12489
12159 // Fourth round of authentication, which completes successfully. 12490 // Fourth round of authentication, which completes successfully.
12160 auth_handler->SetGenerateExpectation(false, OK); 12491 auth_handler->SetGenerateExpectation(false, OK);
12161 rv = trans.RestartWithAuth(AuthCredentials(), callback.callback()); 12492 rv = trans.RestartWithAuth(AuthCredentials(), callback.callback());
12162 if (rv == ERR_IO_PENDING) 12493 if (rv == ERR_IO_PENDING)
12163 rv = callback.WaitForResult(); 12494 rv = callback.WaitForResult();
12164 EXPECT_THAT(rv, IsOk()); 12495 EXPECT_THAT(rv, IsOk());
12165 response = trans.GetResponseInfo(); 12496 response = trans.GetResponseInfo();
12166 ASSERT_TRUE(response); 12497 ASSERT_TRUE(response);
12167 EXPECT_FALSE(response->auth_challenge); 12498 EXPECT_FALSE(response->auth_challenge);
12168 EXPECT_EQ(0, transport_pool->IdleSocketCountInGroup(kSocketGroup)); 12499 EXPECT_EQ(0, transport_pool->IdleSocketCountInGroup(kSocketGroup));
12169 12500
12501 // In WAIT_FOR_CHALLENGE, although in reality the auth handler is done. A real
12502 // auth handler should transition to a DONE state in concert with the remote
12503 // server. But that's not something we can test here with a mock handler.
12504 EXPECT_EQ(HttpAuthHandlerMock::State::WAIT_FOR_CHALLENGE,
12505 auth_handler->state());
12506
12170 // Read the body since the fourth round was successful. This will also 12507 // Read the body since the fourth round was successful. This will also
12171 // release the socket back to the pool. 12508 // release the socket back to the pool.
12172 scoped_refptr<IOBufferWithSize> io_buf(new IOBufferWithSize(50)); 12509 scoped_refptr<IOBufferWithSize> io_buf(new IOBufferWithSize(50));
12173 rv = trans.Read(io_buf.get(), io_buf->size(), callback.callback()); 12510 rv = trans.Read(io_buf.get(), io_buf->size(), callback.callback());
12174 if (rv == ERR_IO_PENDING) 12511 if (rv == ERR_IO_PENDING)
12175 rv = callback.WaitForResult(); 12512 rv = callback.WaitForResult();
12176 EXPECT_EQ(3, rv); 12513 EXPECT_EQ(3, rv);
12177 rv = trans.Read(io_buf.get(), io_buf->size(), callback.callback()); 12514 rv = trans.Read(io_buf.get(), io_buf->size(), callback.callback());
12178 EXPECT_EQ(0, rv); 12515 EXPECT_EQ(0, rv);
12179 // There are still 0 idle sockets, since the trans_compete transaction 12516 // There are still 0 idle sockets, since the trans_compete transaction
(...skipping 3702 matching lines...) Expand 10 before | Expand all | Expand 10 after
15882 base::RunLoop().RunUntilIdle(); 16219 base::RunLoop().RunUntilIdle();
15883 16220
15884 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy); 16221 EXPECT_TRUE(trans.GetResponseInfo()->was_fetched_via_spdy);
15885 HttpRequestHeaders headers; 16222 HttpRequestHeaders headers;
15886 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers)); 16223 ASSERT_TRUE(trans.GetFullRequestHeaders(&headers));
15887 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding)); 16224 EXPECT_TRUE(headers.HasHeader(HttpRequestHeaders::kTokenBinding));
15888 } 16225 }
15889 #endif // !defined(OS_IOS) 16226 #endif // !defined(OS_IOS)
15890 16227
15891 } // namespace net 16228 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_auth_handler_mock.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698