| OLD | NEW | 
|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/spdy/spdy_session_pool.h" | 5 #include "net/spdy/spdy_session_pool.h" | 
| 6 | 6 | 
| 7 #include "base/logging.h" | 7 #include "base/logging.h" | 
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" | 
| 9 #include "base/values.h" | 9 #include "base/values.h" | 
| 10 #include "net/base/address_list.h" | 10 #include "net/base/address_list.h" | 
| 11 #include "net/base/sys_addrinfo.h" | 11 #include "net/base/sys_addrinfo.h" | 
| 12 #include "net/http/http_network_session.h" | 12 #include "net/http/http_network_session.h" | 
|  | 13 #include "net/http/http_server_properties.h" | 
| 13 #include "net/spdy/spdy_session.h" | 14 #include "net/spdy/spdy_session.h" | 
| 14 | 15 | 
| 15 | 16 | 
| 16 namespace net { | 17 namespace net { | 
| 17 | 18 | 
| 18 namespace { | 19 namespace { | 
| 19 | 20 | 
| 20 enum SpdySessionGetTypes { | 21 enum SpdySessionGetTypes { | 
| 21   CREATED_NEW                 = 0, | 22   CREATED_NEW                 = 0, | 
| 22   FOUND_EXISTING              = 1, | 23   FOUND_EXISTING              = 1, | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 33 } | 34 } | 
| 34 | 35 | 
| 35 // The maximum number of sessions to open to a single domain. | 36 // The maximum number of sessions to open to a single domain. | 
| 36 static const size_t kMaxSessionsPerDomain = 1; | 37 static const size_t kMaxSessionsPerDomain = 1; | 
| 37 | 38 | 
| 38 size_t SpdySessionPool::g_max_sessions_per_domain = kMaxSessionsPerDomain; | 39 size_t SpdySessionPool::g_max_sessions_per_domain = kMaxSessionsPerDomain; | 
| 39 bool SpdySessionPool::g_force_single_domain = false; | 40 bool SpdySessionPool::g_force_single_domain = false; | 
| 40 bool SpdySessionPool::g_enable_ip_pooling = true; | 41 bool SpdySessionPool::g_enable_ip_pooling = true; | 
| 41 | 42 | 
| 42 SpdySessionPool::SpdySessionPool(HostResolver* resolver, | 43 SpdySessionPool::SpdySessionPool(HostResolver* resolver, | 
| 43                                  SSLConfigService* ssl_config_service) | 44                                  SSLConfigService* ssl_config_service, | 
| 44     : ssl_config_service_(ssl_config_service), | 45                                  HttpServerProperties* http_server_properties) | 
|  | 46     : http_server_properties_(http_server_properties), | 
|  | 47       ssl_config_service_(ssl_config_service), | 
| 45       resolver_(resolver), | 48       resolver_(resolver), | 
| 46       verify_domain_authentication_(true) { | 49       verify_domain_authentication_(true) { | 
| 47   NetworkChangeNotifier::AddIPAddressObserver(this); | 50   NetworkChangeNotifier::AddIPAddressObserver(this); | 
| 48   if (ssl_config_service_) | 51   if (ssl_config_service_) | 
| 49     ssl_config_service_->AddObserver(this); | 52     ssl_config_service_->AddObserver(this); | 
| 50   CertDatabase::AddObserver(this); | 53   CertDatabase::AddObserver(this); | 
| 51 } | 54 } | 
| 52 | 55 | 
| 53 SpdySessionPool::~SpdySessionPool() { | 56 SpdySessionPool::~SpdySessionPool() { | 
| 54   CloseAllSessions(); | 57   CloseAllSessions(); | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 103     spdy_session = GetExistingSession(list, net_log); | 106     spdy_session = GetExistingSession(list, net_log); | 
| 104     net_log.AddEvent( | 107     net_log.AddEvent( | 
| 105       NetLog::TYPE_SPDY_SESSION_POOL_FOUND_EXISTING_SESSION, | 108       NetLog::TYPE_SPDY_SESSION_POOL_FOUND_EXISTING_SESSION, | 
| 106       make_scoped_refptr(new NetLogSourceParameter( | 109       make_scoped_refptr(new NetLogSourceParameter( | 
| 107           "session", spdy_session->net_log().source()))); | 110           "session", spdy_session->net_log().source()))); | 
| 108     return spdy_session; | 111     return spdy_session; | 
| 109   } | 112   } | 
| 110 | 113 | 
| 111   DCHECK(!only_use_existing_sessions); | 114   DCHECK(!only_use_existing_sessions); | 
| 112 | 115 | 
| 113   spdy_session = new SpdySession(host_port_proxy_pair, this, &spdy_settings_, | 116   spdy_session = new SpdySession(host_port_proxy_pair, this, | 
|  | 117                                  http_server_properties_, | 
| 114                                  verify_domain_authentication_, | 118                                  verify_domain_authentication_, | 
| 115                                  net_log.net_log()); | 119                                  net_log.net_log()); | 
| 116   UMA_HISTOGRAM_ENUMERATION("Net.SpdySessionGet", | 120   UMA_HISTOGRAM_ENUMERATION("Net.SpdySessionGet", | 
| 117                             CREATED_NEW, | 121                             CREATED_NEW, | 
| 118                             SPDY_SESSION_GET_MAX); | 122                             SPDY_SESSION_GET_MAX); | 
| 119   list->push_back(spdy_session); | 123   list->push_back(spdy_session); | 
| 120   net_log.AddEvent( | 124   net_log.AddEvent( | 
| 121       NetLog::TYPE_SPDY_SESSION_POOL_CREATED_NEW_SESSION, | 125       NetLog::TYPE_SPDY_SESSION_POOL_CREATED_NEW_SESSION, | 
| 122       make_scoped_refptr(new NetLogSourceParameter( | 126       make_scoped_refptr(new NetLogSourceParameter( | 
| 123           "session", spdy_session->net_log().source()))); | 127           "session", spdy_session->net_log().source()))); | 
| 124   DCHECK_LE(list->size(), g_max_sessions_per_domain); | 128   DCHECK_LE(list->size(), g_max_sessions_per_domain); | 
| 125   return spdy_session; | 129   return spdy_session; | 
| 126 } | 130 } | 
| 127 | 131 | 
| 128 net::Error SpdySessionPool::GetSpdySessionFromSocket( | 132 net::Error SpdySessionPool::GetSpdySessionFromSocket( | 
| 129     const HostPortProxyPair& host_port_proxy_pair, | 133     const HostPortProxyPair& host_port_proxy_pair, | 
| 130     ClientSocketHandle* connection, | 134     ClientSocketHandle* connection, | 
| 131     const BoundNetLog& net_log, | 135     const BoundNetLog& net_log, | 
| 132     int certificate_error_code, | 136     int certificate_error_code, | 
| 133     scoped_refptr<SpdySession>* spdy_session, | 137     scoped_refptr<SpdySession>* spdy_session, | 
| 134     bool is_secure) { | 138     bool is_secure) { | 
| 135   UMA_HISTOGRAM_ENUMERATION("Net.SpdySessionGet", | 139   UMA_HISTOGRAM_ENUMERATION("Net.SpdySessionGet", | 
| 136                             IMPORTED_FROM_SOCKET, | 140                             IMPORTED_FROM_SOCKET, | 
| 137                             SPDY_SESSION_GET_MAX); | 141                             SPDY_SESSION_GET_MAX); | 
| 138   // Create the SPDY session and add it to the pool. | 142   // Create the SPDY session and add it to the pool. | 
| 139   *spdy_session = new SpdySession(host_port_proxy_pair, this, &spdy_settings_, | 143   *spdy_session = new SpdySession(host_port_proxy_pair, this, | 
|  | 144                                   http_server_properties_, | 
| 140                                   verify_domain_authentication_, | 145                                   verify_domain_authentication_, | 
| 141                                   net_log.net_log()); | 146                                   net_log.net_log()); | 
| 142   SpdySessionList* list = GetSessionList(host_port_proxy_pair); | 147   SpdySessionList* list = GetSessionList(host_port_proxy_pair); | 
| 143   if (!list) | 148   if (!list) | 
| 144     list = AddSessionList(host_port_proxy_pair); | 149     list = AddSessionList(host_port_proxy_pair); | 
| 145   DCHECK(list->empty()); | 150   DCHECK(list->empty()); | 
| 146   list->push_back(*spdy_session); | 151   list->push_back(*spdy_session); | 
| 147 | 152 | 
| 148   net_log.AddEvent( | 153   net_log.AddEvent( | 
| 149       NetLog::TYPE_SPDY_SESSION_POOL_IMPORTED_SESSION_FROM_SOCKET, | 154       NetLog::TYPE_SPDY_SESSION_POOL_IMPORTED_SESSION_FROM_SOCKET, | 
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 200     for (SpdySessionList::const_iterator session = sessions->begin(); | 205     for (SpdySessionList::const_iterator session = sessions->begin(); | 
| 201          session != sessions->end(); ++session) { | 206          session != sessions->end(); ++session) { | 
| 202       list->Append(session->get()->GetInfoAsValue()); | 207       list->Append(session->get()->GetInfoAsValue()); | 
| 203     } | 208     } | 
| 204   } | 209   } | 
| 205   return list; | 210   return list; | 
| 206 } | 211 } | 
| 207 | 212 | 
| 208 void SpdySessionPool::OnIPAddressChanged() { | 213 void SpdySessionPool::OnIPAddressChanged() { | 
| 209   CloseCurrentSessions(); | 214   CloseCurrentSessions(); | 
| 210   spdy_settings_.Clear(); | 215   http_server_properties_->ClearSpdySettings(); | 
| 211 } | 216 } | 
| 212 | 217 | 
| 213 void SpdySessionPool::OnSSLConfigChanged() { | 218 void SpdySessionPool::OnSSLConfigChanged() { | 
| 214   CloseCurrentSessions(); | 219   CloseCurrentSessions(); | 
| 215 } | 220 } | 
| 216 | 221 | 
| 217 scoped_refptr<SpdySession> SpdySessionPool::GetExistingSession( | 222 scoped_refptr<SpdySession> SpdySessionPool::GetExistingSession( | 
| 218     SpdySessionList* list, | 223     SpdySessionList* list, | 
| 219     const BoundNetLog& net_log) const { | 224     const BoundNetLog& net_log) const { | 
| 220   DCHECK(list); | 225   DCHECK(list); | 
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 423     // Assumes there is only 1 element in the list | 428     // Assumes there is only 1 element in the list | 
| 424     SpdySessionList::iterator session_it = list->begin(); | 429     SpdySessionList::iterator session_it = list->begin(); | 
| 425     const scoped_refptr<SpdySession>& session = *session_it; | 430     const scoped_refptr<SpdySession>& session = *session_it; | 
| 426     CHECK(session); | 431     CHECK(session); | 
| 427     if (!session->is_active()) | 432     if (!session->is_active()) | 
| 428       session->CloseSessionOnError(net::ERR_ABORTED, true); | 433       session->CloseSessionOnError(net::ERR_ABORTED, true); | 
| 429   } | 434   } | 
| 430 } | 435 } | 
| 431 | 436 | 
| 432 }  // namespace net | 437 }  // namespace net | 
| OLD | NEW | 
|---|