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