| 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(); | |
| 70 spdy::SpdyFrame* ConstructConnectErrorReplyFrame(); | 69 spdy::SpdyFrame* ConstructConnectErrorReplyFrame(); |
| 71 spdy::SpdyFrame* ConstructBodyFrame(const char* data, int length); | 70 spdy::SpdyFrame* ConstructBodyFrame(const char* data, int length); |
| 72 scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size); | 71 scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size); |
| 73 void AssertConnectSucceeds(); | 72 void AssertConnectSucceeds(); |
| 74 void AssertConnectFails(int result); | 73 void AssertConnectFails(int result); |
| 75 void AssertConnectionEstablished(); | 74 void AssertConnectionEstablished(); |
| 76 void AssertSyncReadEquals(const char* data, int len); | 75 void AssertSyncReadEquals(const char* data, int len); |
| 77 void AssertAsyncReadEquals(const char* data, int len); | 76 void AssertAsyncReadEquals(const char* data, int len); |
| 78 void AssertReadStarts(const char* data, int len); | 77 void AssertReadStarts(const char* data, int len); |
| 79 void AssertReadReturns(const char* data, int len); | 78 void AssertReadReturns(const char* data, int len); |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 0, | 382 0, |
| 384 false, | 383 false, |
| 385 kStreamId, | 384 kStreamId, |
| 386 LOWEST, | 385 LOWEST, |
| 387 spdy::SYN_REPLY, | 386 spdy::SYN_REPLY, |
| 388 spdy::CONTROL_FLAG_NONE, | 387 spdy::CONTROL_FLAG_NONE, |
| 389 kStandardReplyHeaders, | 388 kStandardReplyHeaders, |
| 390 arraysize(kStandardReplyHeaders)); | 389 arraysize(kStandardReplyHeaders)); |
| 391 } | 390 } |
| 392 | 391 |
| 393 // Constructs a SPDY SYN_REPLY frame to match the SPDY CONNECT which | |
| 394 // requires Proxy Authentication using NTLM. | |
| 395 spdy::SpdyFrame* SpdyProxyClientSocketTest::ConstructNtlmAuthReplyFrame() { | |
| 396 const char* const kStandardReplyHeaders[] = { | |
| 397 "status", "407 Proxy Authentication Required", | |
| 398 "version", "HTTP/1.1", | |
| 399 "proxy-authenticate", "NTLM", | |
| 400 }; | |
| 401 | |
| 402 return ConstructSpdyControlFrame(NULL, | |
| 403 0, | |
| 404 false, | |
| 405 kStreamId, | |
| 406 LOWEST, | |
| 407 spdy::SYN_REPLY, | |
| 408 spdy::CONTROL_FLAG_NONE, | |
| 409 kStandardReplyHeaders, | |
| 410 arraysize(kStandardReplyHeaders)); | |
| 411 } | |
| 412 | |
| 413 // Constructs a SPDY SYN_REPLY frame with an HTTP 500 error. | 392 // Constructs a SPDY SYN_REPLY frame with an HTTP 500 error. |
| 414 spdy::SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() { | 393 spdy::SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() { |
| 415 const char* const kStandardReplyHeaders[] = { | 394 const char* const kStandardReplyHeaders[] = { |
| 416 "status", "500 Internal Server Error", | 395 "status", "500 Internal Server Error", |
| 417 "version", "HTTP/1.1", | 396 "version", "HTTP/1.1", |
| 418 }; | 397 }; |
| 419 | 398 |
| 420 return ConstructSpdyControlFrame(NULL, | 399 return ConstructSpdyControlFrame(NULL, |
| 421 0, | 400 0, |
| 422 false, | 401 false, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 449 | 428 |
| 450 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 429 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 451 | 430 |
| 452 ASSERT_FALSE(sock_->IsConnected()); | 431 ASSERT_FALSE(sock_->IsConnected()); |
| 453 | 432 |
| 454 AssertConnectSucceeds(); | 433 AssertConnectSucceeds(); |
| 455 | 434 |
| 456 AssertConnectionEstablished(); | 435 AssertConnectionEstablished(); |
| 457 } | 436 } |
| 458 | 437 |
| 459 TEST_F(SpdyProxyClientSocketTest, ConnectWithUnsupportedAuth) { | |
| 460 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | |
| 461 MockWrite writes[] = { | |
| 462 CreateMockWrite(*conn, 0, false), | |
| 463 }; | |
| 464 | |
| 465 scoped_ptr<spdy::SpdyFrame> resp(ConstructNtlmAuthReplyFrame()); | |
| 466 MockRead reads[] = { | |
| 467 CreateMockRead(*resp, 1, true), | |
| 468 MockRead(true, 0, 3), // EOF | |
| 469 }; | |
| 470 | |
| 471 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | |
| 472 | |
| 473 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); | |
| 474 } | |
| 475 | |
| 476 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthRequested) { | 438 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthRequested) { |
| 477 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 439 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 478 MockWrite writes[] = { | 440 MockWrite writes[] = { |
| 479 CreateMockWrite(*conn, 0, false), | 441 CreateMockWrite(*conn, 0, false), |
| 480 }; | 442 }; |
| 481 | 443 |
| 482 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame()); | 444 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame()); |
| 483 MockRead reads[] = { | 445 MockRead reads[] = { |
| 484 CreateMockRead(*resp, 1, true), | 446 CreateMockRead(*resp, 1, true), |
| 485 MockRead(true, 0, 3), // EOF | 447 MockRead(true, 0, 3), // EOF |
| 486 }; | 448 }; |
| 487 | 449 |
| 488 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 450 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 489 | 451 |
| 490 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); | 452 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); |
| 491 | 453 |
| 492 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); | 454 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
| 493 ASSERT_TRUE(response != NULL); | 455 ASSERT_TRUE(response != NULL); |
| 494 ASSERT_EQ(407, response->headers->response_code()); | 456 ASSERT_EQ(407, response->headers->response_code()); |
| 495 ASSERT_EQ("Proxy Authentication Required", | 457 ASSERT_EQ("Proxy Authentication Required", |
| 496 response->headers->GetStatusText()); | 458 response->headers->GetStatusText()); |
| 497 } | 459 } |
| 498 | 460 |
| 499 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) { | 461 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) { |
| 500 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectAuthRequestFrame()); | 462 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectAuthRequestFrame()); |
| 501 MockWrite writes[] = { | 463 MockWrite writes[] = { |
| 502 CreateMockWrite(*conn, 0, false), | 464 CreateMockWrite(*conn, 0, false), |
| 503 }; | 465 }; |
| 504 | 466 |
| 505 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 467 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 506 MockRead reads[] = { | 468 MockRead reads[] = { |
| 507 CreateMockRead(*resp, 1, true), | 469 CreateMockRead(*resp, 1, true), |
| 508 MockRead(true, 0, 3), // EOF | 470 MockRead(true, 0, 3), // EOF |
| 509 }; | 471 }; |
| 510 | 472 |
| 511 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 473 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 512 AddAuthToCache(); | 474 AddAuthToCache(); |
| 513 | 475 |
| 514 AssertConnectSucceeds(); | 476 AssertConnectSucceeds(); |
| 515 | 477 |
| 516 AssertConnectionEstablished(); | 478 AssertConnectionEstablished(); |
| 517 } | 479 } |
| 518 | 480 |
| 519 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthRestart) { | |
| 520 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | |
| 521 scoped_ptr<spdy::SpdyFrame> auth(ConstructConnectAuthRequestFrame()); | |
| 522 MockWrite writes[] = { | |
| 523 CreateMockWrite(*conn, 0, false), | |
| 524 }; | |
| 525 | |
| 526 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame()); | |
| 527 scoped_ptr<spdy::SpdyFrame> auth_resp(ConstructConnectReplyFrame()); | |
| 528 MockRead reads[] = { | |
| 529 CreateMockRead(*resp, 1, true), | |
| 530 MockRead(true, 0, 3), // EOF | |
| 531 }; | |
| 532 | |
| 533 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | |
| 534 | |
| 535 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); | |
| 536 | |
| 537 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); | |
| 538 ASSERT_TRUE(response != NULL); | |
| 539 ASSERT_EQ(407, response->headers->response_code()); | |
| 540 ASSERT_EQ("Proxy Authentication Required", | |
| 541 response->headers->GetStatusText()); | |
| 542 | |
| 543 AddAuthToCache(); | |
| 544 | |
| 545 ASSERT_EQ(OK, sock_->RestartWithAuth(&read_callback_old_)); | |
| 546 // A SpdyProxyClientSocket sits on a single SPDY stream which can | |
| 547 // only be used for a single request/response. | |
| 548 ASSERT_FALSE(sock_->IsConnectedAndIdle()); | |
| 549 } | |
| 550 | |
| 551 TEST_F(SpdyProxyClientSocketTest, ConnectFails) { | 481 TEST_F(SpdyProxyClientSocketTest, ConnectFails) { |
| 552 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 482 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 553 MockWrite writes[] = { | 483 MockWrite writes[] = { |
| 554 CreateMockWrite(*conn, 0, false), | 484 CreateMockWrite(*conn, 0, false), |
| 555 }; | 485 }; |
| 556 | 486 |
| 557 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 487 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 558 MockRead reads[] = { | 488 MockRead reads[] = { |
| 559 MockRead(true, 0, 1), // EOF | 489 MockRead(true, 0, 1), // EOF |
| 560 }; | 490 }; |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 823 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 894 MockRead reads[] = { | 824 MockRead reads[] = { |
| 895 CreateMockRead(*resp, 1, true), | 825 CreateMockRead(*resp, 1, true), |
| 896 CreateMockRead(*msg1, 2, true), | 826 CreateMockRead(*msg1, 2, true), |
| 897 CreateMockRead(*msg2, 3, true), | 827 CreateMockRead(*msg2, 3, true), |
| 898 MockRead(true, 0, 4), // EOF | 828 MockRead(true, 0, 4), // EOF |
| 899 }; | 829 }; |
| 900 | 830 |
| 901 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 831 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 902 | 832 |
| 903 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); | 833 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); |
| 904 | 834 |
| 905 Run(2); // SpdySession consumes the next two reads and sends then to | 835 Run(2); // SpdySession consumes the next two reads and sends then to |
| 906 // sock_ to be buffered. | 836 // sock_ to be buffered. |
| 907 AssertSyncReadEquals(kMsg1, kLen1); | 837 AssertSyncReadEquals(kMsg1, kLen1); |
| 908 AssertSyncReadEquals(kMsg2, kLen2); | 838 AssertSyncReadEquals(kMsg2, kLen2); |
| 909 } | 839 } |
| 910 | 840 |
| 911 TEST_F(SpdyProxyClientSocketTest, ReadErrorResponseBody) { | 841 TEST_F(SpdyProxyClientSocketTest, ReadErrorResponseBody) { |
| 912 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 842 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 913 MockWrite writes[] = { | 843 MockWrite writes[] = { |
| (...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1354 write_callback_.callback())); | 1284 write_callback_.callback())); |
| 1355 | 1285 |
| 1356 Run(2); | 1286 Run(2); |
| 1357 | 1287 |
| 1358 EXPECT_FALSE(sock_.get()); | 1288 EXPECT_FALSE(sock_.get()); |
| 1359 EXPECT_TRUE(read_callback.have_result()); | 1289 EXPECT_TRUE(read_callback.have_result()); |
| 1360 EXPECT_FALSE(write_callback_.have_result()); | 1290 EXPECT_FALSE(write_callback_.have_result()); |
| 1361 } | 1291 } |
| 1362 | 1292 |
| 1363 } // namespace net | 1293 } // namespace net |
| OLD | NEW |