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/chromium/quic_stream_factory.h" | 5 #include "net/quic/chromium/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> |
11 #include <utility> | 11 #include <utility> |
12 | 12 |
13 #include "base/location.h" | 13 #include "base/location.h" |
14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
15 #include "base/metrics/field_trial.h" | 15 #include "base/metrics/field_trial.h" |
16 #include "base/metrics/histogram_macros.h" | 16 #include "base/metrics/histogram_macros.h" |
17 #include "base/metrics/sparse_histogram.h" | 17 #include "base/metrics/sparse_histogram.h" |
18 #include "base/rand_util.h" | 18 #include "base/rand_util.h" |
19 #include "base/single_thread_task_runner.h" | 19 #include "base/single_thread_task_runner.h" |
20 #include "base/stl_util.h" | |
21 #include "base/strings/string_number_conversions.h" | 20 #include "base/strings/string_number_conversions.h" |
22 #include "base/strings/string_util.h" | 21 #include "base/strings/string_util.h" |
23 #include "base/strings/stringprintf.h" | 22 #include "base/strings/stringprintf.h" |
24 #include "base/threading/thread_task_runner_handle.h" | 23 #include "base/threading/thread_task_runner_handle.h" |
25 #include "base/trace_event/trace_event.h" | 24 #include "base/trace_event/trace_event.h" |
26 #include "base/values.h" | 25 #include "base/values.h" |
27 #include "crypto/openssl_util.h" | 26 #include "crypto/openssl_util.h" |
28 #include "net/base/ip_address.h" | 27 #include "net/base/ip_address.h" |
29 #include "net/base/net_errors.h" | 28 #include "net/base/net_errors.h" |
30 #include "net/cert/cert_verifier.h" | 29 #include "net/cert/cert_verifier.h" |
(...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
846 NetworkChangeNotifier::AddIPAddressObserver(this); | 845 NetworkChangeNotifier::AddIPAddressObserver(this); |
847 } | 846 } |
848 } | 847 } |
849 | 848 |
850 QuicStreamFactory::~QuicStreamFactory() { | 849 QuicStreamFactory::~QuicStreamFactory() { |
851 CloseAllSessions(ERR_ABORTED, QUIC_CONNECTION_CANCELLED); | 850 CloseAllSessions(ERR_ABORTED, QUIC_CONNECTION_CANCELLED); |
852 while (!all_sessions_.empty()) { | 851 while (!all_sessions_.empty()) { |
853 delete all_sessions_.begin()->first; | 852 delete all_sessions_.begin()->first; |
854 all_sessions_.erase(all_sessions_.begin()); | 853 all_sessions_.erase(all_sessions_.begin()); |
855 } | 854 } |
856 while (!active_jobs_.empty()) { | 855 active_jobs_.clear(); |
857 const QuicServerId server_id = active_jobs_.begin()->first; | |
858 base::STLDeleteElements(&(active_jobs_[server_id])); | |
859 active_jobs_.erase(server_id); | |
860 } | |
861 while (!active_cert_verifier_jobs_.empty()) | 856 while (!active_cert_verifier_jobs_.empty()) |
862 active_cert_verifier_jobs_.erase(active_cert_verifier_jobs_.begin()); | 857 active_cert_verifier_jobs_.erase(active_cert_verifier_jobs_.begin()); |
863 if (ssl_config_service_.get()) | 858 if (ssl_config_service_.get()) |
864 ssl_config_service_->RemoveObserver(this); | 859 ssl_config_service_->RemoveObserver(this); |
865 if (migrate_sessions_on_network_change_) { | 860 if (migrate_sessions_on_network_change_) { |
866 NetworkChangeNotifier::RemoveNetworkObserver(this); | 861 NetworkChangeNotifier::RemoveNetworkObserver(this); |
867 } else if (close_sessions_on_ip_change_) { | 862 } else if (close_sessions_on_ip_change_) { |
868 NetworkChangeNotifier::RemoveIPAddressObserver(this); | 863 NetworkChangeNotifier::RemoveIPAddressObserver(this); |
869 } | 864 } |
870 } | 865 } |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
991 // don't wait for Cache thread to load the data for that server. | 986 // don't wait for Cache thread to load the data for that server. |
992 load_from_disk_cache = false; | 987 load_from_disk_cache = false; |
993 } | 988 } |
994 if (load_from_disk_cache && CryptoConfigCacheIsEmpty(server_id)) | 989 if (load_from_disk_cache && CryptoConfigCacheIsEmpty(server_id)) |
995 quic_server_info = quic_server_info_factory_->GetForServer(server_id); | 990 quic_server_info = quic_server_info_factory_->GetForServer(server_id); |
996 } | 991 } |
997 | 992 |
998 ignore_result(StartCertVerifyJob(server_id, cert_verify_flags, net_log)); | 993 ignore_result(StartCertVerifyJob(server_id, cert_verify_flags, net_log)); |
999 | 994 |
1000 QuicSessionKey key(destination, server_id); | 995 QuicSessionKey key(destination, server_id); |
1001 std::unique_ptr<Job> job( | 996 std::unique_ptr<Job> job = base::MakeUnique<Job>( |
1002 new Job(this, host_resolver_, key, WasQuicRecentlyBroken(server_id), | 997 this, host_resolver_, key, WasQuicRecentlyBroken(server_id), |
1003 cert_verify_flags, quic_server_info, net_log)); | 998 cert_verify_flags, quic_server_info, net_log); |
1004 int rv = job->Run(base::Bind(&QuicStreamFactory::OnJobComplete, | 999 int rv = job->Run(base::Bind(&QuicStreamFactory::OnJobComplete, |
1005 base::Unretained(this), job.get())); | 1000 base::Unretained(this), job.get())); |
1006 if (rv == ERR_IO_PENDING) { | 1001 if (rv == ERR_IO_PENDING) { |
1007 active_requests_[request] = server_id; | 1002 active_requests_[request] = server_id; |
1008 job_requests_map_[server_id].insert(request); | 1003 job_requests_map_[server_id].insert(request); |
1009 active_jobs_[server_id].insert(job.release()); | 1004 Job* job_ptr = job.get(); |
| 1005 active_jobs_[server_id][job_ptr] = std::move(job); |
1010 return rv; | 1006 return rv; |
1011 } | 1007 } |
1012 if (rv == OK) { | 1008 if (rv == OK) { |
1013 // TODO(rtenneti): crbug.com/498823 - revert active_sessions_.empty() | 1009 // TODO(rtenneti): crbug.com/498823 - revert active_sessions_.empty() |
1014 // related changes. | 1010 // related changes. |
1015 if (active_sessions_.empty()) | 1011 if (active_sessions_.empty()) |
1016 return ERR_QUIC_PROTOCOL_ERROR; | 1012 return ERR_QUIC_PROTOCOL_ERROR; |
1017 SessionMap::iterator it = active_sessions_.find(server_id); | 1013 SessionMap::iterator it = active_sessions_.find(server_id); |
1018 DCHECK(it != active_sessions_.end()); | 1014 DCHECK(it != active_sessions_.end()); |
1019 if (it == active_sessions_.end()) | 1015 if (it == active_sessions_.end()) |
(...skipping 20 matching lines...) Expand all Loading... |
1040 return destination_.Equals(other.destination_) && | 1036 return destination_.Equals(other.destination_) && |
1041 server_id_ == other.server_id_; | 1037 server_id_ == other.server_id_; |
1042 } | 1038 } |
1043 | 1039 |
1044 void QuicStreamFactory::CreateAuxilaryJob(const QuicSessionKey& key, | 1040 void QuicStreamFactory::CreateAuxilaryJob(const QuicSessionKey& key, |
1045 int cert_verify_flags, | 1041 int cert_verify_flags, |
1046 const NetLogWithSource& net_log) { | 1042 const NetLogWithSource& net_log) { |
1047 Job* aux_job = | 1043 Job* aux_job = |
1048 new Job(this, host_resolver_, key, WasQuicRecentlyBroken(key.server_id()), | 1044 new Job(this, host_resolver_, key, WasQuicRecentlyBroken(key.server_id()), |
1049 cert_verify_flags, nullptr, net_log); | 1045 cert_verify_flags, nullptr, net_log); |
1050 active_jobs_[key.server_id()].insert(aux_job); | 1046 active_jobs_[key.server_id()][aux_job] = base::WrapUnique(aux_job); |
1051 task_runner_->PostTask(FROM_HERE, | 1047 task_runner_->PostTask(FROM_HERE, |
1052 base::Bind(&QuicStreamFactory::Job::RunAuxilaryJob, | 1048 base::Bind(&QuicStreamFactory::Job::RunAuxilaryJob, |
1053 aux_job->GetWeakPtr())); | 1049 aux_job->GetWeakPtr())); |
1054 } | 1050 } |
1055 | 1051 |
1056 bool QuicStreamFactory::OnResolution(const QuicSessionKey& key, | 1052 bool QuicStreamFactory::OnResolution(const QuicSessionKey& key, |
1057 const AddressList& address_list) { | 1053 const AddressList& address_list) { |
1058 const QuicServerId& server_id(key.server_id()); | 1054 const QuicServerId& server_id(key.server_id()); |
1059 DCHECK(!HasActiveSession(server_id)); | 1055 DCHECK(!HasActiveSession(server_id)); |
1060 if (disable_connection_pooling_) | 1056 if (disable_connection_pooling_) |
(...skipping 18 matching lines...) Expand all Loading... |
1079 // Copy |server_id|, because |job| might be destroyed before this method | 1075 // Copy |server_id|, because |job| might be destroyed before this method |
1080 // returns. | 1076 // returns. |
1081 const QuicServerId server_id(job->key().server_id()); | 1077 const QuicServerId server_id(job->key().server_id()); |
1082 if (rv != OK) { | 1078 if (rv != OK) { |
1083 JobSet* jobs = &(active_jobs_[server_id]); | 1079 JobSet* jobs = &(active_jobs_[server_id]); |
1084 if (jobs->size() > 1) { | 1080 if (jobs->size() > 1) { |
1085 // If there is another pending job, then we can delete this job and let | 1081 // If there is another pending job, then we can delete this job and let |
1086 // the other job handle the request. | 1082 // the other job handle the request. |
1087 job->Cancel(); | 1083 job->Cancel(); |
1088 jobs->erase(job); | 1084 jobs->erase(job); |
1089 delete job; | |
1090 return; | 1085 return; |
1091 } | 1086 } |
1092 } | 1087 } |
1093 | 1088 |
1094 if (rv == OK) { | 1089 if (rv == OK) { |
1095 if (!always_require_handshake_confirmation_) | 1090 if (!always_require_handshake_confirmation_) |
1096 set_require_confirmation(false); | 1091 set_require_confirmation(false); |
1097 | 1092 |
1098 if (!job_requests_map_[server_id].empty()) { | 1093 if (!job_requests_map_[server_id].empty()) { |
1099 SessionMap::iterator session_it = active_sessions_.find(server_id); | 1094 SessionMap::iterator session_it = active_sessions_.find(server_id); |
(...skipping 11 matching lines...) Expand all Loading... |
1111 RequestSet::iterator it = job_requests_map_[server_id].begin(); | 1106 RequestSet::iterator it = job_requests_map_[server_id].begin(); |
1112 QuicStreamRequest* request = *it; | 1107 QuicStreamRequest* request = *it; |
1113 job_requests_map_[server_id].erase(it); | 1108 job_requests_map_[server_id].erase(it); |
1114 active_requests_.erase(request); | 1109 active_requests_.erase(request); |
1115 // Even though we're invoking callbacks here, we don't need to worry | 1110 // Even though we're invoking callbacks here, we don't need to worry |
1116 // about |this| being deleted, because the factory is owned by the | 1111 // about |this| being deleted, because the factory is owned by the |
1117 // profile which can not be deleted via callbacks. | 1112 // profile which can not be deleted via callbacks. |
1118 request->OnRequestComplete(rv); | 1113 request->OnRequestComplete(rv); |
1119 } | 1114 } |
1120 | 1115 |
1121 for (Job* other_job : active_jobs_[server_id]) { | 1116 for (auto& other_job : active_jobs_[server_id]) { |
1122 if (other_job != job) | 1117 if (other_job.first != job) |
1123 other_job->Cancel(); | 1118 other_job.first->Cancel(); |
1124 } | 1119 } |
1125 | 1120 |
1126 base::STLDeleteElements(&(active_jobs_[server_id])); | 1121 active_jobs_[server_id].clear(); |
1127 active_jobs_.erase(server_id); | 1122 active_jobs_.erase(server_id); |
1128 job_requests_map_.erase(server_id); | 1123 job_requests_map_.erase(server_id); |
1129 } | 1124 } |
1130 | 1125 |
1131 void QuicStreamFactory::OnCertVerifyJobComplete(CertVerifierJob* job, int rv) { | 1126 void QuicStreamFactory::OnCertVerifyJobComplete(CertVerifierJob* job, int rv) { |
1132 active_cert_verifier_jobs_.erase(job->server_id()); | 1127 active_cert_verifier_jobs_.erase(job->server_id()); |
1133 } | 1128 } |
1134 | 1129 |
1135 std::unique_ptr<QuicHttpStream> QuicStreamFactory::CreateFromSession( | 1130 std::unique_ptr<QuicHttpStream> QuicStreamFactory::CreateFromSession( |
1136 QuicChromiumClientSession* session) { | 1131 QuicChromiumClientSession* session) { |
(...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1903 void QuicStreamFactory::OpenFactory() { | 1898 void QuicStreamFactory::OpenFactory() { |
1904 status_ = OPEN; | 1899 status_ = OPEN; |
1905 } | 1900 } |
1906 | 1901 |
1907 void QuicStreamFactory::MaybeClearConsecutiveDisabledCount() { | 1902 void QuicStreamFactory::MaybeClearConsecutiveDisabledCount() { |
1908 if (status_ == OPEN) | 1903 if (status_ == OPEN) |
1909 consecutive_disabled_count_ = 0; | 1904 consecutive_disabled_count_ = 0; |
1910 } | 1905 } |
1911 | 1906 |
1912 } // namespace net | 1907 } // namespace net |
OLD | NEW |