Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(624)

Side by Side Diff: net/spdy/spdy_proxy_client_socket_unittest.cc

Issue 9148011: Allow chrome to handle 407 auth challenges to CONNECT requests (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_proxy_client_socket.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/spdy/spdy_proxy_client_socket.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698