| 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/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "net/base/address_list.h" | 10 #include "net/base/address_list.h" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 | 61 |
| 62 virtual void TearDown(); | 62 virtual void TearDown(); |
| 63 | 63 |
| 64 protected: | 64 protected: |
| 65 void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes, | 65 void Initialize(MockRead* reads, size_t reads_count, MockWrite* writes, |
| 66 size_t writes_count); | 66 size_t writes_count); |
| 67 spdy::SpdyFrame* ConstructConnectRequestFrame(); | 67 spdy::SpdyFrame* ConstructConnectRequestFrame(); |
| 68 spdy::SpdyFrame* ConstructConnectAuthRequestFrame(); | 68 spdy::SpdyFrame* ConstructConnectAuthRequestFrame(); |
| 69 spdy::SpdyFrame* ConstructConnectReplyFrame(); | 69 spdy::SpdyFrame* ConstructConnectReplyFrame(); |
| 70 spdy::SpdyFrame* ConstructConnectAuthReplyFrame(); | 70 spdy::SpdyFrame* ConstructConnectAuthReplyFrame(); |
| 71 spdy::SpdyFrame* ConstructConnectNtlmAuthReplyFrame(); |
| 71 spdy::SpdyFrame* ConstructConnectErrorReplyFrame(); | 72 spdy::SpdyFrame* ConstructConnectErrorReplyFrame(); |
| 72 spdy::SpdyFrame* ConstructBodyFrame(const char* data, int length); | 73 spdy::SpdyFrame* ConstructBodyFrame(const char* data, int length); |
| 73 scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size); | 74 scoped_refptr<IOBufferWithSize> CreateBuffer(const char* data, int size); |
| 74 void AssertConnectSucceeds(); | 75 void AssertConnectSucceeds(); |
| 75 void AssertConnectFails(int result); | 76 void AssertConnectFails(int result); |
| 76 void AssertConnectionEstablished(); | 77 void AssertConnectionEstablished(); |
| 77 void AssertSyncReadEquals(const char* data, int len); | 78 void AssertSyncReadEquals(const char* data, int len); |
| 78 void AssertAsyncReadEquals(const char* data, int len); | 79 void AssertAsyncReadEquals(const char* data, int len); |
| 79 void AssertReadStarts(const char* data, int len); | 80 void AssertReadStarts(const char* data, int len); |
| 80 void AssertReadReturns(const char* data, int len); | 81 void AssertReadReturns(const char* data, int len); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 // Create the SPDY Stream | 193 // Create the SPDY Stream |
| 193 ASSERT_EQ( | 194 ASSERT_EQ( |
| 194 OK, | 195 OK, |
| 195 spdy_session_->CreateStream(url_, LOWEST, &spdy_stream_, BoundNetLog(), | 196 spdy_session_->CreateStream(url_, LOWEST, &spdy_stream_, BoundNetLog(), |
| 196 CompletionCallback())); | 197 CompletionCallback())); |
| 197 | 198 |
| 198 // Create the SpdyProxyClientSocket | 199 // Create the SpdyProxyClientSocket |
| 199 sock_.reset( | 200 sock_.reset( |
| 200 new SpdyProxyClientSocket(spdy_stream_, user_agent_, | 201 new SpdyProxyClientSocket(spdy_stream_, user_agent_, |
| 201 endpoint_host_port_pair_, url_, | 202 endpoint_host_port_pair_, url_, |
| 202 proxy_host_port_, session_->http_auth_cache(), | 203 proxy_host_port_, |
| 203 session_->http_auth_handler_factory())); | 204 new HttpAuthController( |
| 205 HttpAuth::AUTH_PROXY, |
| 206 GURL(kProxyUrl), |
| 207 session_->http_auth_cache(), |
| 208 session_->http_auth_handler_factory()))); |
| 204 } | 209 } |
| 205 | 210 |
| 206 scoped_refptr<IOBufferWithSize> SpdyProxyClientSocketTest::CreateBuffer( | 211 scoped_refptr<IOBufferWithSize> SpdyProxyClientSocketTest::CreateBuffer( |
| 207 const char* data, int size) { | 212 const char* data, int size) { |
| 208 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(size)); | 213 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(size)); |
| 209 memcpy(buf->data(), data, size); | 214 memcpy(buf->data(), data, size); |
| 210 return buf; | 215 return buf; |
| 211 } | 216 } |
| 212 | 217 |
| 213 void SpdyProxyClientSocketTest::AssertConnectSucceeds() { | 218 void SpdyProxyClientSocketTest::AssertConnectSucceeds() { |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 0, | 388 0, |
| 384 false, | 389 false, |
| 385 kStreamId, | 390 kStreamId, |
| 386 LOWEST, | 391 LOWEST, |
| 387 spdy::SYN_REPLY, | 392 spdy::SYN_REPLY, |
| 388 spdy::CONTROL_FLAG_NONE, | 393 spdy::CONTROL_FLAG_NONE, |
| 389 kStandardReplyHeaders, | 394 kStandardReplyHeaders, |
| 390 arraysize(kStandardReplyHeaders)); | 395 arraysize(kStandardReplyHeaders)); |
| 391 } | 396 } |
| 392 | 397 |
| 398 // Constructs a standard SPDY SYN_REPLY frame to match the SPDY CONNECT. |
| 399 spdy::SpdyFrame* |
| 400 SpdyProxyClientSocketTest::ConstructConnectNtlmAuthReplyFrame() { |
| 401 const char* const kStandardReplyHeaders[] = { |
| 402 "status", "407 Proxy Authentication Required", |
| 403 "version", "HTTP/1.1", |
| 404 "proxy-authenticate", "NTLM" |
| 405 }; |
| 406 |
| 407 return ConstructSpdyControlFrame(NULL, |
| 408 0, |
| 409 false, |
| 410 kStreamId, |
| 411 LOWEST, |
| 412 spdy::SYN_REPLY, |
| 413 spdy::CONTROL_FLAG_NONE, |
| 414 kStandardReplyHeaders, |
| 415 arraysize(kStandardReplyHeaders)); |
| 416 } |
| 417 |
| 393 // Constructs a SPDY SYN_REPLY frame with an HTTP 500 error. | 418 // Constructs a SPDY SYN_REPLY frame with an HTTP 500 error. |
| 394 spdy::SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() { | 419 spdy::SpdyFrame* SpdyProxyClientSocketTest::ConstructConnectErrorReplyFrame() { |
| 395 const char* const kStandardReplyHeaders[] = { | 420 const char* const kStandardReplyHeaders[] = { |
| 396 "status", "500 Internal Server Error", | 421 "status", "500 Internal Server Error", |
| 397 "version", "HTTP/1.1", | 422 "version", "HTTP/1.1", |
| 398 }; | 423 }; |
| 399 | 424 |
| 400 return ConstructSpdyControlFrame(NULL, | 425 return ConstructSpdyControlFrame(NULL, |
| 401 0, | 426 0, |
| 402 false, | 427 false, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 429 | 454 |
| 430 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 455 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 431 | 456 |
| 432 ASSERT_FALSE(sock_->IsConnected()); | 457 ASSERT_FALSE(sock_->IsConnected()); |
| 433 | 458 |
| 434 AssertConnectSucceeds(); | 459 AssertConnectSucceeds(); |
| 435 | 460 |
| 436 AssertConnectionEstablished(); | 461 AssertConnectionEstablished(); |
| 437 } | 462 } |
| 438 | 463 |
| 439 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthRequested) { | 464 TEST_F(SpdyProxyClientSocketTest, ConnectWithUnsupportedAuthScheme) { |
| 440 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 465 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 441 MockWrite writes[] = { | 466 MockWrite writes[] = { |
| 442 CreateMockWrite(*conn, 0, false), | 467 CreateMockWrite(*conn, 0, false), |
| 443 }; | 468 }; |
| 444 | 469 |
| 445 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame()); | 470 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectNtlmAuthReplyFrame()); |
| 446 MockRead reads[] = { | 471 MockRead reads[] = { |
| 447 CreateMockRead(*resp, 1, true), | 472 CreateMockRead(*resp, 1, true), |
| 448 MockRead(true, 0, 3), // EOF | 473 MockRead(true, 0, 3), // EOF |
| 449 }; | 474 }; |
| 450 | 475 |
| 451 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 476 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 452 | 477 |
| 453 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); | 478 AssertConnectFails(ERR_PROXY_AUTH_UNSUPPORTED); |
| 454 | |
| 455 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); | |
| 456 ASSERT_TRUE(response != NULL); | |
| 457 ASSERT_EQ(407, response->headers->response_code()); | |
| 458 ASSERT_EQ("Proxy Authentication Required", | |
| 459 response->headers->GetStatusText()); | |
| 460 } | 479 } |
| 461 | 480 |
| 462 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) { | 481 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthCredentials) { |
| 463 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectAuthRequestFrame()); | 482 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectAuthRequestFrame()); |
| 464 MockWrite writes[] = { | 483 MockWrite writes[] = { |
| 465 CreateMockWrite(*conn, 0, false), | 484 CreateMockWrite(*conn, 0, false), |
| 466 }; | 485 }; |
| 467 | 486 |
| 468 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 487 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 469 MockRead reads[] = { | 488 MockRead reads[] = { |
| 470 CreateMockRead(*resp, 1, true), | 489 CreateMockRead(*resp, 1, true), |
| 471 MockRead(true, 0, 3), // EOF | 490 MockRead(true, 0, 3), // EOF |
| 472 }; | 491 }; |
| 473 | 492 |
| 474 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 493 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 475 AddAuthToCache(); | 494 AddAuthToCache(); |
| 476 | 495 |
| 477 AssertConnectSucceeds(); | 496 AssertConnectSucceeds(); |
| 478 | 497 |
| 479 AssertConnectionEstablished(); | 498 AssertConnectionEstablished(); |
| 480 } | 499 } |
| 481 | 500 |
| 501 TEST_F(SpdyProxyClientSocketTest, ConnectWithAuthRestart) { |
| 502 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 503 scoped_ptr<spdy::SpdyFrame> auth(ConstructConnectAuthRequestFrame()); |
| 504 MockWrite writes[] = { |
| 505 CreateMockWrite(*conn, 0, false), |
| 506 }; |
| 507 |
| 508 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectAuthReplyFrame()); |
| 509 scoped_ptr<spdy::SpdyFrame> auth_resp(ConstructConnectReplyFrame()); |
| 510 MockRead reads[] = { |
| 511 CreateMockRead(*resp, 1, true), |
| 512 MockRead(true, 0, 3), // EOF |
| 513 }; |
| 514 |
| 515 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 516 |
| 517 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); |
| 518 |
| 519 const HttpResponseInfo* response = sock_->GetConnectResponseInfo(); |
| 520 ASSERT_TRUE(response != NULL); |
| 521 ASSERT_EQ(407, response->headers->response_code()); |
| 522 ASSERT_EQ("Proxy Authentication Required", |
| 523 response->headers->GetStatusText()); |
| 524 |
| 525 AddAuthToCache(); |
| 526 |
| 527 ASSERT_EQ(ERR_NO_KEEP_ALIVE_ON_AUTH_RESTART, |
| 528 sock_->RestartWithAuth(read_callback_.callback())); |
| 529 // A SpdyProxyClientSocket sits on a single SPDY stream which can |
| 530 // only be used for a single request/response. |
| 531 ASSERT_FALSE(sock_->IsConnectedAndIdle()); |
| 532 } |
| 533 |
| 482 TEST_F(SpdyProxyClientSocketTest, ConnectFails) { | 534 TEST_F(SpdyProxyClientSocketTest, ConnectFails) { |
| 483 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 535 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 484 MockWrite writes[] = { | 536 MockWrite writes[] = { |
| 485 CreateMockWrite(*conn, 0, false), | 537 CreateMockWrite(*conn, 0, false), |
| 486 }; | 538 }; |
| 487 | 539 |
| 488 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); | 540 scoped_ptr<spdy::SpdyFrame> resp(ConstructConnectReplyFrame()); |
| 489 MockRead reads[] = { | 541 MockRead reads[] = { |
| 490 MockRead(true, 0, 1), // EOF | 542 MockRead(true, 0, 1), // EOF |
| 491 }; | 543 }; |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 824 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); | 876 scoped_ptr<spdy::SpdyFrame> msg2(ConstructBodyFrame(kMsg2, kLen2)); |
| 825 MockRead reads[] = { | 877 MockRead reads[] = { |
| 826 CreateMockRead(*resp, 1, true), | 878 CreateMockRead(*resp, 1, true), |
| 827 CreateMockRead(*msg1, 2, true), | 879 CreateMockRead(*msg1, 2, true), |
| 828 CreateMockRead(*msg2, 3, true), | 880 CreateMockRead(*msg2, 3, true), |
| 829 MockRead(true, 0, 4), // EOF | 881 MockRead(true, 0, 4), // EOF |
| 830 }; | 882 }; |
| 831 | 883 |
| 832 Initialize(reads, arraysize(reads), writes, arraysize(writes)); | 884 Initialize(reads, arraysize(reads), writes, arraysize(writes)); |
| 833 | 885 |
| 834 AssertConnectFails(ERR_TUNNEL_CONNECTION_FAILED); | 886 AssertConnectFails(ERR_PROXY_AUTH_REQUESTED); |
| 835 | 887 |
| 836 Run(2); // SpdySession consumes the next two reads and sends then to | 888 Run(2); // SpdySession consumes the next two reads and sends then to |
| 837 // sock_ to be buffered. | 889 // sock_ to be buffered. |
| 838 AssertSyncReadEquals(kMsg1, kLen1); | 890 AssertSyncReadEquals(kMsg1, kLen1); |
| 839 AssertSyncReadEquals(kMsg2, kLen2); | 891 AssertSyncReadEquals(kMsg2, kLen2); |
| 840 } | 892 } |
| 841 | 893 |
| 842 TEST_F(SpdyProxyClientSocketTest, ReadErrorResponseBody) { | 894 TEST_F(SpdyProxyClientSocketTest, ReadErrorResponseBody) { |
| 843 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); | 895 scoped_ptr<spdy::SpdyFrame> conn(ConstructConnectRequestFrame()); |
| 844 MockWrite writes[] = { | 896 MockWrite writes[] = { |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1291 write_callback_.callback())); | 1343 write_callback_.callback())); |
| 1292 | 1344 |
| 1293 Run(2); | 1345 Run(2); |
| 1294 | 1346 |
| 1295 EXPECT_FALSE(sock_.get()); | 1347 EXPECT_FALSE(sock_.get()); |
| 1296 EXPECT_TRUE(read_callback.have_result()); | 1348 EXPECT_TRUE(read_callback.have_result()); |
| 1297 EXPECT_FALSE(write_callback_.have_result()); | 1349 EXPECT_FALSE(write_callback_.have_result()); |
| 1298 } | 1350 } |
| 1299 | 1351 |
| 1300 } // namespace net | 1352 } // namespace net |
| OLD | NEW |