| 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/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 Loading... |
| 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_impl.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 Loading... |
| 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 | 510 |
| 506 int QuicStreamRequest::Request(const HostPortPair& host_port_pair, | 511 int QuicStreamRequest::Request(const HostPortPair& host_port_pair, |
| 507 PrivacyMode privacy_mode, | 512 PrivacyMode privacy_mode, |
| 508 int cert_verify_flags, | 513 int cert_verify_flags, |
| 509 base::StringPiece origin_host, | 514 base::StringPiece origin_host, |
| 510 base::StringPiece method, | 515 base::StringPiece method, |
| 511 const BoundNetLog& net_log, | 516 const BoundNetLog& net_log, |
| 512 const CompletionCallback& callback) { | 517 const CompletionCallback& callback, |
| 518 bool for_bidirectional) { |
| 513 DCHECK(!stream_); | 519 DCHECK(!stream_); |
| 520 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) |
| 521 DCHECK(!bidirectional_stream_job_); |
| 522 #endif |
| 514 DCHECK(callback_.is_null()); | 523 DCHECK(callback_.is_null()); |
| 515 DCHECK(factory_); | 524 DCHECK(factory_); |
| 516 origin_host_ = origin_host.as_string(); | 525 origin_host_ = origin_host.as_string(); |
| 517 privacy_mode_ = privacy_mode; | 526 privacy_mode_ = privacy_mode; |
| 527 for_bidirectional_ = for_bidirectional; |
| 528 |
| 518 int rv = factory_->Create(host_port_pair, privacy_mode, cert_verify_flags, | 529 int rv = factory_->Create(host_port_pair, privacy_mode, cert_verify_flags, |
| 519 origin_host, method, net_log, this); | 530 origin_host, method, net_log, this); |
| 520 if (rv == ERR_IO_PENDING) { | 531 if (rv == ERR_IO_PENDING) { |
| 521 host_port_pair_ = host_port_pair; | 532 host_port_pair_ = host_port_pair; |
| 522 net_log_ = net_log; | 533 net_log_ = net_log; |
| 523 callback_ = callback; | 534 callback_ = callback; |
| 524 } else { | 535 } else { |
| 525 factory_ = nullptr; | 536 factory_ = nullptr; |
| 526 } | 537 } |
| 527 if (rv == OK) | 538 if (rv == OK) { |
| 539 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) |
| 540 DCHECK(stream_ || (for_bidirectional_ && bidirectional_stream_job_)); |
| 541 #else |
| 528 DCHECK(stream_); | 542 DCHECK(stream_); |
| 543 #endif |
| 544 } |
| 529 return rv; | 545 return rv; |
| 530 } | 546 } |
| 531 | 547 |
| 532 void QuicStreamRequest::set_stream(scoped_ptr<QuicHttpStream> stream) { | 548 void QuicStreamRequest::InitializeStreamFromSession( |
| 533 DCHECK(stream); | 549 QuicChromiumClientSession* session) { |
| 534 stream_ = std::move(stream); | 550 DCHECK(session); |
| 551 if (for_bidirectional_) { |
| 552 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) |
| 553 bidirectional_stream_job_.reset( |
| 554 new BidirectionalStreamQuicImpl(session->GetWeakPtr())); |
| 555 #else |
| 556 DCHECK(false); |
| 557 #endif |
| 558 } else { |
| 559 stream_.reset(new QuicHttpStream(session->GetWeakPtr())); |
| 560 } |
| 535 } | 561 } |
| 536 | 562 |
| 537 void QuicStreamRequest::OnRequestComplete(int rv) { | 563 void QuicStreamRequest::OnRequestComplete(int rv) { |
| 538 factory_ = nullptr; | 564 factory_ = nullptr; |
| 539 callback_.Run(rv); | 565 callback_.Run(rv); |
| 540 } | 566 } |
| 541 | 567 |
| 542 base::TimeDelta QuicStreamRequest::GetTimeDelayForWaitingJob() const { | 568 base::TimeDelta QuicStreamRequest::GetTimeDelayForWaitingJob() const { |
| 543 if (!factory_) | 569 if (!factory_) |
| 544 return base::TimeDelta(); | 570 return base::TimeDelta(); |
| 545 return factory_->GetTimeDelayForWaitingJob( | 571 return factory_->GetTimeDelayForWaitingJob( |
| 546 QuicServerId(host_port_pair_, privacy_mode_)); | 572 QuicServerId(host_port_pair_, privacy_mode_)); |
| 547 } | 573 } |
| 548 | 574 |
| 549 scoped_ptr<QuicHttpStream> QuicStreamRequest::ReleaseStream() { | 575 scoped_ptr<QuicHttpStream> QuicStreamRequest::ReleaseStream() { |
| 550 DCHECK(stream_); | 576 DCHECK(stream_); |
| 577 DCHECK(!for_bidirectional_); |
| 551 return std::move(stream_); | 578 return std::move(stream_); |
| 552 } | 579 } |
| 553 | 580 |
| 581 #if BUILDFLAG(ENABLE_BIDIRECTIONAL_STREAM) |
| 582 scoped_ptr<BidirectionalStreamJob> |
| 583 QuicStreamRequest::ReleaseBidirectionalStreamJob() { |
| 584 DCHECK(bidirectional_stream_job_); |
| 585 DCHECK(for_bidirectional_); |
| 586 |
| 587 return std::move(bidirectional_stream_job_); |
| 588 } |
| 589 #endif |
| 590 |
| 554 QuicStreamFactory::QuicStreamFactory( | 591 QuicStreamFactory::QuicStreamFactory( |
| 555 HostResolver* host_resolver, | 592 HostResolver* host_resolver, |
| 556 ClientSocketFactory* client_socket_factory, | 593 ClientSocketFactory* client_socket_factory, |
| 557 base::WeakPtr<HttpServerProperties> http_server_properties, | 594 base::WeakPtr<HttpServerProperties> http_server_properties, |
| 558 CertVerifier* cert_verifier, | 595 CertVerifier* cert_verifier, |
| 559 CTPolicyEnforcer* ct_policy_enforcer, | 596 CTPolicyEnforcer* ct_policy_enforcer, |
| 560 ChannelIDService* channel_id_service, | 597 ChannelIDService* channel_id_service, |
| 561 TransportSecurityState* transport_security_state, | 598 TransportSecurityState* transport_security_state, |
| 562 CTVerifier* cert_transparency_verifier, | 599 CTVerifier* cert_transparency_verifier, |
| 563 SocketPerformanceWatcherFactory* socket_performance_watcher_factory, | 600 SocketPerformanceWatcherFactory* socket_performance_watcher_factory, |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 765 const BoundNetLog& net_log, | 802 const BoundNetLog& net_log, |
| 766 QuicStreamRequest* request) { | 803 QuicStreamRequest* request) { |
| 767 QuicServerId server_id(host_port_pair, privacy_mode); | 804 QuicServerId server_id(host_port_pair, privacy_mode); |
| 768 // TODO(rtenneti): crbug.com/498823 - delete active_sessions_.empty() checks. | 805 // TODO(rtenneti): crbug.com/498823 - delete active_sessions_.empty() checks. |
| 769 if (!active_sessions_.empty()) { | 806 if (!active_sessions_.empty()) { |
| 770 SessionMap::iterator it = active_sessions_.find(server_id); | 807 SessionMap::iterator it = active_sessions_.find(server_id); |
| 771 if (it != active_sessions_.end()) { | 808 if (it != active_sessions_.end()) { |
| 772 QuicChromiumClientSession* session = it->second; | 809 QuicChromiumClientSession* session = it->second; |
| 773 if (!session->CanPool(origin_host.as_string(), privacy_mode)) | 810 if (!session->CanPool(origin_host.as_string(), privacy_mode)) |
| 774 return ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN; | 811 return ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN; |
| 775 request->set_stream(CreateFromSession(session)); | 812 request->InitializeStreamFromSession(session); |
| 776 return OK; | 813 return OK; |
| 777 } | 814 } |
| 778 } | 815 } |
| 779 | 816 |
| 780 if (HasActiveJob(server_id)) { | 817 if (HasActiveJob(server_id)) { |
| 781 active_requests_[request] = server_id; | 818 active_requests_[request] = server_id; |
| 782 job_requests_map_[server_id].insert(request); | 819 job_requests_map_[server_id].insert(request); |
| 783 return ERR_IO_PENDING; | 820 return ERR_IO_PENDING; |
| 784 } | 821 } |
| 785 | 822 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 821 // related changes. | 858 // related changes. |
| 822 if (active_sessions_.empty()) | 859 if (active_sessions_.empty()) |
| 823 return ERR_QUIC_PROTOCOL_ERROR; | 860 return ERR_QUIC_PROTOCOL_ERROR; |
| 824 SessionMap::iterator it = active_sessions_.find(server_id); | 861 SessionMap::iterator it = active_sessions_.find(server_id); |
| 825 DCHECK(it != active_sessions_.end()); | 862 DCHECK(it != active_sessions_.end()); |
| 826 if (it == active_sessions_.end()) | 863 if (it == active_sessions_.end()) |
| 827 return ERR_QUIC_PROTOCOL_ERROR; | 864 return ERR_QUIC_PROTOCOL_ERROR; |
| 828 QuicChromiumClientSession* session = it->second; | 865 QuicChromiumClientSession* session = it->second; |
| 829 if (!session->CanPool(origin_host.as_string(), privacy_mode)) | 866 if (!session->CanPool(origin_host.as_string(), privacy_mode)) |
| 830 return ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN; | 867 return ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN; |
| 831 request->set_stream(CreateFromSession(session)); | 868 request->InitializeStreamFromSession(session); |
| 832 } | 869 } |
| 833 return rv; | 870 return rv; |
| 834 } | 871 } |
| 835 | 872 |
| 836 void QuicStreamFactory::CreateAuxilaryJob(const QuicServerId server_id, | 873 void QuicStreamFactory::CreateAuxilaryJob(const QuicServerId server_id, |
| 837 int cert_verify_flags, | 874 int cert_verify_flags, |
| 838 bool server_and_origin_have_same_host, | 875 bool server_and_origin_have_same_host, |
| 839 bool is_post, | 876 bool is_post, |
| 840 const BoundNetLog& net_log) { | 877 const BoundNetLog& net_log) { |
| 841 Job* aux_job = new Job( | 878 Job* aux_job = new Job( |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 899 RequestSet::iterator old_request_it = request_it; | 936 RequestSet::iterator old_request_it = request_it; |
| 900 ++request_it; | 937 ++request_it; |
| 901 // Remove request from containers so that OnRequestComplete() is not | 938 // Remove request from containers so that OnRequestComplete() is not |
| 902 // called later again on the same request. | 939 // called later again on the same request. |
| 903 job_requests_map_[server_id].erase(old_request_it); | 940 job_requests_map_[server_id].erase(old_request_it); |
| 904 active_requests_.erase(request); | 941 active_requests_.erase(request); |
| 905 // Notify request of certificate error. | 942 // Notify request of certificate error. |
| 906 request->OnRequestComplete(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN); | 943 request->OnRequestComplete(ERR_ALTERNATIVE_CERT_NOT_VALID_FOR_ORIGIN); |
| 907 continue; | 944 continue; |
| 908 } | 945 } |
| 909 request->set_stream(CreateFromSession(session)); | 946 request->InitializeStreamFromSession(session); |
| 910 ++request_it; | 947 ++request_it; |
| 911 } | 948 } |
| 912 } | 949 } |
| 913 | 950 |
| 914 while (!job_requests_map_[server_id].empty()) { | 951 while (!job_requests_map_[server_id].empty()) { |
| 915 RequestSet::iterator it = job_requests_map_[server_id].begin(); | 952 RequestSet::iterator it = job_requests_map_[server_id].begin(); |
| 916 QuicStreamRequest* request = *it; | 953 QuicStreamRequest* request = *it; |
| 917 job_requests_map_[server_id].erase(it); | 954 job_requests_map_[server_id].erase(it); |
| 918 active_requests_.erase(request); | 955 active_requests_.erase(request); |
| 919 // Even though we're invoking callbacks here, we don't need to worry | 956 // 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 Loading... |
| 1645 // Since the session was active, there's no longer an | 1682 // Since the session was active, there's no longer an |
| 1646 // HttpStreamFactoryImpl::Job running which can mark it broken, unless the TCP | 1683 // 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 | 1684 // 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 | 1685 // it as recently broken, which means that 0-RTT will be disabled but we'll |
| 1649 // still race. | 1686 // still race. |
| 1650 http_server_properties_->MarkAlternativeServiceRecentlyBroken( | 1687 http_server_properties_->MarkAlternativeServiceRecentlyBroken( |
| 1651 alternative_service); | 1688 alternative_service); |
| 1652 } | 1689 } |
| 1653 | 1690 |
| 1654 } // namespace net | 1691 } // namespace net |
| OLD | NEW |