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 3 // found in the LICENSE file. 4 // 5 // ClientSocketPoolManager manages access to all ClientSocketPools. It's a 6 // simple container for all of them. Most importantly, it handles the lifetime 7 // and destruction order properly. 8 9 #ifndef NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_H_ 10 #define NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_H_ 11 12 #include "net/base/completion_callback.h" 13 #include "net/base/net_export.h" 14 #include "net/base/request_priority.h" 15 #include "net/http/http_network_session.h" 16 17 class GURL; 18 19 namespace base { 20 class Value; 21 } 22 23 namespace net { 24 25 typedef base::Callback<int(const AddressList&, const BoundNetLog& net_log)> 26 OnHostResolutionCallback; 27 28 class BoundNetLog; 29 class ClientSocketHandle; 30 class HostPortPair; 31 class HttpNetworkSession; 32 class HttpProxyClientSocketPool; 33 class HttpRequestHeaders; 34 class ProxyInfo; 35 class TransportClientSocketPool; 36 class SOCKSClientSocketPool; 37 class SSLClientSocketPool; 38 39 struct SSLConfig; 40 41 // This should rather be a simple constant but Windows shared libs doesn't 42 // really offer much flexiblity in exporting contants. 43 enum DefaultMaxValues { kDefaultMaxSocketsPerProxyServer = 32 }; 44 45 class NET_EXPORT_PRIVATE ClientSocketPoolManager { 46 public: 47 ClientSocketPoolManager(); 48 virtual ~ClientSocketPoolManager(); 49 50 // The setter methods below affect only newly created socket pools after the 51 // methods are called. Normally they should be called at program startup 52 // before any ClientSocketPoolManagerImpl is created. 53 static int max_sockets_per_pool(HttpNetworkSession::SocketPoolType pool_type); 54 static void set_max_sockets_per_pool( 55 HttpNetworkSession::SocketPoolType pool_type, 56 int socket_count); 57 58 static int max_sockets_per_group( 59 HttpNetworkSession::SocketPoolType pool_type); 60 static void set_max_sockets_per_group( 61 HttpNetworkSession::SocketPoolType pool_type, 62 int socket_count); 63 64 static int max_sockets_per_proxy_server( 65 HttpNetworkSession::SocketPoolType pool_type); 66 static void set_max_sockets_per_proxy_server( 67 HttpNetworkSession::SocketPoolType pool_type, 68 int socket_count); 69 70 virtual void FlushSocketPoolsWithError(int error) = 0; 71 virtual void CloseIdleSockets() = 0; 72 virtual TransportClientSocketPool* GetTransportSocketPool() = 0; 73 virtual SSLClientSocketPool* GetSSLSocketPool() = 0; 74 virtual SOCKSClientSocketPool* GetSocketPoolForSOCKSProxy( 75 const HostPortPair& socks_proxy) = 0; 76 virtual HttpProxyClientSocketPool* GetSocketPoolForHTTPProxy( 77 const HostPortPair& http_proxy) = 0; 78 virtual SSLClientSocketPool* GetSocketPoolForSSLWithProxy( 79 const HostPortPair& proxy_server) = 0; 80 // Creates a Value summary of the state of the socket pools. The caller is 81 // responsible for deleting the returned value. 82 virtual base::Value* SocketPoolInfoToValue() const = 0; 83 }; 84 85 // A helper method that uses the passed in proxy information to initialize a 86 // ClientSocketHandle with the relevant socket pool. Use this method for 87 // HTTP/HTTPS requests. |ssl_config_for_origin| is only used if the request 88 // uses SSL and |ssl_config_for_proxy| is used if the proxy server is HTTPS. 89 // |resolution_callback| will be invoked after the the hostname is 90 // resolved. If |resolution_callback| does not return OK, then the 91 // connection will be aborted with that value. 92 int InitSocketHandleForHttpRequest( 93 const GURL& request_url, 94 const HttpRequestHeaders& request_extra_headers, 95 int request_load_flags, 96 RequestPriority request_priority, 97 HttpNetworkSession* session, 98 const ProxyInfo& proxy_info, 99 bool force_spdy_over_ssl, 100 bool want_spdy_over_npn, 101 const SSLConfig& ssl_config_for_origin, 102 const SSLConfig& ssl_config_for_proxy, 103 PrivacyMode privacy_mode, 104 const BoundNetLog& net_log, 105 ClientSocketHandle* socket_handle, 106 const OnHostResolutionCallback& resolution_callback, 107 const CompletionCallback& callback); 108 109 // A helper method that uses the passed in proxy information to initialize a 110 // ClientSocketHandle with the relevant socket pool. Use this method for 111 // HTTP/HTTPS requests for WebSocket handshake. 112 // |ssl_config_for_origin| is only used if the request 113 // uses SSL and |ssl_config_for_proxy| is used if the proxy server is HTTPS. 114 // |resolution_callback| will be invoked after the the hostname is 115 // resolved. If |resolution_callback| does not return OK, then the 116 // connection will be aborted with that value. 117 // This function uses WEBSOCKET_SOCKET_POOL socket pools. 118 int InitSocketHandleForWebSocketRequest( 119 const GURL& request_url, 120 const HttpRequestHeaders& request_extra_headers, 121 int request_load_flags, 122 RequestPriority request_priority, 123 HttpNetworkSession* session, 124 const ProxyInfo& proxy_info, 125 bool force_spdy_over_ssl, 126 bool want_spdy_over_npn, 127 const SSLConfig& ssl_config_for_origin, 128 const SSLConfig& ssl_config_for_proxy, 129 PrivacyMode privacy_mode, 130 const BoundNetLog& net_log, 131 ClientSocketHandle* socket_handle, 132 const OnHostResolutionCallback& resolution_callback, 133 const CompletionCallback& callback); 134 135 // A helper method that uses the passed in proxy information to initialize a 136 // ClientSocketHandle with the relevant socket pool. Use this method for 137 // a raw socket connection to a host-port pair (that needs to tunnel through 138 // the proxies). 139 NET_EXPORT int InitSocketHandleForRawConnect( 140 const HostPortPair& host_port_pair, 141 HttpNetworkSession* session, 142 const ProxyInfo& proxy_info, 143 const SSLConfig& ssl_config_for_origin, 144 const SSLConfig& ssl_config_for_proxy, 145 PrivacyMode privacy_mode, 146 const BoundNetLog& net_log, 147 ClientSocketHandle* socket_handle, 148 const CompletionCallback& callback); 149 150 // A helper method that uses the passed in proxy information to initialize a 151 // ClientSocketHandle with the relevant socket pool. Use this method for 152 // a raw socket connection with TLS negotiation to a host-port pair (that needs 153 // to tunnel through the proxies). 154 NET_EXPORT int InitSocketHandleForTlsConnect( 155 const HostPortPair& host_port_pair, 156 HttpNetworkSession* session, 157 const ProxyInfo& proxy_info, 158 const SSLConfig& ssl_config_for_origin, 159 const SSLConfig& ssl_config_for_proxy, 160 PrivacyMode privacy_mode, 161 const BoundNetLog& net_log, 162 ClientSocketHandle* socket_handle, 163 const CompletionCallback& callback); 164 165 // Similar to InitSocketHandleForHttpRequest except that it initiates the 166 // desired number of preconnect streams from the relevant socket pool. 167 int PreconnectSocketsForHttpRequest( 168 const GURL& request_url, 169 const HttpRequestHeaders& request_extra_headers, 170 int request_load_flags, 171 RequestPriority request_priority, 172 HttpNetworkSession* session, 173 const ProxyInfo& proxy_info, 174 bool force_spdy_over_ssl, 175 bool want_spdy_over_npn, 176 const SSLConfig& ssl_config_for_origin, 177 const SSLConfig& ssl_config_for_proxy, 178 PrivacyMode privacy_mode, 179 const BoundNetLog& net_log, 180 int num_preconnect_streams); 181 182 } // namespace net 183 184 #endif // NET_SOCKET_CLIENT_SOCKET_POOL_MANAGER_H_ 185