xref: /aosp_15_r20/external/cronet/net/socket/client_socket_pool.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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