| 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 |