OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |