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 |