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

Side by Side Diff: net/socket/ssl_client_socket_openssl.cc

Issue 169643006: Use sockets with unread data if they've never been used before. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rietveld, please behave. Created 6 years, 10 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
OLDNEW
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 // OpenSSL binding for SSLClientSocket. The class layout and general principle 5 // OpenSSL binding for SSLClientSocket. The class layout and general principle
6 // of operation is derived from SSLClientSocketNSS. 6 // of operation is derived from SSLClientSocketNSS.
7 7
8 #include "net/socket/ssl_client_socket_openssl.h" 8 #include "net/socket/ssl_client_socket_openssl.h"
9 9
10 #include <openssl/err.h> 10 #include <openssl/err.h>
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 const HostPortPair& host_and_port, 341 const HostPortPair& host_and_port,
342 const SSLConfig& ssl_config, 342 const SSLConfig& ssl_config,
343 const SSLClientSocketContext& context) 343 const SSLClientSocketContext& context)
344 : transport_send_busy_(false), 344 : transport_send_busy_(false),
345 transport_recv_busy_(false), 345 transport_recv_busy_(false),
346 transport_recv_eof_(false), 346 transport_recv_eof_(false),
347 weak_factory_(this), 347 weak_factory_(this),
348 pending_read_error_(kNoPendingReadResult), 348 pending_read_error_(kNoPendingReadResult),
349 transport_write_error_(OK), 349 transport_write_error_(OK),
350 completed_handshake_(false), 350 completed_handshake_(false),
351 was_used_to_convey_data_(false),
351 client_auth_cert_needed_(false), 352 client_auth_cert_needed_(false),
352 cert_verifier_(context.cert_verifier), 353 cert_verifier_(context.cert_verifier),
353 server_bound_cert_service_(context.server_bound_cert_service), 354 server_bound_cert_service_(context.server_bound_cert_service),
354 ssl_(NULL), 355 ssl_(NULL),
355 transport_bio_(NULL), 356 transport_bio_(NULL),
356 transport_(transport_socket.Pass()), 357 transport_(transport_socket.Pass()),
357 host_and_port_(host_and_port), 358 host_and_port_(host_and_port),
358 ssl_config_(ssl_config), 359 ssl_config_(ssl_config),
359 ssl_session_cache_shard_(context.ssl_session_cache_shard), 360 ssl_session_cache_shard_(context.ssl_session_cache_shard),
360 trying_cached_session_(false), 361 trying_cached_session_(false),
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 531
531 void SSLClientSocketOpenSSL::SetOmniboxSpeculation() { 532 void SSLClientSocketOpenSSL::SetOmniboxSpeculation() {
532 if (transport_.get() && transport_->socket()) { 533 if (transport_.get() && transport_->socket()) {
533 transport_->socket()->SetOmniboxSpeculation(); 534 transport_->socket()->SetOmniboxSpeculation();
534 } else { 535 } else {
535 NOTREACHED(); 536 NOTREACHED();
536 } 537 }
537 } 538 }
538 539
539 bool SSLClientSocketOpenSSL::WasEverUsed() const { 540 bool SSLClientSocketOpenSSL::WasEverUsed() const {
540 if (transport_.get() && transport_->socket()) 541 return was_used_to_convey_data_;
541 return transport_->socket()->WasEverUsed();
542
543 NOTREACHED();
544 return false;
545 } 542 }
546 543
547 bool SSLClientSocketOpenSSL::UsingTCPFastOpen() const { 544 bool SSLClientSocketOpenSSL::UsingTCPFastOpen() const {
548 if (transport_.get() && transport_->socket()) 545 if (transport_.get() && transport_->socket())
549 return transport_->socket()->UsingTCPFastOpen(); 546 return transport_->socket()->UsingTCPFastOpen();
550 547
551 NOTREACHED(); 548 NOTREACHED();
552 return false; 549 return false;
553 } 550 }
554 551
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 int buf_len, 602 int buf_len,
606 const CompletionCallback& callback) { 603 const CompletionCallback& callback) {
607 user_read_buf_ = buf; 604 user_read_buf_ = buf;
608 user_read_buf_len_ = buf_len; 605 user_read_buf_len_ = buf_len;
609 606
610 int rv = DoReadLoop(OK); 607 int rv = DoReadLoop(OK);
611 608
612 if (rv == ERR_IO_PENDING) { 609 if (rv == ERR_IO_PENDING) {
613 user_read_callback_ = callback; 610 user_read_callback_ = callback;
614 } else { 611 } else {
612 if (rv > 0)
613 was_used_to_convey_data_ = true;
615 user_read_buf_ = NULL; 614 user_read_buf_ = NULL;
616 user_read_buf_len_ = 0; 615 user_read_buf_len_ = 0;
617 } 616 }
618 617
619 return rv; 618 return rv;
620 } 619 }
621 620
622 int SSLClientSocketOpenSSL::Write(IOBuffer* buf, 621 int SSLClientSocketOpenSSL::Write(IOBuffer* buf,
623 int buf_len, 622 int buf_len,
624 const CompletionCallback& callback) { 623 const CompletionCallback& callback) {
625 user_write_buf_ = buf; 624 user_write_buf_ = buf;
626 user_write_buf_len_ = buf_len; 625 user_write_buf_len_ = buf_len;
627 626
628 int rv = DoWriteLoop(OK); 627 int rv = DoWriteLoop(OK);
629 628
630 if (rv == ERR_IO_PENDING) { 629 if (rv == ERR_IO_PENDING) {
631 user_write_callback_ = callback; 630 user_write_callback_ = callback;
632 } else { 631 } else {
632 if (rv > 0)
633 was_used_to_convey_data_ = true;
633 user_write_buf_ = NULL; 634 user_write_buf_ = NULL;
634 user_write_buf_len_ = 0; 635 user_write_buf_len_ = 0;
635 } 636 }
636 637
637 return rv; 638 return rv;
638 } 639 }
639 640
640 bool SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) { 641 bool SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) {
641 return transport_->socket()->SetReceiveBufferSize(size); 642 return transport_->socket()->SetReceiveBufferSize(size);
642 } 643 }
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 if (IsChannelIDEnabled(ssl_config_, server_bound_cert_service_)) { 763 if (IsChannelIDEnabled(ssl_config_, server_bound_cert_service_)) {
763 SSL_enable_tls_channel_id(ssl_); 764 SSL_enable_tls_channel_id(ssl_);
764 } 765 }
765 766
766 return true; 767 return true;
767 } 768 }
768 769
769 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { 770 void SSLClientSocketOpenSSL::DoReadCallback(int rv) {
770 // Since Run may result in Read being called, clear |user_read_callback_| 771 // Since Run may result in Read being called, clear |user_read_callback_|
771 // up front. 772 // up front.
773 if (rv > 0)
774 was_used_to_convey_data_ = true;
772 user_read_buf_ = NULL; 775 user_read_buf_ = NULL;
773 user_read_buf_len_ = 0; 776 user_read_buf_len_ = 0;
774 base::ResetAndReturn(&user_read_callback_).Run(rv); 777 base::ResetAndReturn(&user_read_callback_).Run(rv);
775 } 778 }
776 779
777 void SSLClientSocketOpenSSL::DoWriteCallback(int rv) { 780 void SSLClientSocketOpenSSL::DoWriteCallback(int rv) {
778 // Since Run may result in Write being called, clear |user_write_callback_| 781 // Since Run may result in Write being called, clear |user_write_callback_|
779 // up front. 782 // up front.
783 if (rv > 0)
784 was_used_to_convey_data_ = true;
780 user_write_buf_ = NULL; 785 user_write_buf_ = NULL;
781 user_write_buf_len_ = 0; 786 user_write_buf_len_ = 0;
782 base::ResetAndReturn(&user_write_callback_).Run(rv); 787 base::ResetAndReturn(&user_write_callback_).Run(rv);
783 } 788 }
784 789
785 bool SSLClientSocketOpenSSL::DoTransportIO() { 790 bool SSLClientSocketOpenSSL::DoTransportIO() {
786 bool network_moved = false; 791 bool network_moved = false;
787 int rv; 792 int rv;
788 // Read and write as much data as possible. The loop is necessary because 793 // Read and write as much data as possible. The loop is necessary because
789 // Write() may return synchronously. 794 // Write() may return synchronously.
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after
1418 } 1423 }
1419 1424
1420 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen); 1425 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen);
1421 server_protos_.assign(reinterpret_cast<const char*>(in), inlen); 1426 server_protos_.assign(reinterpret_cast<const char*>(in), inlen);
1422 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_; 1427 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_;
1423 #endif 1428 #endif
1424 return SSL_TLSEXT_ERR_OK; 1429 return SSL_TLSEXT_ERR_OK;
1425 } 1430 }
1426 1431
1427 } // namespace net 1432 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698