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

Side by Side Diff: net/quic/quic_stream_factory.cc

Issue 1744693002: Implement QUIC-based net::BidirectionalStream (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@basecl
Patch Set: Created 4 years, 9 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
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 #include "net/quic/quic_stream_factory.h" 5 #include "net/quic/quic_stream_factory.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 #include "base/win/windows_version.h" 52 #include "base/win/windows_version.h"
53 #endif 53 #endif
54 54
55 #if defined(USE_OPENSSL) 55 #if defined(USE_OPENSSL)
56 #include <openssl/aead.h> 56 #include <openssl/aead.h>
57 #include "crypto/openssl_util.h" 57 #include "crypto/openssl_util.h"
58 #else 58 #else
59 #include "base/cpu.h" 59 #include "base/cpu.h"
60 #endif 60 #endif
61 61
62 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM)
63 #include "net/http/bidirectional_stream_job.h"
64 #include "net/quic/bidirectional_stream_quic_job.h"
65 #endif
66
62 using std::min; 67 using std::min;
63 using NetworkHandle = net::NetworkChangeNotifier::NetworkHandle; 68 using NetworkHandle = net::NetworkChangeNotifier::NetworkHandle;
64 69
65 namespace net { 70 namespace net {
66 71
67 namespace { 72 namespace {
68 73
69 enum CreateSessionFailure { 74 enum CreateSessionFailure {
70 CREATION_ERROR_CONNECTING_SOCKET, 75 CREATION_ERROR_CONNECTING_SOCKET,
71 CREATION_ERROR_SETTING_RECEIVE_BUFFER, 76 CREATION_ERROR_SETTING_RECEIVE_BUFFER,
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 session_ = nullptr; 494 session_ = nullptr;
490 return OK; 495 return OK;
491 } 496 }
492 497
493 factory_->ActivateSession(server_id_, session_); 498 factory_->ActivateSession(server_id_, session_);
494 499
495 return OK; 500 return OK;
496 } 501 }
497 502
498 QuicStreamRequest::QuicStreamRequest(QuicStreamFactory* factory) 503 QuicStreamRequest::QuicStreamRequest(QuicStreamFactory* factory)
499 : factory_(factory) {} 504 : factory_(factory), for_bidirectional_(false) {}
500 505
501 QuicStreamRequest::~QuicStreamRequest() { 506 QuicStreamRequest::~QuicStreamRequest() {
502 if (factory_ && !callback_.is_null()) 507 if (factory_ && !callback_.is_null())
503 factory_->CancelRequest(this); 508 factory_->CancelRequest(this);
504 } 509 }
505
506 int QuicStreamRequest::Request(const HostPortPair& host_port_pair, 510 int QuicStreamRequest::Request(const HostPortPair& host_port_pair,
507 PrivacyMode privacy_mode, 511 PrivacyMode privacy_mode,
508 int cert_verify_flags, 512 int cert_verify_flags,
509 base::StringPiece origin_host, 513 base::StringPiece origin_host,
510 base::StringPiece method, 514 base::StringPiece method,
511 const BoundNetLog& net_log, 515 const BoundNetLog& net_log,
512 const CompletionCallback& callback) { 516 const CompletionCallback& callback) {
517 return Request(host_port_pair, privacy_mode, cert_verify_flags, origin_host,
518 method, net_log, callback, false);
519 }
520
521 int QuicStreamRequest::Request(const HostPortPair& host_port_pair,
522 PrivacyMode privacy_mode,
523 int cert_verify_flags,
524 base::StringPiece origin_host,
525 base::StringPiece method,
526 const BoundNetLog& net_log,
527 const CompletionCallback& callback,
528 bool for_bidirectional) {
513 DCHECK(!stream_); 529 DCHECK(!stream_);
530 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM)
531 DCHECK(!bidirectional_stream_job_);
532 #endif
514 DCHECK(callback_.is_null()); 533 DCHECK(callback_.is_null());
515 DCHECK(factory_); 534 DCHECK(factory_);
516 origin_host_ = origin_host.as_string(); 535 origin_host_ = origin_host.as_string();
517 privacy_mode_ = privacy_mode; 536 privacy_mode_ = privacy_mode;
537 for_bidirectional_ = for_bidirectional;
538
518 int rv = factory_->Create(host_port_pair, privacy_mode, cert_verify_flags, 539 int rv = factory_->Create(host_port_pair, privacy_mode, cert_verify_flags,
519 origin_host, method, net_log, this); 540 origin_host, method, net_log, this);
520 if (rv == ERR_IO_PENDING) { 541 if (rv == ERR_IO_PENDING) {
521 host_port_pair_ = host_port_pair; 542 host_port_pair_ = host_port_pair;
522 net_log_ = net_log; 543 net_log_ = net_log;
523 callback_ = callback; 544 callback_ = callback;
524 } else { 545 } else {
525 factory_ = nullptr; 546 factory_ = nullptr;
526 } 547 }
527 if (rv == OK) 548 if (rv == OK) {
549 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM)
550 DCHECK(stream_ || (for_bidirectional_ && bidirectional_stream_job_));
551 #else
528 DCHECK(stream_); 552 DCHECK(stream_);
553 #endif
554 }
529 return rv; 555 return rv;
530 } 556 }
531 557
532 void QuicStreamRequest::set_stream(scoped_ptr<QuicHttpStream> stream) { 558 void QuicStreamRequest::InitializeStreamFromSession(
533 DCHECK(stream); 559 QuicChromiumClientSession* session) {
534 stream_ = std::move(stream); 560 DCHECK(session);
561 if (for_bidirectional_) {
562 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM)
563 bidirectional_stream_job_.reset(
564 new BidirectionalStreamQuicJob(session->GetWeakPtr()));
565 #else
566 DCHECK(false);
567 #endif
Ryan Hamilton 2016/02/27 00:21:14 I find this maze of ifdefs exceptionally hard to r
xunjieli 2016/02/29 15:21:37 Acknowledged.
568 } else {
569 stream_.reset(new QuicHttpStream(session->GetWeakPtr()));
570 }
535 } 571 }
536 572
537 void QuicStreamRequest::OnRequestComplete(int rv) { 573 void QuicStreamRequest::OnRequestComplete(int rv) {
538 factory_ = nullptr; 574 factory_ = nullptr;
539 callback_.Run(rv); 575 callback_.Run(rv);
540 } 576 }
541 577
542 base::TimeDelta QuicStreamRequest::GetTimeDelayForWaitingJob() const { 578 base::TimeDelta QuicStreamRequest::GetTimeDelayForWaitingJob() const {
543 if (!factory_) 579 if (!factory_)
544 return base::TimeDelta(); 580 return base::TimeDelta();
545 return factory_->GetTimeDelayForWaitingJob( 581 return factory_->GetTimeDelayForWaitingJob(
546 QuicServerId(host_port_pair_, privacy_mode_)); 582 QuicServerId(host_port_pair_, privacy_mode_));
547 } 583 }
548 584
549 scoped_ptr<QuicHttpStream> QuicStreamRequest::ReleaseStream() { 585 scoped_ptr<QuicHttpStream> QuicStreamRequest::ReleaseStream() {
550 DCHECK(stream_); 586 DCHECK(stream_);
587 DCHECK(!for_bidirectional_);
551 return std::move(stream_); 588 return std::move(stream_);
552 } 589 }
553 590
591 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM)
592 scoped_ptr<BidirectionalStreamJob>
593 QuicStreamRequest::ReleaseBidirectionalStreamJob() {
594 DCHECK(bidirectional_stream_job_);
595 DCHECK(for_bidirectional_);
596
597 return std::move(bidirectional_stream_job_);
598 }
599 #endif
600
554 QuicStreamFactory::QuicStreamFactory( 601 QuicStreamFactory::QuicStreamFactory(
555 HostResolver* host_resolver, 602 HostResolver* host_resolver,
556 ClientSocketFactory* client_socket_factory, 603 ClientSocketFactory* client_socket_factory,
557 base::WeakPtr<HttpServerProperties> http_server_properties, 604 base::WeakPtr<HttpServerProperties> http_server_properties,
558 CertVerifier* cert_verifier, 605 CertVerifier* cert_verifier,
559 CTPolicyEnforcer* ct_policy_enforcer, 606 CTPolicyEnforcer* ct_policy_enforcer,
560 ChannelIDService* channel_id_service, 607 ChannelIDService* channel_id_service,
561 TransportSecurityState* transport_security_state, 608 TransportSecurityState* transport_security_state,
562 CTVerifier* cert_transparency_verifier, 609 CTVerifier* cert_transparency_verifier,
563 SocketPerformanceWatcherFactory* socket_performance_watcher_factory, 610 SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 const BoundNetLog& net_log, 812 const BoundNetLog& net_log,
766 QuicStreamRequest* request) { 813 QuicStreamRequest* request) {
767 QuicServerId server_id(host_port_pair, privacy_mode); 814 QuicServerId server_id(host_port_pair, privacy_mode);
768 // TODO(rtenneti): crbug.com/498823 - delete active_sessions_.empty() checks. 815 // TODO(rtenneti): crbug.com/498823 - delete active_sessions_.empty() checks.
769 if (!active_sessions_.empty()) { 816 if (!active_sessions_.empty()) {
770 SessionMap::iterator it = active_sessions_.find(server_id); 817 SessionMap::iterator it = active_sessions_.find(server_id);
771 if (it != active_sessions_.end()) { 818 if (it != active_sessions_.end()) {
772 QuicChromiumClientSession* session = it->second; 819 QuicChromiumClientSession* session = it->second;
773 if (!session->CanPool(origin_host.as_string(), privacy_mode)) 820 if (!session->CanPool(origin_host.as_string(), privacy_mode))
774 return ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN; 821 return ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN;
775 request->set_stream(CreateFromSession(session)); 822 request->InitializeStreamFromSession(session);
776 return OK; 823 return OK;
777 } 824 }
778 } 825 }
779 826
780 if (HasActiveJob(server_id)) { 827 if (HasActiveJob(server_id)) {
781 active_requests_[request] = server_id; 828 active_requests_[request] = server_id;
782 job_requests_map_[server_id].insert(request); 829 job_requests_map_[server_id].insert(request);
783 return ERR_IO_PENDING; 830 return ERR_IO_PENDING;
784 } 831 }
785 832
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 // related changes. 868 // related changes.
822 if (active_sessions_.empty()) 869 if (active_sessions_.empty())
823 return ERR_QUIC_PROTOCOL_ERROR; 870 return ERR_QUIC_PROTOCOL_ERROR;
824 SessionMap::iterator it = active_sessions_.find(server_id); 871 SessionMap::iterator it = active_sessions_.find(server_id);
825 DCHECK(it != active_sessions_.end()); 872 DCHECK(it != active_sessions_.end());
826 if (it == active_sessions_.end()) 873 if (it == active_sessions_.end())
827 return ERR_QUIC_PROTOCOL_ERROR; 874 return ERR_QUIC_PROTOCOL_ERROR;
828 QuicChromiumClientSession* session = it->second; 875 QuicChromiumClientSession* session = it->second;
829 if (!session->CanPool(origin_host.as_string(), privacy_mode)) 876 if (!session->CanPool(origin_host.as_string(), privacy_mode))
830 return ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN; 877 return ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN;
831 request->set_stream(CreateFromSession(session)); 878 request->InitializeStreamFromSession(session);
832 } 879 }
833 return rv; 880 return rv;
834 } 881 }
835 882
836 void QuicStreamFactory::CreateAuxilaryJob(const QuicServerId server_id, 883 void QuicStreamFactory::CreateAuxilaryJob(const QuicServerId server_id,
837 int cert_verify_flags, 884 int cert_verify_flags,
838 bool server_and_origin_have_same_host, 885 bool server_and_origin_have_same_host,
839 bool is_post, 886 bool is_post,
840 const BoundNetLog& net_log) { 887 const BoundNetLog& net_log) {
841 Job* aux_job = new Job( 888 Job* aux_job = new Job(
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
899 RequestSet::iterator old_request_it = request_it; 946 RequestSet::iterator old_request_it = request_it;
900 ++request_it; 947 ++request_it;
901 // Remove request from containers so that OnRequestComplete() is not 948 // Remove request from containers so that OnRequestComplete() is not
902 // called later again on the same request. 949 // called later again on the same request.
903 job_requests_map_[server_id].erase(old_request_it); 950 job_requests_map_[server_id].erase(old_request_it);
904 active_requests_.erase(request); 951 active_requests_.erase(request);
905 // Notify request of certificate error. 952 // Notify request of certificate error.
906 request->OnRequestComplete(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN); 953 request->OnRequestComplete(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN);
907 continue; 954 continue;
908 } 955 }
909 request->set_stream(CreateFromSession(session)); 956 request->InitializeStreamFromSession(session);
910 ++request_it; 957 ++request_it;
911 } 958 }
912 } 959 }
913 960
914 while (!job_requests_map_[server_id].empty()) { 961 while (!job_requests_map_[server_id].empty()) {
915 RequestSet::iterator it = job_requests_map_[server_id].begin(); 962 RequestSet::iterator it = job_requests_map_[server_id].begin();
916 QuicStreamRequest* request = *it; 963 QuicStreamRequest* request = *it;
917 job_requests_map_[server_id].erase(it); 964 job_requests_map_[server_id].erase(it);
918 active_requests_.erase(request); 965 active_requests_.erase(request);
919 // Even though we're invoking callbacks here, we don't need to worry 966 // Even though we're invoking callbacks here, we don't need to worry
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after
1645 // Since the session was active, there's no longer an 1692 // Since the session was active, there's no longer an
1646 // HttpStreamFactoryImpl::Job running which can mark it broken, unless the TCP 1693 // HttpStreamFactoryImpl::Job running which can mark it broken, unless the TCP
1647 // job also fails. So to avoid not using QUIC when we otherwise could, we mark 1694 // job also fails. So to avoid not using QUIC when we otherwise could, we mark
1648 // it as recently broken, which means that 0-RTT will be disabled but we'll 1695 // it as recently broken, which means that 0-RTT will be disabled but we'll
1649 // still race. 1696 // still race.
1650 http_server_properties_->MarkAlternativeServiceRecentlyBroken( 1697 http_server_properties_->MarkAlternativeServiceRecentlyBroken(
1651 alternative_service); 1698 alternative_service);
1652 } 1699 }
1653 1700
1654 } // namespace net 1701 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698