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 <openssl/aead.h> | 7 #include <openssl/aead.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <tuple> | 10 #include <tuple> |
(...skipping 16 matching lines...) Expand all Loading... | |
27 #include "crypto/openssl_util.h" | 27 #include "crypto/openssl_util.h" |
28 #include "net/base/ip_address.h" | 28 #include "net/base/ip_address.h" |
29 #include "net/base/net_errors.h" | 29 #include "net/base/net_errors.h" |
30 #include "net/cert/cert_verifier.h" | 30 #include "net/cert/cert_verifier.h" |
31 #include "net/cert/ct_verifier.h" | 31 #include "net/cert/ct_verifier.h" |
32 #include "net/dns/host_resolver.h" | 32 #include "net/dns/host_resolver.h" |
33 #include "net/dns/single_request_host_resolver.h" | 33 #include "net/dns/single_request_host_resolver.h" |
34 #include "net/http/bidirectional_stream_impl.h" | 34 #include "net/http/bidirectional_stream_impl.h" |
35 #include "net/quic/bidirectional_stream_quic_impl.h" | 35 #include "net/quic/bidirectional_stream_quic_impl.h" |
36 #include "net/quic/crypto/channel_id_chromium.h" | 36 #include "net/quic/crypto/channel_id_chromium.h" |
37 #include "net/quic/crypto/proof_verifier.h" | |
37 #include "net/quic/crypto/proof_verifier_chromium.h" | 38 #include "net/quic/crypto/proof_verifier_chromium.h" |
38 #include "net/quic/crypto/properties_based_quic_server_info.h" | 39 #include "net/quic/crypto/properties_based_quic_server_info.h" |
39 #include "net/quic/crypto/quic_random.h" | 40 #include "net/quic/crypto/quic_random.h" |
40 #include "net/quic/crypto/quic_server_info.h" | 41 #include "net/quic/crypto/quic_server_info.h" |
41 #include "net/quic/port_suggester.h" | 42 #include "net/quic/port_suggester.h" |
42 #include "net/quic/quic_chromium_alarm_factory.h" | 43 #include "net/quic/quic_chromium_alarm_factory.h" |
43 #include "net/quic/quic_chromium_connection_helper.h" | 44 #include "net/quic/quic_chromium_connection_helper.h" |
44 #include "net/quic/quic_chromium_packet_reader.h" | 45 #include "net/quic/quic_chromium_packet_reader.h" |
45 #include "net/quic/quic_chromium_packet_writer.h" | 46 #include "net/quic/quic_chromium_packet_writer.h" |
46 #include "net/quic/quic_client_promised_info.h" | 47 #include "net/quic/quic_client_promised_info.h" |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
160 QuicConfig config; | 161 QuicConfig config; |
161 config.SetIdleConnectionStateLifetime( | 162 config.SetIdleConnectionStateLifetime( |
162 QuicTime::Delta::FromSeconds(idle_connection_timeout_seconds), | 163 QuicTime::Delta::FromSeconds(idle_connection_timeout_seconds), |
163 QuicTime::Delta::FromSeconds(idle_connection_timeout_seconds)); | 164 QuicTime::Delta::FromSeconds(idle_connection_timeout_seconds)); |
164 config.SetConnectionOptionsToSend(connection_options); | 165 config.SetConnectionOptionsToSend(connection_options); |
165 return config; | 166 return config; |
166 } | 167 } |
167 | 168 |
168 } // namespace | 169 } // namespace |
169 | 170 |
171 class QuicStreamFactory::CertVerifierJob { | |
Ryan Hamilton
2016/07/07 21:36:12
nit: comment, please.
ramant (doing other things)
2016/07/07 22:18:27
My fault.
Done.
| |
172 public: | |
173 class ProofVerifierCallbackImpl : public ProofVerifierCallback { | |
174 public: | |
175 explicit ProofVerifierCallbackImpl(CertVerifierJob* job) : job_(job) {} | |
176 | |
177 ~ProofVerifierCallbackImpl() override {} | |
178 | |
179 void Run(bool ok, | |
180 const std::string& error_details, | |
181 std::unique_ptr<ProofVerifyDetails>* details) override { | |
182 if (job_ == nullptr) | |
183 return; | |
184 job_->verify_callback_ = nullptr; | |
185 job_->OnComplete(); | |
186 } | |
187 | |
188 void Cancel() { job_ = nullptr; } | |
189 | |
190 private: | |
191 CertVerifierJob* job_; | |
192 }; | |
193 | |
194 CertVerifierJob(const QuicServerId& server_id, | |
195 int cert_verify_flags, | |
196 const BoundNetLog& net_log) | |
197 : server_id_(server_id), | |
198 verify_callback_(nullptr), | |
199 verify_context_(base::WrapUnique( | |
200 new ProofVerifyContextChromium(cert_verify_flags, net_log))), | |
201 net_log_(net_log), | |
202 weak_factory_(this) {} | |
203 | |
204 ~CertVerifierJob() { | |
205 if (verify_callback_) | |
206 verify_callback_->Cancel(); | |
207 } | |
208 | |
209 QuicAsyncStatus Run(QuicCryptoClientConfig* crypto_config, | |
210 const CompletionCallback& callback) { | |
211 QuicCryptoClientConfig::CachedState* cached = | |
212 crypto_config->LookupOrCreate(server_id_); | |
213 ProofVerifierCallbackImpl* verify_callback = | |
214 new ProofVerifierCallbackImpl(this); | |
215 QuicAsyncStatus status = crypto_config->proof_verifier()->VerifyCertChain( | |
216 server_id_.host(), server_id_.port(), cached->certs(), | |
217 verify_context_.get(), &verify_error_details_, &verify_details_, | |
218 verify_callback); | |
219 if (status == QUIC_PENDING) { | |
220 verify_callback_ = verify_callback; | |
221 callback_ = callback; | |
222 } else { | |
223 delete verify_callback; | |
224 } | |
225 return status; | |
226 } | |
227 | |
228 void OnComplete() { | |
229 if (!callback_.is_null()) | |
230 callback_.Run(OK); | |
231 } | |
232 | |
233 const QuicServerId& server_id() const { return server_id_; } | |
234 | |
235 private: | |
236 QuicServerId server_id_; | |
237 ProofVerifierCallbackImpl* verify_callback_; | |
238 std::unique_ptr<ProofVerifyContext> verify_context_; | |
239 std::unique_ptr<ProofVerifyDetails> verify_details_; | |
240 std::string verify_error_details_; | |
241 const BoundNetLog net_log_; | |
242 CompletionCallback callback_; | |
243 base::WeakPtrFactory<CertVerifierJob> weak_factory_; | |
244 | |
245 DISALLOW_COPY_AND_ASSIGN(CertVerifierJob); | |
246 }; | |
247 | |
170 // Responsible for creating a new QUIC session to the specified server, and | 248 // Responsible for creating a new QUIC session to the specified server, and |
171 // for notifying any associated requests when complete. | 249 // for notifying any associated requests when complete. |
172 class QuicStreamFactory::Job { | 250 class QuicStreamFactory::Job { |
173 public: | 251 public: |
174 Job(QuicStreamFactory* factory, | 252 Job(QuicStreamFactory* factory, |
175 HostResolver* host_resolver, | 253 HostResolver* host_resolver, |
176 const QuicSessionKey& key, | 254 const QuicSessionKey& key, |
177 bool was_alternative_service_recently_broken, | 255 bool was_alternative_service_recently_broken, |
178 int cert_verify_flags, | 256 int cert_verify_flags, |
179 QuicServerInfo* server_info, | 257 QuicServerInfo* server_info, |
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
625 int threshold_public_resets_post_handshake, | 703 int threshold_public_resets_post_handshake, |
626 int threshold_timeouts_with_open_streams, | 704 int threshold_timeouts_with_open_streams, |
627 int socket_receive_buffer_size, | 705 int socket_receive_buffer_size, |
628 bool delay_tcp_race, | 706 bool delay_tcp_race, |
629 int max_server_configs_stored_in_properties, | 707 int max_server_configs_stored_in_properties, |
630 bool close_sessions_on_ip_change, | 708 bool close_sessions_on_ip_change, |
631 bool disable_quic_on_timeout_with_open_streams, | 709 bool disable_quic_on_timeout_with_open_streams, |
632 int idle_connection_timeout_seconds, | 710 int idle_connection_timeout_seconds, |
633 bool migrate_sessions_on_network_change, | 711 bool migrate_sessions_on_network_change, |
634 bool migrate_sessions_early, | 712 bool migrate_sessions_early, |
713 bool race_cert_verification, | |
635 const QuicTagVector& connection_options, | 714 const QuicTagVector& connection_options, |
636 bool enable_token_binding) | 715 bool enable_token_binding) |
637 : require_confirmation_(true), | 716 : require_confirmation_(true), |
638 net_log_(net_log), | 717 net_log_(net_log), |
639 host_resolver_(host_resolver), | 718 host_resolver_(host_resolver), |
640 client_socket_factory_(client_socket_factory), | 719 client_socket_factory_(client_socket_factory), |
641 http_server_properties_(http_server_properties), | 720 http_server_properties_(http_server_properties), |
642 transport_security_state_(transport_security_state), | 721 transport_security_state_(transport_security_state), |
643 cert_transparency_verifier_(cert_transparency_verifier), | 722 cert_transparency_verifier_(cert_transparency_verifier), |
644 quic_crypto_client_stream_factory_(quic_crypto_client_stream_factory), | 723 quic_crypto_client_stream_factory_(quic_crypto_client_stream_factory), |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
678 delay_tcp_race_(delay_tcp_race), | 757 delay_tcp_race_(delay_tcp_race), |
679 yield_after_packets_(kQuicYieldAfterPacketsRead), | 758 yield_after_packets_(kQuicYieldAfterPacketsRead), |
680 yield_after_duration_(QuicTime::Delta::FromMilliseconds( | 759 yield_after_duration_(QuicTime::Delta::FromMilliseconds( |
681 kQuicYieldAfterDurationMilliseconds)), | 760 kQuicYieldAfterDurationMilliseconds)), |
682 close_sessions_on_ip_change_(close_sessions_on_ip_change), | 761 close_sessions_on_ip_change_(close_sessions_on_ip_change), |
683 migrate_sessions_on_network_change_( | 762 migrate_sessions_on_network_change_( |
684 migrate_sessions_on_network_change && | 763 migrate_sessions_on_network_change && |
685 NetworkChangeNotifier::AreNetworkHandlesSupported()), | 764 NetworkChangeNotifier::AreNetworkHandlesSupported()), |
686 migrate_sessions_early_(migrate_sessions_early && | 765 migrate_sessions_early_(migrate_sessions_early && |
687 migrate_sessions_on_network_change_), | 766 migrate_sessions_on_network_change_), |
767 race_cert_verification_(race_cert_verification), | |
688 port_seed_(random_generator_->RandUint64()), | 768 port_seed_(random_generator_->RandUint64()), |
689 check_persisted_supports_quic_(true), | 769 check_persisted_supports_quic_(true), |
690 has_initialized_data_(false), | 770 has_initialized_data_(false), |
691 num_push_streams_created_(0), | 771 num_push_streams_created_(0), |
692 status_(OPEN), | 772 status_(OPEN), |
693 task_runner_(nullptr), | 773 task_runner_(nullptr), |
694 ssl_config_service_(ssl_config_service), | 774 ssl_config_service_(ssl_config_service), |
695 weak_factory_(this) { | 775 weak_factory_(this) { |
696 if (ssl_config_service_.get()) | 776 if (ssl_config_service_.get()) |
697 ssl_config_service_->AddObserver(this); | 777 ssl_config_service_->AddObserver(this); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
745 CloseAllSessions(ERR_ABORTED, QUIC_CONNECTION_CANCELLED); | 825 CloseAllSessions(ERR_ABORTED, QUIC_CONNECTION_CANCELLED); |
746 while (!all_sessions_.empty()) { | 826 while (!all_sessions_.empty()) { |
747 delete all_sessions_.begin()->first; | 827 delete all_sessions_.begin()->first; |
748 all_sessions_.erase(all_sessions_.begin()); | 828 all_sessions_.erase(all_sessions_.begin()); |
749 } | 829 } |
750 while (!active_jobs_.empty()) { | 830 while (!active_jobs_.empty()) { |
751 const QuicServerId server_id = active_jobs_.begin()->first; | 831 const QuicServerId server_id = active_jobs_.begin()->first; |
752 STLDeleteElements(&(active_jobs_[server_id])); | 832 STLDeleteElements(&(active_jobs_[server_id])); |
753 active_jobs_.erase(server_id); | 833 active_jobs_.erase(server_id); |
754 } | 834 } |
835 while (!active_cert_verifier_jobs_.empty()) | |
836 active_cert_verifier_jobs_.erase(active_cert_verifier_jobs_.begin()); | |
755 if (ssl_config_service_.get()) | 837 if (ssl_config_service_.get()) |
756 ssl_config_service_->RemoveObserver(this); | 838 ssl_config_service_->RemoveObserver(this); |
757 if (migrate_sessions_on_network_change_) { | 839 if (migrate_sessions_on_network_change_) { |
758 NetworkChangeNotifier::RemoveNetworkObserver(this); | 840 NetworkChangeNotifier::RemoveNetworkObserver(this); |
759 } else if (close_sessions_on_ip_change_) { | 841 } else if (close_sessions_on_ip_change_) { |
760 NetworkChangeNotifier::RemoveIPAddressObserver(this); | 842 NetworkChangeNotifier::RemoveIPAddressObserver(this); |
761 } | 843 } |
762 } | 844 } |
763 | 845 |
764 void QuicStreamFactory::set_require_confirmation(bool require_confirmation) { | 846 void QuicStreamFactory::set_require_confirmation(bool require_confirmation) { |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
881 if (!ContainsKey(quic_supported_servers_at_startup_, destination)) { | 963 if (!ContainsKey(quic_supported_servers_at_startup_, destination)) { |
882 // If there is no entry for QUIC, consider that as a new server and | 964 // If there is no entry for QUIC, consider that as a new server and |
883 // don't wait for Cache thread to load the data for that server. | 965 // don't wait for Cache thread to load the data for that server. |
884 load_from_disk_cache = false; | 966 load_from_disk_cache = false; |
885 } | 967 } |
886 if (load_from_disk_cache && CryptoConfigCacheIsEmpty(server_id)) { | 968 if (load_from_disk_cache && CryptoConfigCacheIsEmpty(server_id)) { |
887 quic_server_info = quic_server_info_factory_->GetForServer(server_id); | 969 quic_server_info = quic_server_info_factory_->GetForServer(server_id); |
888 } | 970 } |
889 } | 971 } |
890 | 972 |
973 StartCertVerifyJob(server_id, cert_verify_flags, net_log); | |
974 | |
891 QuicSessionKey key(destination, server_id); | 975 QuicSessionKey key(destination, server_id); |
892 std::unique_ptr<Job> job( | 976 std::unique_ptr<Job> job( |
893 new Job(this, host_resolver_, key, WasQuicRecentlyBroken(server_id), | 977 new Job(this, host_resolver_, key, WasQuicRecentlyBroken(server_id), |
894 cert_verify_flags, quic_server_info, net_log)); | 978 cert_verify_flags, quic_server_info, net_log)); |
895 int rv = job->Run(base::Bind(&QuicStreamFactory::OnJobComplete, | 979 int rv = job->Run(base::Bind(&QuicStreamFactory::OnJobComplete, |
896 base::Unretained(this), job.get())); | 980 base::Unretained(this), job.get())); |
897 if (rv == ERR_IO_PENDING) { | 981 if (rv == ERR_IO_PENDING) { |
898 active_requests_[request] = server_id; | 982 active_requests_[request] = server_id; |
899 job_requests_map_[server_id].insert(request); | 983 job_requests_map_[server_id].insert(request); |
900 active_jobs_[server_id].insert(job.release()); | 984 active_jobs_[server_id].insert(job.release()); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1013 for (Job* other_job : active_jobs_[server_id]) { | 1097 for (Job* other_job : active_jobs_[server_id]) { |
1014 if (other_job != job) | 1098 if (other_job != job) |
1015 other_job->Cancel(); | 1099 other_job->Cancel(); |
1016 } | 1100 } |
1017 | 1101 |
1018 STLDeleteElements(&(active_jobs_[server_id])); | 1102 STLDeleteElements(&(active_jobs_[server_id])); |
1019 active_jobs_.erase(server_id); | 1103 active_jobs_.erase(server_id); |
1020 job_requests_map_.erase(server_id); | 1104 job_requests_map_.erase(server_id); |
1021 } | 1105 } |
1022 | 1106 |
1107 void QuicStreamFactory::OnCertVerifyJobComplete(CertVerifierJob* job, int rv) { | |
1108 active_cert_verifier_jobs_.erase(job->server_id()); | |
1109 } | |
1110 | |
1023 std::unique_ptr<QuicHttpStream> QuicStreamFactory::CreateFromSession( | 1111 std::unique_ptr<QuicHttpStream> QuicStreamFactory::CreateFromSession( |
1024 QuicChromiumClientSession* session) { | 1112 QuicChromiumClientSession* session) { |
1025 return std::unique_ptr<QuicHttpStream>( | 1113 return std::unique_ptr<QuicHttpStream>( |
1026 new QuicHttpStream(session->GetWeakPtr())); | 1114 new QuicHttpStream(session->GetWeakPtr())); |
1027 } | 1115 } |
1028 | 1116 |
1029 QuicChromiumClientSession::QuicDisabledReason | 1117 QuicChromiumClientSession::QuicDisabledReason |
1030 QuicStreamFactory::QuicDisabledReason(uint16_t port) const { | 1118 QuicStreamFactory::QuicDisabledReason(uint16_t port) const { |
1031 if (max_number_of_lossy_connections_ > 0 && | 1119 if (max_number_of_lossy_connections_ > 0 && |
1032 number_of_lossy_connections_.find(port) != | 1120 number_of_lossy_connections_.find(port) != |
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1541 // TODO(rtenneti): crbug.com/498823 - delete active_sessions_.empty() check. | 1629 // TODO(rtenneti): crbug.com/498823 - delete active_sessions_.empty() check. |
1542 if (active_sessions_.empty()) | 1630 if (active_sessions_.empty()) |
1543 return false; | 1631 return false; |
1544 return ContainsKey(active_sessions_, server_id); | 1632 return ContainsKey(active_sessions_, server_id); |
1545 } | 1633 } |
1546 | 1634 |
1547 bool QuicStreamFactory::HasActiveJob(const QuicServerId& server_id) const { | 1635 bool QuicStreamFactory::HasActiveJob(const QuicServerId& server_id) const { |
1548 return ContainsKey(active_jobs_, server_id); | 1636 return ContainsKey(active_jobs_, server_id); |
1549 } | 1637 } |
1550 | 1638 |
1639 bool QuicStreamFactory::HasActiveCertVerifierJob( | |
1640 const QuicServerId& server_id) const { | |
1641 return ContainsKey(active_cert_verifier_jobs_, server_id); | |
1642 } | |
1643 | |
1551 int QuicStreamFactory::ConfigureSocket(DatagramClientSocket* socket, | 1644 int QuicStreamFactory::ConfigureSocket(DatagramClientSocket* socket, |
1552 IPEndPoint addr, | 1645 IPEndPoint addr, |
1553 NetworkHandle network) { | 1646 NetworkHandle network) { |
1554 if (enable_non_blocking_io_ && | 1647 if (enable_non_blocking_io_ && |
1555 client_socket_factory_ == ClientSocketFactory::GetDefaultFactory()) { | 1648 client_socket_factory_ == ClientSocketFactory::GetDefaultFactory()) { |
1556 #if defined(OS_WIN) | 1649 #if defined(OS_WIN) |
1557 static_cast<UDPClientSocket*>(socket)->UseNonBlockingIO(); | 1650 static_cast<UDPClientSocket*>(socket)->UseNonBlockingIO(); |
1558 #endif | 1651 #endif |
1559 } | 1652 } |
1560 | 1653 |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1748 alternative_service); | 1841 alternative_service); |
1749 } | 1842 } |
1750 | 1843 |
1751 bool QuicStreamFactory::CryptoConfigCacheIsEmpty( | 1844 bool QuicStreamFactory::CryptoConfigCacheIsEmpty( |
1752 const QuicServerId& server_id) { | 1845 const QuicServerId& server_id) { |
1753 QuicCryptoClientConfig::CachedState* cached = | 1846 QuicCryptoClientConfig::CachedState* cached = |
1754 crypto_config_.LookupOrCreate(server_id); | 1847 crypto_config_.LookupOrCreate(server_id); |
1755 return cached->IsEmpty(); | 1848 return cached->IsEmpty(); |
1756 } | 1849 } |
1757 | 1850 |
1851 void QuicStreamFactory::StartCertVerifyJob(const QuicServerId& server_id, | |
1852 int cert_verify_flags, | |
1853 const BoundNetLog& net_log) { | |
1854 if (!race_cert_verification_) | |
1855 return; | |
1856 QuicCryptoClientConfig::CachedState* cached = | |
1857 crypto_config_.LookupOrCreate(server_id); | |
1858 if (!cached || cached->certs().empty() || | |
1859 HasActiveCertVerifierJob(server_id)) { | |
1860 return; | |
1861 } | |
1862 std::unique_ptr<CertVerifierJob> cert_verifier_job( | |
1863 new CertVerifierJob(server_id, cert_verify_flags, net_log)); | |
1864 QuicAsyncStatus status = cert_verifier_job->Run( | |
1865 &crypto_config_, | |
1866 base::Bind(&QuicStreamFactory::OnCertVerifyJobComplete, | |
1867 base::Unretained(this), cert_verifier_job.get())); | |
1868 if (status == QUIC_PENDING) | |
1869 active_cert_verifier_jobs_[server_id] = std::move(cert_verifier_job); | |
1870 } | |
1871 | |
1758 void QuicStreamFactory::InitializeCachedStateInCryptoConfig( | 1872 void QuicStreamFactory::InitializeCachedStateInCryptoConfig( |
1759 const QuicServerId& server_id, | 1873 const QuicServerId& server_id, |
1760 const std::unique_ptr<QuicServerInfo>& server_info, | 1874 const std::unique_ptr<QuicServerInfo>& server_info, |
1761 QuicConnectionId* connection_id) { | 1875 QuicConnectionId* connection_id) { |
1762 QuicCryptoClientConfig::CachedState* cached = | 1876 QuicCryptoClientConfig::CachedState* cached = |
1763 crypto_config_.LookupOrCreate(server_id); | 1877 crypto_config_.LookupOrCreate(server_id); |
1764 if (cached->has_server_designated_connection_id()) | 1878 if (cached->has_server_designated_connection_id()) |
1765 *connection_id = cached->GetNextServerDesignatedConnectionId(); | 1879 *connection_id = cached->GetNextServerDesignatedConnectionId(); |
1766 | 1880 |
1767 if (!cached->IsEmpty()) | 1881 if (!cached->IsEmpty()) |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1869 // Since the session was active, there's no longer an | 1983 // Since the session was active, there's no longer an |
1870 // HttpStreamFactoryImpl::Job running which can mark it broken, unless the TCP | 1984 // HttpStreamFactoryImpl::Job running which can mark it broken, unless the TCP |
1871 // job also fails. So to avoid not using QUIC when we otherwise could, we mark | 1985 // job also fails. So to avoid not using QUIC when we otherwise could, we mark |
1872 // it as recently broken, which means that 0-RTT will be disabled but we'll | 1986 // it as recently broken, which means that 0-RTT will be disabled but we'll |
1873 // still race. | 1987 // still race. |
1874 http_server_properties_->MarkAlternativeServiceRecentlyBroken( | 1988 http_server_properties_->MarkAlternativeServiceRecentlyBroken( |
1875 alternative_service); | 1989 alternative_service); |
1876 } | 1990 } |
1877 | 1991 |
1878 } // namespace net | 1992 } // namespace net |
OLD | NEW |