OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/socket/ssl_client_socket.h" | 5 #include "net/socket/ssl_client_socket.h" |
6 | 6 |
7 #include "net/base/address_list.h" | 7 #include "net/base/address_list.h" |
8 #include "net/base/cert_test_util.h" | 8 #include "net/base/cert_test_util.h" |
9 #include "net/base/host_resolver.h" | 9 #include "net/base/host_resolver.h" |
10 #include "net/base/io_buffer.h" | 10 #include "net/base/io_buffer.h" |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 if (rv == net::ERR_IO_PENDING) | 354 if (rv == net::ERR_IO_PENDING) |
355 rv = callback.WaitForResult(); | 355 rv = callback.WaitForResult(); |
356 EXPECT_EQ(net::OK, rv); | 356 EXPECT_EQ(net::OK, rv); |
357 EXPECT_TRUE(sock->IsConnected()); | 357 EXPECT_TRUE(sock->IsConnected()); |
358 | 358 |
359 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; | 359 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; |
360 scoped_refptr<net::IOBuffer> request_buffer( | 360 scoped_refptr<net::IOBuffer> request_buffer( |
361 new net::IOBuffer(arraysize(request_text) - 1)); | 361 new net::IOBuffer(arraysize(request_text) - 1)); |
362 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); | 362 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); |
363 | 363 |
364 rv = sock->Write(request_buffer, arraysize(request_text) - 1, | 364 rv = sock->Write(request_buffer.get(), arraysize(request_text) - 1, |
365 callback.callback()); | 365 callback.callback()); |
366 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 366 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
367 | 367 |
368 if (rv == net::ERR_IO_PENDING) | 368 if (rv == net::ERR_IO_PENDING) |
369 rv = callback.WaitForResult(); | 369 rv = callback.WaitForResult(); |
370 EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv); | 370 EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv); |
371 | 371 |
372 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(4096)); | 372 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(4096)); |
373 for (;;) { | 373 for (;;) { |
374 rv = sock->Read(buf, 4096, callback.callback()); | 374 rv = sock->Read(buf.get(), 4096, callback.callback()); |
375 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 375 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
376 | 376 |
377 if (rv == net::ERR_IO_PENDING) | 377 if (rv == net::ERR_IO_PENDING) |
378 rv = callback.WaitForResult(); | 378 rv = callback.WaitForResult(); |
379 | 379 |
380 EXPECT_GE(rv, 0); | 380 EXPECT_GE(rv, 0); |
381 if (rv <= 0) | 381 if (rv <= 0) |
382 break; | 382 break; |
383 } | 383 } |
384 } | 384 } |
(...skipping 23 matching lines...) Expand all Loading... |
408 kDefaultSSLConfig)); | 408 kDefaultSSLConfig)); |
409 | 409 |
410 rv = sock->Connect(callback.callback()); | 410 rv = sock->Connect(callback.callback()); |
411 if (rv == net::ERR_IO_PENDING) | 411 if (rv == net::ERR_IO_PENDING) |
412 rv = callback.WaitForResult(); | 412 rv = callback.WaitForResult(); |
413 EXPECT_EQ(net::OK, rv); | 413 EXPECT_EQ(net::OK, rv); |
414 EXPECT_TRUE(sock->IsConnected()); | 414 EXPECT_TRUE(sock->IsConnected()); |
415 | 415 |
416 // Issue a "hanging" Read first. | 416 // Issue a "hanging" Read first. |
417 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(4096)); | 417 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(4096)); |
418 rv = sock->Read(buf, 4096, callback.callback()); | 418 rv = sock->Read(buf.get(), 4096, callback.callback()); |
419 // We haven't written the request, so there should be no response yet. | 419 // We haven't written the request, so there should be no response yet. |
420 ASSERT_EQ(net::ERR_IO_PENDING, rv); | 420 ASSERT_EQ(net::ERR_IO_PENDING, rv); |
421 | 421 |
422 // Write the request. | 422 // Write the request. |
423 // The request is padded with a User-Agent header to a size that causes the | 423 // The request is padded with a User-Agent header to a size that causes the |
424 // memio circular buffer (4k bytes) in SSLClientSocketNSS to wrap around. | 424 // memio circular buffer (4k bytes) in SSLClientSocketNSS to wrap around. |
425 // This tests the fix for http://crbug.com/29815. | 425 // This tests the fix for http://crbug.com/29815. |
426 std::string request_text = "GET / HTTP/1.1\r\nUser-Agent: long browser name "; | 426 std::string request_text = "GET / HTTP/1.1\r\nUser-Agent: long browser name "; |
427 for (int i = 0; i < 3770; ++i) | 427 for (int i = 0; i < 3770; ++i) |
428 request_text.push_back('*'); | 428 request_text.push_back('*'); |
429 request_text.append("\r\n\r\n"); | 429 request_text.append("\r\n\r\n"); |
430 scoped_refptr<net::IOBuffer> request_buffer( | 430 scoped_refptr<net::IOBuffer> request_buffer( |
431 new net::StringIOBuffer(request_text)); | 431 new net::StringIOBuffer(request_text)); |
432 | 432 |
433 net::TestCompletionCallback callback2; // Used for Write only. | 433 net::TestCompletionCallback callback2; // Used for Write only. |
434 rv = sock->Write(request_buffer, request_text.size(), callback2.callback()); | 434 rv = sock-> |
| 435 Write(request_buffer.get(), request_text.size(), callback2.callback()); |
435 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 436 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
436 | 437 |
437 if (rv == net::ERR_IO_PENDING) | 438 if (rv == net::ERR_IO_PENDING) |
438 rv = callback2.WaitForResult(); | 439 rv = callback2.WaitForResult(); |
439 EXPECT_EQ(static_cast<int>(request_text.size()), rv); | 440 EXPECT_EQ(static_cast<int>(request_text.size()), rv); |
440 | 441 |
441 // Now get the Read result. | 442 // Now get the Read result. |
442 rv = callback.WaitForResult(); | 443 rv = callback.WaitForResult(); |
443 EXPECT_GT(rv, 0); | 444 EXPECT_GT(rv, 0); |
444 } | 445 } |
(...skipping 22 matching lines...) Expand all Loading... |
467 rv = sock->Connect(callback.callback()); | 468 rv = sock->Connect(callback.callback()); |
468 if (rv == net::ERR_IO_PENDING) | 469 if (rv == net::ERR_IO_PENDING) |
469 rv = callback.WaitForResult(); | 470 rv = callback.WaitForResult(); |
470 EXPECT_EQ(net::OK, rv); | 471 EXPECT_EQ(net::OK, rv); |
471 | 472 |
472 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; | 473 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; |
473 scoped_refptr<net::IOBuffer> request_buffer( | 474 scoped_refptr<net::IOBuffer> request_buffer( |
474 new net::IOBuffer(arraysize(request_text) - 1)); | 475 new net::IOBuffer(arraysize(request_text) - 1)); |
475 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); | 476 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); |
476 | 477 |
477 rv = sock->Write(request_buffer, arraysize(request_text) - 1, | 478 rv = sock->Write(request_buffer.get(), arraysize(request_text) - 1, |
478 callback.callback()); | 479 callback.callback()); |
479 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 480 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
480 | 481 |
481 if (rv == net::ERR_IO_PENDING) | 482 if (rv == net::ERR_IO_PENDING) |
482 rv = callback.WaitForResult(); | 483 rv = callback.WaitForResult(); |
483 EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv); | 484 EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv); |
484 | 485 |
485 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(1)); | 486 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(1)); |
486 for (;;) { | 487 for (;;) { |
487 rv = sock->Read(buf, 1, callback.callback()); | 488 rv = sock->Read(buf.get(), 1, callback.callback()); |
488 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 489 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
489 | 490 |
490 if (rv == net::ERR_IO_PENDING) | 491 if (rv == net::ERR_IO_PENDING) |
491 rv = callback.WaitForResult(); | 492 rv = callback.WaitForResult(); |
492 | 493 |
493 EXPECT_GE(rv, 0); | 494 EXPECT_GE(rv, 0); |
494 if (rv <= 0) | 495 if (rv <= 0) |
495 break; | 496 break; |
496 } | 497 } |
497 } | 498 } |
(...skipping 22 matching lines...) Expand all Loading... |
520 rv = sock->Connect(callback.callback()); | 521 rv = sock->Connect(callback.callback()); |
521 if (rv == net::ERR_IO_PENDING) | 522 if (rv == net::ERR_IO_PENDING) |
522 rv = callback.WaitForResult(); | 523 rv = callback.WaitForResult(); |
523 EXPECT_EQ(net::OK, rv); | 524 EXPECT_EQ(net::OK, rv); |
524 | 525 |
525 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; | 526 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; |
526 scoped_refptr<net::IOBuffer> request_buffer( | 527 scoped_refptr<net::IOBuffer> request_buffer( |
527 new net::IOBuffer(arraysize(request_text) - 1)); | 528 new net::IOBuffer(arraysize(request_text) - 1)); |
528 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); | 529 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); |
529 | 530 |
530 rv = sock->Write(request_buffer, arraysize(request_text) - 1, | 531 rv = sock->Write(request_buffer.get(), arraysize(request_text) - 1, |
531 callback.callback()); | 532 callback.callback()); |
532 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 533 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
533 | 534 |
534 if (rv == net::ERR_IO_PENDING) | 535 if (rv == net::ERR_IO_PENDING) |
535 rv = callback.WaitForResult(); | 536 rv = callback.WaitForResult(); |
536 EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv); | 537 EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv); |
537 | 538 |
538 // Do a partial read and then exit. This test should not crash! | 539 // Do a partial read and then exit. This test should not crash! |
539 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(512)); | 540 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(512)); |
540 rv = sock->Read(buf, 512, callback.callback()); | 541 rv = sock->Read(buf.get(), 512, callback.callback()); |
541 EXPECT_TRUE(rv > 0 || rv == net::ERR_IO_PENDING); | 542 EXPECT_TRUE(rv > 0 || rv == net::ERR_IO_PENDING); |
542 | 543 |
543 if (rv == net::ERR_IO_PENDING) | 544 if (rv == net::ERR_IO_PENDING) |
544 rv = callback.WaitForResult(); | 545 rv = callback.WaitForResult(); |
545 | 546 |
546 EXPECT_GT(rv, 0); | 547 EXPECT_GT(rv, 0); |
547 } | 548 } |
548 | 549 |
549 TEST_F(SSLClientSocketTest, Read_FullLogging) { | 550 TEST_F(SSLClientSocketTest, Read_FullLogging) { |
550 net::TestServer test_server(net::TestServer::TYPE_HTTPS, | 551 net::TestServer test_server(net::TestServer::TYPE_HTTPS, |
(...skipping 22 matching lines...) Expand all Loading... |
573 if (rv == net::ERR_IO_PENDING) | 574 if (rv == net::ERR_IO_PENDING) |
574 rv = callback.WaitForResult(); | 575 rv = callback.WaitForResult(); |
575 EXPECT_EQ(net::OK, rv); | 576 EXPECT_EQ(net::OK, rv); |
576 EXPECT_TRUE(sock->IsConnected()); | 577 EXPECT_TRUE(sock->IsConnected()); |
577 | 578 |
578 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; | 579 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; |
579 scoped_refptr<net::IOBuffer> request_buffer( | 580 scoped_refptr<net::IOBuffer> request_buffer( |
580 new net::IOBuffer(arraysize(request_text) - 1)); | 581 new net::IOBuffer(arraysize(request_text) - 1)); |
581 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); | 582 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); |
582 | 583 |
583 rv = sock->Write(request_buffer, arraysize(request_text) - 1, | 584 rv = sock->Write(request_buffer.get(), arraysize(request_text) - 1, |
584 callback.callback()); | 585 callback.callback()); |
585 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 586 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
586 | 587 |
587 if (rv == net::ERR_IO_PENDING) | 588 if (rv == net::ERR_IO_PENDING) |
588 rv = callback.WaitForResult(); | 589 rv = callback.WaitForResult(); |
589 EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv); | 590 EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv); |
590 | 591 |
591 net::CapturingNetLog::CapturedEntryList entries; | 592 net::CapturingNetLog::CapturedEntryList entries; |
592 log.GetEntries(&entries); | 593 log.GetEntries(&entries); |
593 size_t last_index = net::ExpectLogContainsSomewhereAfter( | 594 size_t last_index = net::ExpectLogContainsSomewhereAfter( |
594 entries, 5, net::NetLog::TYPE_SSL_SOCKET_BYTES_SENT, | 595 entries, 5, net::NetLog::TYPE_SSL_SOCKET_BYTES_SENT, |
595 net::NetLog::PHASE_NONE); | 596 net::NetLog::PHASE_NONE); |
596 | 597 |
597 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(4096)); | 598 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(4096)); |
598 for (;;) { | 599 for (;;) { |
599 rv = sock->Read(buf, 4096, callback.callback()); | 600 rv = sock->Read(buf.get(), 4096, callback.callback()); |
600 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 601 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
601 | 602 |
602 if (rv == net::ERR_IO_PENDING) | 603 if (rv == net::ERR_IO_PENDING) |
603 rv = callback.WaitForResult(); | 604 rv = callback.WaitForResult(); |
604 | 605 |
605 EXPECT_GE(rv, 0); | 606 EXPECT_GE(rv, 0); |
606 if (rv <= 0) | 607 if (rv <= 0) |
607 break; | 608 break; |
608 | 609 |
609 log.GetEntries(&entries); | 610 log.GetEntries(&entries); |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
862 temp_intermediates.push_back(certs[1]->os_cert_handle()); | 863 temp_intermediates.push_back(certs[1]->os_cert_handle()); |
863 temp_intermediates.push_back(certs[2]->os_cert_handle()); | 864 temp_intermediates.push_back(certs[2]->os_cert_handle()); |
864 | 865 |
865 net::CertVerifyResult verify_result; | 866 net::CertVerifyResult verify_result; |
866 verify_result.verified_cert = | 867 verify_result.verified_cert = |
867 net::X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(), | 868 net::X509Certificate::CreateFromHandle(certs[0]->os_cert_handle(), |
868 temp_intermediates); | 869 temp_intermediates); |
869 | 870 |
870 // Add a rule that maps the server cert (A) to the chain of A->B->C2 | 871 // Add a rule that maps the server cert (A) to the chain of A->B->C2 |
871 // rather than A->B->C. | 872 // rather than A->B->C. |
872 cert_verifier_->AddResultForCert(certs[0], verify_result, net::OK); | 873 cert_verifier_->AddResultForCert(certs[0].get(), verify_result, net::OK); |
873 | 874 |
874 // Load and install the root for the validated chain. | 875 // Load and install the root for the validated chain. |
875 scoped_refptr<net::X509Certificate> root_cert = | 876 scoped_refptr<net::X509Certificate> root_cert = |
876 net::ImportCertFromFile(net::GetTestCertsDirectory(), | 877 net::ImportCertFromFile(net::GetTestCertsDirectory(), |
877 "redundant-validated-chain-root.pem"); | 878 "redundant-validated-chain-root.pem"); |
878 ASSERT_NE(static_cast<net::X509Certificate*>(NULL), root_cert); | 879 ASSERT_NE(static_cast<net::X509Certificate*>(NULL), root_cert); |
879 net::ScopedTestRoot scoped_root(root_cert); | 880 net::ScopedTestRoot scoped_root(root_cert.get()); |
880 | 881 |
881 // Set up a test server with CERT_CHAIN_WRONG_ROOT. | 882 // Set up a test server with CERT_CHAIN_WRONG_ROOT. |
882 net::TestServer::SSLOptions ssl_options( | 883 net::TestServer::SSLOptions ssl_options( |
883 net::TestServer::SSLOptions::CERT_CHAIN_WRONG_ROOT); | 884 net::TestServer::SSLOptions::CERT_CHAIN_WRONG_ROOT); |
884 net::TestServer test_server(net::TestServer::TYPE_HTTPS, | 885 net::TestServer test_server(net::TestServer::TYPE_HTTPS, |
885 ssl_options, | 886 ssl_options, |
886 FilePath(FILE_PATH_LITERAL("net/data/ssl"))); | 887 FilePath(FILE_PATH_LITERAL("net/data/ssl"))); |
887 ASSERT_TRUE(test_server.Start()); | 888 ASSERT_TRUE(test_server.Start()); |
888 | 889 |
889 net::AddressList addr; | 890 net::AddressList addr; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
928 ssl_info.cert->os_cert_handle(), certs[0]->os_cert_handle())); | 929 ssl_info.cert->os_cert_handle(), certs[0]->os_cert_handle())); |
929 EXPECT_TRUE(net::X509Certificate::IsSameOSCert( | 930 EXPECT_TRUE(net::X509Certificate::IsSameOSCert( |
930 intermediates[0], certs[1]->os_cert_handle())); | 931 intermediates[0], certs[1]->os_cert_handle())); |
931 EXPECT_TRUE(net::X509Certificate::IsSameOSCert( | 932 EXPECT_TRUE(net::X509Certificate::IsSameOSCert( |
932 intermediates[1], certs[2]->os_cert_handle())); | 933 intermediates[1], certs[2]->os_cert_handle())); |
933 | 934 |
934 sock->Disconnect(); | 935 sock->Disconnect(); |
935 EXPECT_FALSE(sock->IsConnected()); | 936 EXPECT_FALSE(sock->IsConnected()); |
936 } | 937 } |
937 | 938 |
OLD | NEW |