1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_SOCKET_CLIENT_SOCKET_POOL_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_CLIENT_SOCKET_POOL_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <optional> 10*6777b538SAndroid Build Coastguard Worker #include <string> 11*6777b538SAndroid Build Coastguard Worker #include <vector> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/values.h" 17*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 18*6777b538SAndroid Build Coastguard Worker #include "net/base/load_states.h" 19*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 20*6777b538SAndroid Build Coastguard Worker #include "net/base/network_anonymization_key.h" 21*6777b538SAndroid Build Coastguard Worker #include "net/base/privacy_mode.h" 22*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h" 23*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_resolver.h" 24*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/secure_dns_policy.h" 25*6777b538SAndroid Build Coastguard Worker #include "net/http/http_request_info.h" 26*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_capture_mode.h" 27*6777b538SAndroid Build Coastguard Worker #include "net/socket/connect_job.h" 28*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_tag.h" 29*6777b538SAndroid Build Coastguard Worker #include "net/ssl/ssl_config.h" 30*6777b538SAndroid Build Coastguard Worker #include "url/scheme_host_port.h" 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker namespace net { 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker class ClientSocketHandle; 35*6777b538SAndroid Build Coastguard Worker class ConnectJobFactory; 36*6777b538SAndroid Build Coastguard Worker class HttpAuthController; 37*6777b538SAndroid Build Coastguard Worker class HttpResponseInfo; 38*6777b538SAndroid Build Coastguard Worker class NetLogWithSource; 39*6777b538SAndroid Build Coastguard Worker struct NetworkTrafficAnnotationTag; 40*6777b538SAndroid Build Coastguard Worker class ProxyChain; 41*6777b538SAndroid Build Coastguard Worker struct SSLConfig; 42*6777b538SAndroid Build Coastguard Worker class StreamSocket; 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker // ClientSocketPools are layered. This defines an interface for lower level 45*6777b538SAndroid Build Coastguard Worker // socket pools to communicate with higher layer pools. 46*6777b538SAndroid Build Coastguard Worker class NET_EXPORT HigherLayeredPool { 47*6777b538SAndroid Build Coastguard Worker public: 48*6777b538SAndroid Build Coastguard Worker virtual ~HigherLayeredPool() = default; 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker // Instructs the HigherLayeredPool to close an idle connection. Return true if 51*6777b538SAndroid Build Coastguard Worker // one was closed. Closing an idle connection will call into the lower layer 52*6777b538SAndroid Build Coastguard Worker // pool it came from, so must be careful of re-entrancy when using this. 53*6777b538SAndroid Build Coastguard Worker virtual bool CloseOneIdleConnection() = 0; 54*6777b538SAndroid Build Coastguard Worker }; 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker // ClientSocketPools are layered. This defines an interface for higher level 57*6777b538SAndroid Build Coastguard Worker // socket pools to communicate with lower layer pools. 58*6777b538SAndroid Build Coastguard Worker class NET_EXPORT LowerLayeredPool { 59*6777b538SAndroid Build Coastguard Worker public: 60*6777b538SAndroid Build Coastguard Worker virtual ~LowerLayeredPool() = default; 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker // Returns true if a there is currently a request blocked on the per-pool 63*6777b538SAndroid Build Coastguard Worker // (not per-host) max socket limit, either in this pool, or one that it is 64*6777b538SAndroid Build Coastguard Worker // layered on top of. 65*6777b538SAndroid Build Coastguard Worker virtual bool IsStalled() const = 0; 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker // Called to add or remove a higher layer pool on top of |this|. A higher 68*6777b538SAndroid Build Coastguard Worker // layer pool may be added at most once to |this|, and must be removed prior 69*6777b538SAndroid Build Coastguard Worker // to destruction of |this|. 70*6777b538SAndroid Build Coastguard Worker virtual void AddHigherLayeredPool(HigherLayeredPool* higher_pool) = 0; 71*6777b538SAndroid Build Coastguard Worker virtual void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) = 0; 72*6777b538SAndroid Build Coastguard Worker }; 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker // A ClientSocketPool is used to restrict the number of sockets open at a time. 75*6777b538SAndroid Build Coastguard Worker // It also maintains a list of idle persistent sockets. 76*6777b538SAndroid Build Coastguard Worker // 77*6777b538SAndroid Build Coastguard Worker // Subclasses must also have an inner class SocketParams which is 78*6777b538SAndroid Build Coastguard Worker // the type for the |params| argument in RequestSocket() and 79*6777b538SAndroid Build Coastguard Worker // RequestSockets() below. 80*6777b538SAndroid Build Coastguard Worker class NET_EXPORT ClientSocketPool : public LowerLayeredPool { 81*6777b538SAndroid Build Coastguard Worker public: 82*6777b538SAndroid Build Coastguard Worker // Indicates whether or not a request for a socket should respect the 83*6777b538SAndroid Build Coastguard Worker // SocketPool's global and per-group socket limits. 84*6777b538SAndroid Build Coastguard Worker enum class RespectLimits { DISABLED, ENABLED }; 85*6777b538SAndroid Build Coastguard Worker 86*6777b538SAndroid Build Coastguard Worker // ProxyAuthCallback is invoked when there is an auth challenge while 87*6777b538SAndroid Build Coastguard Worker // connecting to a tunnel. When |restart_with_auth_callback| is invoked, the 88*6777b538SAndroid Build Coastguard Worker // corresponding socket request is guaranteed not to be completed 89*6777b538SAndroid Build Coastguard Worker // synchronously, nor will the ProxyAuthCallback be invoked against 90*6777b538SAndroid Build Coastguard Worker // synchronously. 91*6777b538SAndroid Build Coastguard Worker typedef base::RepeatingCallback<void( 92*6777b538SAndroid Build Coastguard Worker const HttpResponseInfo& response, 93*6777b538SAndroid Build Coastguard Worker HttpAuthController* auth_controller, 94*6777b538SAndroid Build Coastguard Worker base::OnceClosure restart_with_auth_callback)> 95*6777b538SAndroid Build Coastguard Worker ProxyAuthCallback; 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Worker // Group ID for a socket request. Requests with the same group ID are 98*6777b538SAndroid Build Coastguard Worker // considered indistinguishable. 99*6777b538SAndroid Build Coastguard Worker class NET_EXPORT GroupId { 100*6777b538SAndroid Build Coastguard Worker public: 101*6777b538SAndroid Build Coastguard Worker GroupId(); 102*6777b538SAndroid Build Coastguard Worker GroupId(url::SchemeHostPort destination, 103*6777b538SAndroid Build Coastguard Worker PrivacyMode privacy_mode, 104*6777b538SAndroid Build Coastguard Worker NetworkAnonymizationKey network_anonymization_key, 105*6777b538SAndroid Build Coastguard Worker SecureDnsPolicy secure_dns_policy, 106*6777b538SAndroid Build Coastguard Worker bool disable_cert_network_fetches); 107*6777b538SAndroid Build Coastguard Worker GroupId(const GroupId& group_id); 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker ~GroupId(); 110*6777b538SAndroid Build Coastguard Worker 111*6777b538SAndroid Build Coastguard Worker GroupId& operator=(const GroupId& group_id); 112*6777b538SAndroid Build Coastguard Worker GroupId& operator=(GroupId&& group_id); 113*6777b538SAndroid Build Coastguard Worker destination()114*6777b538SAndroid Build Coastguard Worker const url::SchemeHostPort& destination() const { return destination_; } 115*6777b538SAndroid Build Coastguard Worker privacy_mode()116*6777b538SAndroid Build Coastguard Worker PrivacyMode privacy_mode() const { return privacy_mode_; } 117*6777b538SAndroid Build Coastguard Worker network_anonymization_key()118*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key() const { 119*6777b538SAndroid Build Coastguard Worker return network_anonymization_key_; 120*6777b538SAndroid Build Coastguard Worker } 121*6777b538SAndroid Build Coastguard Worker secure_dns_policy()122*6777b538SAndroid Build Coastguard Worker SecureDnsPolicy secure_dns_policy() const { return secure_dns_policy_; } 123*6777b538SAndroid Build Coastguard Worker disable_cert_network_fetches()124*6777b538SAndroid Build Coastguard Worker bool disable_cert_network_fetches() const { 125*6777b538SAndroid Build Coastguard Worker return disable_cert_network_fetches_; 126*6777b538SAndroid Build Coastguard Worker } 127*6777b538SAndroid Build Coastguard Worker 128*6777b538SAndroid Build Coastguard Worker // Returns the group ID as a string, for logging. 129*6777b538SAndroid Build Coastguard Worker std::string ToString() const; 130*6777b538SAndroid Build Coastguard Worker 131*6777b538SAndroid Build Coastguard Worker bool operator==(const GroupId& other) const { 132*6777b538SAndroid Build Coastguard Worker return std::tie(destination_, privacy_mode_, network_anonymization_key_, 133*6777b538SAndroid Build Coastguard Worker secure_dns_policy_, disable_cert_network_fetches_) == 134*6777b538SAndroid Build Coastguard Worker std::tie(other.destination_, other.privacy_mode_, 135*6777b538SAndroid Build Coastguard Worker other.network_anonymization_key_, 136*6777b538SAndroid Build Coastguard Worker other.secure_dns_policy_, 137*6777b538SAndroid Build Coastguard Worker other.disable_cert_network_fetches_); 138*6777b538SAndroid Build Coastguard Worker } 139*6777b538SAndroid Build Coastguard Worker 140*6777b538SAndroid Build Coastguard Worker bool operator<(const GroupId& other) const { 141*6777b538SAndroid Build Coastguard Worker return std::tie(destination_, privacy_mode_, network_anonymization_key_, 142*6777b538SAndroid Build Coastguard Worker secure_dns_policy_, disable_cert_network_fetches_) < 143*6777b538SAndroid Build Coastguard Worker std::tie(other.destination_, other.privacy_mode_, 144*6777b538SAndroid Build Coastguard Worker other.network_anonymization_key_, 145*6777b538SAndroid Build Coastguard Worker other.secure_dns_policy_, 146*6777b538SAndroid Build Coastguard Worker other.disable_cert_network_fetches_); 147*6777b538SAndroid Build Coastguard Worker } 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker private: 150*6777b538SAndroid Build Coastguard Worker // The endpoint of the final destination (not the proxy). 151*6777b538SAndroid Build Coastguard Worker url::SchemeHostPort destination_; 152*6777b538SAndroid Build Coastguard Worker 153*6777b538SAndroid Build Coastguard Worker // If this request is for a privacy mode / uncredentialed connection. 154*6777b538SAndroid Build Coastguard Worker PrivacyMode privacy_mode_; 155*6777b538SAndroid Build Coastguard Worker 156*6777b538SAndroid Build Coastguard Worker // Used to separate requests made in different contexts. 157*6777b538SAndroid Build Coastguard Worker NetworkAnonymizationKey network_anonymization_key_; 158*6777b538SAndroid Build Coastguard Worker 159*6777b538SAndroid Build Coastguard Worker // Controls the Secure DNS behavior to use when creating this socket. 160*6777b538SAndroid Build Coastguard Worker SecureDnsPolicy secure_dns_policy_; 161*6777b538SAndroid Build Coastguard Worker 162*6777b538SAndroid Build Coastguard Worker // Whether cert validation-related network fetches are allowed. Should only 163*6777b538SAndroid Build Coastguard Worker // be true for a very limited number of network-configuration related 164*6777b538SAndroid Build Coastguard Worker // scripts (e.g., PAC fetches). 165*6777b538SAndroid Build Coastguard Worker bool disable_cert_network_fetches_; 166*6777b538SAndroid Build Coastguard Worker }; 167*6777b538SAndroid Build Coastguard Worker 168*6777b538SAndroid Build Coastguard Worker // Parameters that, in combination with GroupId, proxy, websocket information, 169*6777b538SAndroid Build Coastguard Worker // and global state, are sufficient to create a ConnectJob. 170*6777b538SAndroid Build Coastguard Worker // 171*6777b538SAndroid Build Coastguard Worker // DO NOT ADD ANY FIELDS TO THIS CLASS. 172*6777b538SAndroid Build Coastguard Worker // 173*6777b538SAndroid Build Coastguard Worker // TODO(https://crbug.com/921369) In order to resolve longstanding issues 174*6777b538SAndroid Build Coastguard Worker // related to pooling distinguishable sockets together, remove this class 175*6777b538SAndroid Build Coastguard Worker // entirely. 176*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE SocketParams 177*6777b538SAndroid Build Coastguard Worker : public base::RefCounted<SocketParams> { 178*6777b538SAndroid Build Coastguard Worker public: 179*6777b538SAndroid Build Coastguard Worker // For non-SSL requests, `allowed_bad_certs` argument will be ignored (and 180*6777b538SAndroid Build Coastguard Worker // is likely empty, anyways). 181*6777b538SAndroid Build Coastguard Worker explicit SocketParams( 182*6777b538SAndroid Build Coastguard Worker const std::vector<SSLConfig::CertAndStatus>& allowed_bad_certs); 183*6777b538SAndroid Build Coastguard Worker 184*6777b538SAndroid Build Coastguard Worker SocketParams(const SocketParams&) = delete; 185*6777b538SAndroid Build Coastguard Worker SocketParams& operator=(const SocketParams&) = delete; 186*6777b538SAndroid Build Coastguard Worker 187*6777b538SAndroid Build Coastguard Worker // Creates a SocketParams object with none of the fields populated. This 188*6777b538SAndroid Build Coastguard Worker // works for the HTTP case only. 189*6777b538SAndroid Build Coastguard Worker static scoped_refptr<SocketParams> CreateForHttpForTesting(); 190*6777b538SAndroid Build Coastguard Worker allowed_bad_certs()191*6777b538SAndroid Build Coastguard Worker const std::vector<SSLConfig::CertAndStatus>& allowed_bad_certs() const { 192*6777b538SAndroid Build Coastguard Worker return allowed_bad_certs_; 193*6777b538SAndroid Build Coastguard Worker } 194*6777b538SAndroid Build Coastguard Worker 195*6777b538SAndroid Build Coastguard Worker private: 196*6777b538SAndroid Build Coastguard Worker friend class base::RefCounted<SocketParams>; 197*6777b538SAndroid Build Coastguard Worker ~SocketParams(); 198*6777b538SAndroid Build Coastguard Worker 199*6777b538SAndroid Build Coastguard Worker std::vector<SSLConfig::CertAndStatus> allowed_bad_certs_; 200*6777b538SAndroid Build Coastguard Worker }; 201*6777b538SAndroid Build Coastguard Worker 202*6777b538SAndroid Build Coastguard Worker ClientSocketPool(const ClientSocketPool&) = delete; 203*6777b538SAndroid Build Coastguard Worker ClientSocketPool& operator=(const ClientSocketPool&) = delete; 204*6777b538SAndroid Build Coastguard Worker 205*6777b538SAndroid Build Coastguard Worker ~ClientSocketPool() override; 206*6777b538SAndroid Build Coastguard Worker 207*6777b538SAndroid Build Coastguard Worker // Requests a connected socket with a specified GroupId. 208*6777b538SAndroid Build Coastguard Worker // 209*6777b538SAndroid Build Coastguard Worker // There are five possible results from calling this function: 210*6777b538SAndroid Build Coastguard Worker // 1) RequestSocket returns OK and initializes |handle| with a reused socket. 211*6777b538SAndroid Build Coastguard Worker // 2) RequestSocket returns OK with a newly connected socket. 212*6777b538SAndroid Build Coastguard Worker // 3) RequestSocket returns ERR_IO_PENDING. The handle will be added to a 213*6777b538SAndroid Build Coastguard Worker // wait list until a socket is available to reuse or a new socket finishes 214*6777b538SAndroid Build Coastguard Worker // connecting. |priority| will determine the placement into the wait list. 215*6777b538SAndroid Build Coastguard Worker // 4) An error occurred early on, so RequestSocket returns an error code. 216*6777b538SAndroid Build Coastguard Worker // 5) A recoverable error occurred while setting up the socket. An error 217*6777b538SAndroid Build Coastguard Worker // code is returned, but the |handle| is initialized with the new socket. 218*6777b538SAndroid Build Coastguard Worker // The caller must recover from the error before using the connection, or 219*6777b538SAndroid Build Coastguard Worker // Disconnect the socket before releasing or resetting the |handle|. 220*6777b538SAndroid Build Coastguard Worker // The current recoverable errors are: the errors accepted by 221*6777b538SAndroid Build Coastguard Worker // IsCertificateError(err) and HTTPS_PROXY_TUNNEL_RESPONSE when reported by 222*6777b538SAndroid Build Coastguard Worker // HttpProxyClientSocketPool. 223*6777b538SAndroid Build Coastguard Worker // 224*6777b538SAndroid Build Coastguard Worker // If this function returns OK, then |handle| is initialized upon return. 225*6777b538SAndroid Build Coastguard Worker // The |handle|'s is_initialized method will return true in this case. If a 226*6777b538SAndroid Build Coastguard Worker // StreamSocket was reused, then ClientSocketPool will call 227*6777b538SAndroid Build Coastguard Worker // |handle|->set_reused(true). In either case, the socket will have been 228*6777b538SAndroid Build Coastguard Worker // allocated and will be connected. A client might want to know whether or 229*6777b538SAndroid Build Coastguard Worker // not the socket is reused in order to request a new socket if it encounters 230*6777b538SAndroid Build Coastguard Worker // an error with the reused socket. 231*6777b538SAndroid Build Coastguard Worker // 232*6777b538SAndroid Build Coastguard Worker // If ERR_IO_PENDING is returned, then the callback will be used to notify the 233*6777b538SAndroid Build Coastguard Worker // client of completion. 234*6777b538SAndroid Build Coastguard Worker // 235*6777b538SAndroid Build Coastguard Worker // Profiling information for the request is saved to |net_log| if non-NULL. 236*6777b538SAndroid Build Coastguard Worker // 237*6777b538SAndroid Build Coastguard Worker // If |respect_limits| is DISABLED, priority must be HIGHEST. 238*6777b538SAndroid Build Coastguard Worker // 239*6777b538SAndroid Build Coastguard Worker // |proxy_annotation_tag| is the annotation used for proxy-related reads and 240*6777b538SAndroid Build Coastguard Worker // writes, and may be nullopt if (and only if) no proxy is in use. 241*6777b538SAndroid Build Coastguard Worker // 242*6777b538SAndroid Build Coastguard Worker // |proxy_auth_callback| will be invoked each time an auth challenge is seen 243*6777b538SAndroid Build Coastguard Worker // while establishing a tunnel. It will be invoked asynchronously, once for 244*6777b538SAndroid Build Coastguard Worker // each auth challenge seen. 245*6777b538SAndroid Build Coastguard Worker virtual int RequestSocket( 246*6777b538SAndroid Build Coastguard Worker const GroupId& group_id, 247*6777b538SAndroid Build Coastguard Worker scoped_refptr<SocketParams> params, 248*6777b538SAndroid Build Coastguard Worker const std::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag, 249*6777b538SAndroid Build Coastguard Worker RequestPriority priority, 250*6777b538SAndroid Build Coastguard Worker const SocketTag& socket_tag, 251*6777b538SAndroid Build Coastguard Worker RespectLimits respect_limits, 252*6777b538SAndroid Build Coastguard Worker ClientSocketHandle* handle, 253*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 254*6777b538SAndroid Build Coastguard Worker const ProxyAuthCallback& proxy_auth_callback, 255*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log) = 0; 256*6777b538SAndroid Build Coastguard Worker 257*6777b538SAndroid Build Coastguard Worker // RequestSockets is used to request that |num_sockets| be connected in the 258*6777b538SAndroid Build Coastguard Worker // connection group for |group_id|. If the connection group already has 259*6777b538SAndroid Build Coastguard Worker // |num_sockets| idle sockets / active sockets / currently connecting sockets, 260*6777b538SAndroid Build Coastguard Worker // then this function doesn't do anything and returns OK. Otherwise, it will 261*6777b538SAndroid Build Coastguard Worker // start up as many connections as necessary to reach |num_sockets| total 262*6777b538SAndroid Build Coastguard Worker // sockets for the group and returns ERR_IO_PENDING. And |callback| will be 263*6777b538SAndroid Build Coastguard Worker // called with OK when the connection tasks are finished. 264*6777b538SAndroid Build Coastguard Worker // It uses |params| to control how to connect the sockets. The 265*6777b538SAndroid Build Coastguard Worker // ClientSocketPool will assign a priority to the new connections, if any. 266*6777b538SAndroid Build Coastguard Worker // This priority will probably be lower than all others, since this method 267*6777b538SAndroid Build Coastguard Worker // is intended to make sure ahead of time that |num_sockets| sockets are 268*6777b538SAndroid Build Coastguard Worker // available to talk to a host. 269*6777b538SAndroid Build Coastguard Worker virtual int RequestSockets( 270*6777b538SAndroid Build Coastguard Worker const GroupId& group_id, 271*6777b538SAndroid Build Coastguard Worker scoped_refptr<SocketParams> params, 272*6777b538SAndroid Build Coastguard Worker const std::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag, 273*6777b538SAndroid Build Coastguard Worker int num_sockets, 274*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 275*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log) = 0; 276*6777b538SAndroid Build Coastguard Worker 277*6777b538SAndroid Build Coastguard Worker // Called to change the priority of a RequestSocket call that returned 278*6777b538SAndroid Build Coastguard Worker // ERR_IO_PENDING and has not yet asynchronously completed. The same handle 279*6777b538SAndroid Build Coastguard Worker // parameter must be passed to this method as was passed to the 280*6777b538SAndroid Build Coastguard Worker // RequestSocket call being modified. 281*6777b538SAndroid Build Coastguard Worker // This function is a no-op if |priority| is the same as the current 282*6777b538SAndroid Build Coastguard Worker // request priority. 283*6777b538SAndroid Build Coastguard Worker virtual void SetPriority(const GroupId& group_id, 284*6777b538SAndroid Build Coastguard Worker ClientSocketHandle* handle, 285*6777b538SAndroid Build Coastguard Worker RequestPriority priority) = 0; 286*6777b538SAndroid Build Coastguard Worker 287*6777b538SAndroid Build Coastguard Worker // Called to cancel a RequestSocket call that returned ERR_IO_PENDING. The 288*6777b538SAndroid Build Coastguard Worker // same handle parameter must be passed to this method as was passed to the 289*6777b538SAndroid Build Coastguard Worker // RequestSocket call being cancelled. The associated callback is not run. 290*6777b538SAndroid Build Coastguard Worker // If |cancel_connect_job| is true, and there are more ConnectJobs than 291*6777b538SAndroid Build Coastguard Worker // requests, a ConnectJob will be canceled. If it's false, excess ConnectJobs 292*6777b538SAndroid Build Coastguard Worker // may be allowed to continue, just in case there are new requests to the same 293*6777b538SAndroid Build Coastguard Worker // endpoint. 294*6777b538SAndroid Build Coastguard Worker virtual void CancelRequest(const GroupId& group_id, 295*6777b538SAndroid Build Coastguard Worker ClientSocketHandle* handle, 296*6777b538SAndroid Build Coastguard Worker bool cancel_connect_job) = 0; 297*6777b538SAndroid Build Coastguard Worker 298*6777b538SAndroid Build Coastguard Worker // Called to release a socket once the socket is no longer needed. If the 299*6777b538SAndroid Build Coastguard Worker // socket still has an established connection, then it will be added to the 300*6777b538SAndroid Build Coastguard Worker // set of idle sockets to be used to satisfy future RequestSocket calls. 301*6777b538SAndroid Build Coastguard Worker // Otherwise, the StreamSocket is destroyed. |generation| is used to 302*6777b538SAndroid Build Coastguard Worker // differentiate between updated versions of the same pool instance. The 303*6777b538SAndroid Build Coastguard Worker // pool's generation will change when it flushes, so it can use this 304*6777b538SAndroid Build Coastguard Worker // |generation| to discard sockets with mismatched ids. 305*6777b538SAndroid Build Coastguard Worker virtual void ReleaseSocket(const GroupId& group_id, 306*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StreamSocket> socket, 307*6777b538SAndroid Build Coastguard Worker int64_t generation) = 0; 308*6777b538SAndroid Build Coastguard Worker 309*6777b538SAndroid Build Coastguard Worker // This flushes all state from the ClientSocketPool. Pending socket requests 310*6777b538SAndroid Build Coastguard Worker // are failed with |error|, while |reason| is logged to the NetLog. 311*6777b538SAndroid Build Coastguard Worker // 312*6777b538SAndroid Build Coastguard Worker // Active sockets being held by ClientSocketPool clients will be discarded 313*6777b538SAndroid Build Coastguard Worker // when released back to the pool, though they will be closed with an error 314*6777b538SAndroid Build Coastguard Worker // about being of the wrong generation, rather than |net_log_reason_utf8|. 315*6777b538SAndroid Build Coastguard Worker virtual void FlushWithError(int error, const char* net_log_reason_utf8) = 0; 316*6777b538SAndroid Build Coastguard Worker 317*6777b538SAndroid Build Coastguard Worker // Called to close any idle connections held by the connection manager. 318*6777b538SAndroid Build Coastguard Worker // |reason| is logged to NetLog for debugging purposes. 319*6777b538SAndroid Build Coastguard Worker virtual void CloseIdleSockets(const char* net_log_reason_utf8) = 0; 320*6777b538SAndroid Build Coastguard Worker 321*6777b538SAndroid Build Coastguard Worker // Called to close any idle connections held by the connection manager. 322*6777b538SAndroid Build Coastguard Worker // |reason| is logged to NetLog for debugging purposes. 323*6777b538SAndroid Build Coastguard Worker virtual void CloseIdleSocketsInGroup(const GroupId& group_id, 324*6777b538SAndroid Build Coastguard Worker const char* net_log_reason_utf8) = 0; 325*6777b538SAndroid Build Coastguard Worker 326*6777b538SAndroid Build Coastguard Worker // The total number of idle sockets in the pool. 327*6777b538SAndroid Build Coastguard Worker virtual int IdleSocketCount() const = 0; 328*6777b538SAndroid Build Coastguard Worker 329*6777b538SAndroid Build Coastguard Worker // The total number of idle sockets in a connection group. 330*6777b538SAndroid Build Coastguard Worker virtual size_t IdleSocketCountInGroup(const GroupId& group_id) const = 0; 331*6777b538SAndroid Build Coastguard Worker 332*6777b538SAndroid Build Coastguard Worker // Determine the LoadState of a connecting ClientSocketHandle. 333*6777b538SAndroid Build Coastguard Worker virtual LoadState GetLoadState(const GroupId& group_id, 334*6777b538SAndroid Build Coastguard Worker const ClientSocketHandle* handle) const = 0; 335*6777b538SAndroid Build Coastguard Worker 336*6777b538SAndroid Build Coastguard Worker // Retrieves information on the current state of the pool as a 337*6777b538SAndroid Build Coastguard Worker // Value. 338*6777b538SAndroid Build Coastguard Worker // If |include_nested_pools| is true, the states of any nested 339*6777b538SAndroid Build Coastguard Worker // ClientSocketPools will be included. 340*6777b538SAndroid Build Coastguard Worker virtual base::Value GetInfoAsValue(const std::string& name, 341*6777b538SAndroid Build Coastguard Worker const std::string& type) const = 0; 342*6777b538SAndroid Build Coastguard Worker 343*6777b538SAndroid Build Coastguard Worker // Returns whether a connected (idle or handed out) or connecting socket 344*6777b538SAndroid Build Coastguard Worker // exists for the group. This method is not supported for WebSockets. 345*6777b538SAndroid Build Coastguard Worker virtual bool HasActiveSocket(const GroupId& group_id) const = 0; 346*6777b538SAndroid Build Coastguard Worker 347*6777b538SAndroid Build Coastguard Worker // Returns the maximum amount of time to wait before retrying a connect. 348*6777b538SAndroid Build Coastguard Worker static const int kMaxConnectRetryIntervalMs = 250; 349*6777b538SAndroid Build Coastguard Worker 350*6777b538SAndroid Build Coastguard Worker static base::TimeDelta used_idle_socket_timeout(); 351*6777b538SAndroid Build Coastguard Worker static void set_used_idle_socket_timeout(base::TimeDelta timeout); 352*6777b538SAndroid Build Coastguard Worker 353*6777b538SAndroid Build Coastguard Worker protected: 354*6777b538SAndroid Build Coastguard Worker ClientSocketPool(bool is_for_websockets, 355*6777b538SAndroid Build Coastguard Worker const CommonConnectJobParams* common_connect_job_params, 356*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ConnectJobFactory> connect_job_factory); 357*6777b538SAndroid Build Coastguard Worker 358*6777b538SAndroid Build Coastguard Worker void NetLogTcpClientSocketPoolRequestedSocket(const NetLogWithSource& net_log, 359*6777b538SAndroid Build Coastguard Worker const GroupId& group_id); 360*6777b538SAndroid Build Coastguard Worker 361*6777b538SAndroid Build Coastguard Worker // Utility method to log a GroupId with a NetLog event. 362*6777b538SAndroid Build Coastguard Worker static base::Value::Dict NetLogGroupIdParams(const GroupId& group_id); 363*6777b538SAndroid Build Coastguard Worker 364*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ConnectJob> CreateConnectJob( 365*6777b538SAndroid Build Coastguard Worker GroupId group_id, 366*6777b538SAndroid Build Coastguard Worker scoped_refptr<SocketParams> socket_params, 367*6777b538SAndroid Build Coastguard Worker const ProxyChain& proxy_chain, 368*6777b538SAndroid Build Coastguard Worker const std::optional<NetworkTrafficAnnotationTag>& proxy_annotation_tag, 369*6777b538SAndroid Build Coastguard Worker RequestPriority request_priority, 370*6777b538SAndroid Build Coastguard Worker SocketTag socket_tag, 371*6777b538SAndroid Build Coastguard Worker ConnectJob::Delegate* delegate); 372*6777b538SAndroid Build Coastguard Worker 373*6777b538SAndroid Build Coastguard Worker private: 374*6777b538SAndroid Build Coastguard Worker const bool is_for_websockets_; 375*6777b538SAndroid Build Coastguard Worker const raw_ptr<const CommonConnectJobParams> common_connect_job_params_; 376*6777b538SAndroid Build Coastguard Worker const std::unique_ptr<ConnectJobFactory> connect_job_factory_; 377*6777b538SAndroid Build Coastguard Worker }; 378*6777b538SAndroid Build Coastguard Worker 379*6777b538SAndroid Build Coastguard Worker } // namespace net 380*6777b538SAndroid Build Coastguard Worker 381*6777b538SAndroid Build Coastguard Worker #endif // NET_SOCKET_CLIENT_SOCKET_POOL_H_ 382