xref: /aosp_15_r20/external/cronet/net/socket/socks_connect_job.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_SOCKS_CONNECT_JOB_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_SOCKET_SOCKS_CONNECT_JOB_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <memory>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/base/host_port_pair.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/base/network_isolation_key.h"
17*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h"
18*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/resolve_error_info.h"
19*6777b538SAndroid Build Coastguard Worker #include "net/socket/connect_job.h"
20*6777b538SAndroid Build Coastguard Worker #include "net/socket/connect_job_params.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/socket/socks_client_socket.h"
22*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h"
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker namespace net {
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker class SocketTag;
27*6777b538SAndroid Build Coastguard Worker class StreamSocket;
28*6777b538SAndroid Build Coastguard Worker class TransportSocketParams;
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE SOCKSSocketParams
31*6777b538SAndroid Build Coastguard Worker     : public base::RefCounted<SOCKSSocketParams> {
32*6777b538SAndroid Build Coastguard Worker  public:
33*6777b538SAndroid Build Coastguard Worker   SOCKSSocketParams(ConnectJobParams nested_params,
34*6777b538SAndroid Build Coastguard Worker                     bool socks_v5,
35*6777b538SAndroid Build Coastguard Worker                     const HostPortPair& host_port_pair,
36*6777b538SAndroid Build Coastguard Worker                     const NetworkAnonymizationKey& network_anonymization_key,
37*6777b538SAndroid Build Coastguard Worker                     const NetworkTrafficAnnotationTag& traffic_annotation);
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker   SOCKSSocketParams(const SOCKSSocketParams&) = delete;
40*6777b538SAndroid Build Coastguard Worker   SOCKSSocketParams& operator=(const SOCKSSocketParams&) = delete;
41*6777b538SAndroid Build Coastguard Worker 
transport_params()42*6777b538SAndroid Build Coastguard Worker   const scoped_refptr<TransportSocketParams>& transport_params() const {
43*6777b538SAndroid Build Coastguard Worker     return transport_params_;
44*6777b538SAndroid Build Coastguard Worker   }
destination()45*6777b538SAndroid Build Coastguard Worker   const HostPortPair& destination() const { return destination_; }
is_socks_v5()46*6777b538SAndroid Build Coastguard Worker   bool is_socks_v5() const { return socks_v5_; }
network_anonymization_key()47*6777b538SAndroid Build Coastguard Worker   const NetworkAnonymizationKey& network_anonymization_key() {
48*6777b538SAndroid Build Coastguard Worker     return network_anonymization_key_;
49*6777b538SAndroid Build Coastguard Worker   }
50*6777b538SAndroid Build Coastguard Worker 
traffic_annotation()51*6777b538SAndroid Build Coastguard Worker   const NetworkTrafficAnnotationTag traffic_annotation() {
52*6777b538SAndroid Build Coastguard Worker     return traffic_annotation_;
53*6777b538SAndroid Build Coastguard Worker   }
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker  private:
56*6777b538SAndroid Build Coastguard Worker   friend class base::RefCounted<SOCKSSocketParams>;
57*6777b538SAndroid Build Coastguard Worker   ~SOCKSSocketParams();
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker   // The transport (likely TCP) connection must point toward the proxy server.
60*6777b538SAndroid Build Coastguard Worker   const scoped_refptr<TransportSocketParams> transport_params_;
61*6777b538SAndroid Build Coastguard Worker   // This is the HTTP destination.
62*6777b538SAndroid Build Coastguard Worker   const HostPortPair destination_;
63*6777b538SAndroid Build Coastguard Worker   const bool socks_v5_;
64*6777b538SAndroid Build Coastguard Worker   const NetworkAnonymizationKey network_anonymization_key_;
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker   NetworkTrafficAnnotationTag traffic_annotation_;
67*6777b538SAndroid Build Coastguard Worker };
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker // SOCKSConnectJob handles establishing a connection to a SOCKS4 or SOCKS5 proxy
70*6777b538SAndroid Build Coastguard Worker // and then sending a handshake to establish a tunnel.
71*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE SOCKSConnectJob : public ConnectJob,
72*6777b538SAndroid Build Coastguard Worker                                            public ConnectJob::Delegate {
73*6777b538SAndroid Build Coastguard Worker  public:
74*6777b538SAndroid Build Coastguard Worker   class NET_EXPORT_PRIVATE Factory {
75*6777b538SAndroid Build Coastguard Worker    public:
76*6777b538SAndroid Build Coastguard Worker     Factory() = default;
77*6777b538SAndroid Build Coastguard Worker     virtual ~Factory() = default;
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker     virtual std::unique_ptr<SOCKSConnectJob> Create(
80*6777b538SAndroid Build Coastguard Worker         RequestPriority priority,
81*6777b538SAndroid Build Coastguard Worker         const SocketTag& socket_tag,
82*6777b538SAndroid Build Coastguard Worker         const CommonConnectJobParams* common_connect_job_params,
83*6777b538SAndroid Build Coastguard Worker         scoped_refptr<SOCKSSocketParams> socks_params,
84*6777b538SAndroid Build Coastguard Worker         ConnectJob::Delegate* delegate,
85*6777b538SAndroid Build Coastguard Worker         const NetLogWithSource* net_log);
86*6777b538SAndroid Build Coastguard Worker   };
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker   SOCKSConnectJob(RequestPriority priority,
89*6777b538SAndroid Build Coastguard Worker                   const SocketTag& socket_tag,
90*6777b538SAndroid Build Coastguard Worker                   const CommonConnectJobParams* common_connect_job_params,
91*6777b538SAndroid Build Coastguard Worker                   scoped_refptr<SOCKSSocketParams> socks_params,
92*6777b538SAndroid Build Coastguard Worker                   ConnectJob::Delegate* delegate,
93*6777b538SAndroid Build Coastguard Worker                   const NetLogWithSource* net_log);
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker   SOCKSConnectJob(const SOCKSConnectJob&) = delete;
96*6777b538SAndroid Build Coastguard Worker   SOCKSConnectJob& operator=(const SOCKSConnectJob&) = delete;
97*6777b538SAndroid Build Coastguard Worker 
98*6777b538SAndroid Build Coastguard Worker   ~SOCKSConnectJob() override;
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker   // ConnectJob methods.
101*6777b538SAndroid Build Coastguard Worker   LoadState GetLoadState() const override;
102*6777b538SAndroid Build Coastguard Worker   bool HasEstablishedConnection() const override;
103*6777b538SAndroid Build Coastguard Worker   ResolveErrorInfo GetResolveErrorInfo() const override;
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker   // Returns the handshake timeout used by SOCKSConnectJobs.
106*6777b538SAndroid Build Coastguard Worker   static base::TimeDelta HandshakeTimeoutForTesting();
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker  private:
109*6777b538SAndroid Build Coastguard Worker   enum State {
110*6777b538SAndroid Build Coastguard Worker     STATE_TRANSPORT_CONNECT,
111*6777b538SAndroid Build Coastguard Worker     STATE_TRANSPORT_CONNECT_COMPLETE,
112*6777b538SAndroid Build Coastguard Worker     STATE_SOCKS_CONNECT,
113*6777b538SAndroid Build Coastguard Worker     STATE_SOCKS_CONNECT_COMPLETE,
114*6777b538SAndroid Build Coastguard Worker     STATE_NONE,
115*6777b538SAndroid Build Coastguard Worker   };
116*6777b538SAndroid Build Coastguard Worker 
117*6777b538SAndroid Build Coastguard Worker   void OnIOComplete(int result);
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker   // ConnectJob::Delegate methods.
120*6777b538SAndroid Build Coastguard Worker   void OnConnectJobComplete(int result, ConnectJob* job) override;
121*6777b538SAndroid Build Coastguard Worker   void OnNeedsProxyAuth(const HttpResponseInfo& response,
122*6777b538SAndroid Build Coastguard Worker                         HttpAuthController* auth_controller,
123*6777b538SAndroid Build Coastguard Worker                         base::OnceClosure restart_with_auth_callback,
124*6777b538SAndroid Build Coastguard Worker                         ConnectJob* job) override;
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker   // Runs the state transition loop.
127*6777b538SAndroid Build Coastguard Worker   int DoLoop(int result);
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker   int DoTransportConnect();
130*6777b538SAndroid Build Coastguard Worker   int DoTransportConnectComplete(int result);
131*6777b538SAndroid Build Coastguard Worker   int DoSOCKSConnect();
132*6777b538SAndroid Build Coastguard Worker   int DoSOCKSConnectComplete(int result);
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker   // Begins the transport connection and the SOCKS handshake.  Returns OK on
135*6777b538SAndroid Build Coastguard Worker   // success and ERR_IO_PENDING if it cannot immediately service the request.
136*6777b538SAndroid Build Coastguard Worker   // Otherwise, it returns a net error code.
137*6777b538SAndroid Build Coastguard Worker   int ConnectInternal() override;
138*6777b538SAndroid Build Coastguard Worker 
139*6777b538SAndroid Build Coastguard Worker   void ChangePriorityInternal(RequestPriority priority) override;
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker   scoped_refptr<SOCKSSocketParams> socks_params_;
142*6777b538SAndroid Build Coastguard Worker 
143*6777b538SAndroid Build Coastguard Worker   State next_state_;
144*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<ConnectJob> transport_connect_job_;
145*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<StreamSocket> socket_;
146*6777b538SAndroid Build Coastguard Worker   raw_ptr<SOCKSClientSocket> socks_socket_ptr_;
147*6777b538SAndroid Build Coastguard Worker 
148*6777b538SAndroid Build Coastguard Worker   ResolveErrorInfo resolve_error_info_;
149*6777b538SAndroid Build Coastguard Worker };
150*6777b538SAndroid Build Coastguard Worker 
151*6777b538SAndroid Build Coastguard Worker }  // namespace net
152*6777b538SAndroid Build Coastguard Worker 
153*6777b538SAndroid Build Coastguard Worker #endif  // NET_SOCKET_SOCKS_CONNECT_JOB_H_
154