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

Side by Side Diff: net/spdy/spdy_proxy_client_socket_unittest.cc

Issue 8502024: Allow chrome to handle 407 auth challenges to CONNECT requests (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: fix typo in unittest Created 9 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 | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_proxy_client_socket.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 (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/spdy/spdy_proxy_client_socket.h" 5 #include "net/spdy/spdy_proxy_client_socket.h"
6 6
7 #include "base/utf_string_conversions.h" 7 #include "base/utf_string_conversions.h"
8 #include "net/base/address_list.h" 8 #include "net/base/address_list.h"
9 #include "net/base/net_log.h" 9 #include "net/base/net_log.h"
10 #include "net/base/net_log_unittest.h" 10 #include "net/base/net_log_unittest.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 59
60 virtual void TearDown(); 60 virtual void TearDown();
61 61
62 protected: 62 protected:
63 void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes, 63 void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes,
64 size_t writes_count); 64 size_t writes_count);
65 spdy::SpdyFrame* ConstructConnectRequestFrame(); 65 spdy::SpdyFrame* ConstructConnectRequestFrame();
66 spdy::SpdyFrame* ConstructConnectAuthRequestFrame(); 66 spdy::SpdyFrame* ConstructConnectAuthRequestFrame();
67 spdy::SpdyFrame* ConstructConnectReplyFrame(); 67 spdy::SpdyFrame* ConstructConnectReplyFrame();
68 spdy::SpdyFrame* ConstructConnectAuthReplyFrame(); 68 spdy::SpdyFrame* ConstructConnectAuthReplyFrame();
69 spdy::SpdyFrame* ConstructNtlmAuthReplyFrame();
69 spdy::SpdyFrame* ConstructConnectErrorReplyFrame(); 70 spdy::SpdyFrame* ConstructConnectErrorReplyFrame();
70 spdy::SpdyFrame* ConstructBodyFrame(const char* data, int length); 71 spdy::SpdyFrame* ConstructBodyFrame(const char* data, int length);
71 scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size); 72 scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size);
72 void AssertConnectSucceeds(); 73 void AssertConnectSucceeds();
73 void AssertConnectFails(int result); 74 void AssertConnectFails(int result);
74 void AssertConnectionEstablished(); 75 void AssertConnectionEstablished();
75 void AssertSyncReadEquals(const char* data, int len); 76 void AssertSyncReadEquals(const char* data, int len);
76 void AssertAsyncReadEquals(const char* data, int len); 77 void AssertAsyncReadEquals(const char* data, int len);
77 void AssertReadStarts(const char* data, int len); 78 void AssertReadStarts(const char* data, int len);
78 void AssertReadReturns(const char* data, int len); 79 void AssertReadReturns(const char* data, int len);
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 0, 381 0,
381 false, 382 false,
382 kStreamId, 383 kStreamId,
383 LOWEST, 384 LOWEST,
384 spdy::SYN_REPLY, 385 spdy::SYN_REPLY,
385 spdy::CONTROL_FLAG_NONE, 386 spdy::CONTROL_FLAG_NONE,
386 kStandardReplyHeaders, 387 kStandardReplyHeaders,
387 arraysize(kStandardReplyHeaders)); 388 arraysize(kStandardReplyHeaders));
388 } 389 }
389 390
391 // Constructs a SPDY SYN_REPLY frame to match the SPDY CONNECT which
392 // requires Proxy Authentication using NTLM.
393 spdy::SpdyFrame* SpdyProxyClientSocketTest::ConstructNtlmAuthReplyFrame() {
394 const char* const kStandardReplyHeaders[] = {
395 "status", "407 Proxy Authentication Required",
396 "version", "HTTP/1.1",
397 "proxy-authenticate", "NTLM",
398 };
399
400 return ConstructSpdyControlFrame(NULL,
401 0,
402 false,
403 kStreamId,
404 LOWEST,
405 spdy::SYN_REPLY,
406 spdy::CONTROL_FLAG_NONE,
407 kStandardReplyHeaders,
408 arraysize(kStandardReplyHeaders));
409 }
410
390 // Constructs a SPDY SYN_REPLY frame with an HTTP 500 error. 411 // Constructs a SPDY SYN_REPLY frame with an HTTP 500 error.
391 spdy::SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() { 412 spdy::SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() {
392 const char* const kStandardReplyHeaders[] = { 413 const char* const kStandardReplyHeaders[] = {
393 "status", "500 Internal Server Error", 414 "status", "500 Internal Server Error",
394 "version", "HTTP/1.1", 415 "version", "HTTP/1.1",
395 }; 416 };
396 417
397 return ConstructSpdyControlFrame(NULL, 418 return ConstructSpdyControlFrame(NULL,
398 0, 419 0,
399 false, 420 false,
(...skipping 26 matching lines...) Expand all
426 447
427 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 448 Initialize(reads, arraysize(reads), writes, arraysize(writes));
428 449
429 ASSERT_FALSE(sock_->IsConnected()); 450 ASSERT_FALSE(sock_->IsConnected());
430 451
431 AssertConnectSucceeds(); 452 AssertConnectSucceeds();
432 453
433 AssertConnectionEstablished(); 454 AssertConnectionEstablished();
434 } 455 }
435 456
457 TEST_F(SpdyProxyClientSocketTest, ConnectWithUnsupportedAuth) {
458 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame());
459 MockWrite writes[] = {
460 CreateMockWrite(*conn, 0, false),
461 };
462
463 scoped_ptr<spdy::SpdyFrame> resp(ConstructNtlmAuthReplyFrame());
464 MockRead reads[] = {
465 CreateMockRead(*resp, 1, true),
466 MockRead(true, 0, 3), // EOF
467 };
468
469 Initialize(reads, arraysize(reads), writes, arraysize(writes));
470
471 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED);
472 }
473
436 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthRequested) { 474 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthRequested) {
437 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); 475 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame());
438 MockWrite writes[] = { 476 MockWrite writes[] = {
439 CreateMockWrite(*conn, 0, false), 477 CreateMockWrite(*conn, 0, false),
440 }; 478 };
441 479
442 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame()); 480 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame());
443 MockRead reads[] = { 481 MockRead reads[] = {
444 CreateMockRead(*resp, 1, true), 482 CreateMockRead(*resp, 1, true),
445 MockRead(true, 0, 3), // EOF 483 MockRead(true, 0, 3), // EOF
446 }; 484 };
447 485
448 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 486 Initialize(reads, arraysize(reads), writes, arraysize(writes));
449 487
450 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); 488 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED);
451 489
452 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); 490 const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
453 ASSERT_TRUE(response != NULL); 491 ASSERT_TRUE(response != NULL);
454 ASSERT_EQ(407, response->headers->response_code()); 492 ASSERT_EQ(407, response->headers->response_code());
455 ASSERT_EQ("Proxy Authentication Required", 493 ASSERT_EQ("Proxy Authentication Required",
456 response->headers->GetStatusText()); 494 response->headers->GetStatusText());
457 } 495 }
458 496
459 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) { 497 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) {
460 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectAuthRequestFrame()); 498 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectAuthRequestFrame());
461 MockWrite writes[] = { 499 MockWrite writes[] = {
462 CreateMockWrite(*conn, 0, false), 500 CreateMockWrite(*conn, 0, false),
463 }; 501 };
464 502
465 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); 503 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame());
466 MockRead reads[] = { 504 MockRead reads[] = {
467 CreateMockRead(*resp, 1, true), 505 CreateMockRead(*resp, 1, true),
468 MockRead(true, 0, 3), // EOF 506 MockRead(true, 0, 3), // EOF
469 }; 507 };
470 508
471 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 509 Initialize(reads, arraysize(reads), writes, arraysize(writes));
472 AddAuthToCache(); 510 AddAuthToCache();
473 511
474 AssertConnectSucceeds(); 512 AssertConnectSucceeds();
475 513
476 AssertConnectionEstablished(); 514 AssertConnectionEstablished();
477 } 515 }
478 516
517 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthRestart) {
518 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame());
519 scoped_ptr<spdy::SpdyFrame> auth(ConstructConnectAuthRequestFrame());
520 MockWrite writes[] = {
521 CreateMockWrite(*conn, 0, false),
522 };
523
524 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame());
525 scoped_ptr<spdy::SpdyFrame> auth_resp(ConstructConnectReplyFrame());
526 MockRead reads[] = {
527 CreateMockRead(*resp, 1, true),
528 MockRead(true, 0, 3), // EOF
529 };
530
531 Initialize(reads, arraysize(reads), writes, arraysize(writes));
532
533 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED);
534
535 const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
536 ASSERT_TRUE(response != NULL);
537 ASSERT_EQ(407, response->headers->response_code());
538 ASSERT_EQ("Proxy Authentication Required",
539 response->headers->GetStatusText());
540
541 AddAuthToCache();
542
543 ASSERT_EQ(OK, sock_->RestartWithAuth(&read_callback_));
544 // A SpdyProxyClientSocket sits on a single SPDY stream which can
545 // only be used for a single request/response.
546 ASSERT_FALSE(sock_->IsConnectedAndIdle());
547 }
548
479 TEST_F(SpdyProxyClientSocketTest, ConnectFails) { 549 TEST_F(SpdyProxyClientSocketTest, ConnectFails) {
480 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); 550 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame());
481 MockWrite writes[] = { 551 MockWrite writes[] = {
482 CreateMockWrite(*conn, 0, false), 552 CreateMockWrite(*conn, 0, false),
483 }; 553 };
484 554
485 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); 555 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame());
486 MockRead reads[] = { 556 MockRead reads[] = {
487 MockRead(true, 0, 1), // EOF 557 MockRead(true, 0, 1), // EOF
488 }; 558 };
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); 884 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2));
815 MockRead reads[] = { 885 MockRead reads[] = {
816 CreateMockRead(*resp, 1, true), 886 CreateMockRead(*resp, 1, true),
817 CreateMockRead(*msg1, 2, true), 887 CreateMockRead(*msg1, 2, true),
818 CreateMockRead(*msg2, 3, true), 888 CreateMockRead(*msg2, 3, true),
819 MockRead(true, 0, 4), // EOF 889 MockRead(true, 0, 4), // EOF
820 }; 890 };
821 891
822 Initialize(reads, arraysize(reads), writes, arraysize(writes)); 892 Initialize(reads, arraysize(reads), writes, arraysize(writes));
823 893
824 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); 894 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED);
825 895
826 Run(2); // SpdySession consumes the next two reads and sends then to 896 Run(2); // SpdySession consumes the next two reads and sends then to
827 // sock_ to be buffered. 897 // sock_ to be buffered.
828 AssertSyncReadEquals(kMsg1, kLen1); 898 AssertSyncReadEquals(kMsg1, kLen1);
829 AssertSyncReadEquals(kMsg2, kLen2); 899 AssertSyncReadEquals(kMsg2, kLen2);
830 } 900 }
831 901
832 TEST_F(SpdyProxyClientSocketTest, ReadErrorResponseBody) { 902 TEST_F(SpdyProxyClientSocketTest, ReadErrorResponseBody) {
833 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); 903 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame());
834 MockWrite writes[] = { 904 MockWrite writes[] = {
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
1162 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1)); 1232 scoped_refptr<IOBuffer> buf(new IOBuffer(kLen1));
1163 ASSERT_EQ(ERR_IO_PENDING, sock_->Read(buf, kLen1, &read_callback_)); 1233 ASSERT_EQ(ERR_IO_PENDING, sock_->Read(buf, kLen1, &read_callback_));
1164 1234
1165 sock_->Disconnect(); 1235 sock_->Disconnect();
1166 1236
1167 EXPECT_FALSE(sock_->IsConnected()); 1237 EXPECT_FALSE(sock_->IsConnected());
1168 EXPECT_FALSE(read_callback_.have_result()); 1238 EXPECT_FALSE(read_callback_.have_result());
1169 } 1239 }
1170 1240
1171 } // namespace net 1241 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_proxy_client_socket.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698