#ifndef NET_SOCKET_SSL_CONNECT_JOB_H_
#define NET_SOCKET_SSL_CONNECT_JOB_H_
#include <stdint.h>
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "base/memory/ref_counted.h"
#include "base/time/time.h"
#include "net/base/completion_once_callback.h"
#include "net/base/completion_repeating_callback.h"
#include "net/base/net_export.h"
#include "net/base/network_anonymization_key.h"
#include "net/base/privacy_mode.h"
#include "net/dns/public/host_resolver_results.h"
#include "net/dns/public/resolve_error_info.h"
#include "net/socket/connect_job.h"
#include "net/socket/connection_attempts.h"
#include "net/socket/ssl_client_socket.h"
#include "net/ssl/ssl_cert_request_info.h"
#include "net/ssl/ssl_config_service.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace net {
class HostPortPair;
class HttpProxySocketParams;
class SocketTag;
class SOCKSSocketParams;
class TransportSocketParams;
class NET_EXPORT_PRIVATE SSLSocketParams
: public base::RefCounted<SSLSocketParams> {
public:
enum ConnectionType { DIRECT, SOCKS_PROXY, HTTP_PROXY };
SSLSocketParams(scoped_refptr<TransportSocketParams> direct_params,
scoped_refptr<SOCKSSocketParams> socks_proxy_params,
scoped_refptr<HttpProxySocketParams> http_proxy_params,
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
PrivacyMode privacy_mode,
NetworkAnonymizationKey network_anonymization_key);
SSLSocketParams(const SSLSocketParams&) = delete;
SSLSocketParams& operator=(const SSLSocketParams&) = delete;
ConnectionType GetConnectionType() const;
const scoped_refptr<TransportSocketParams>& GetDirectConnectionParams() const;
const scoped_refptr<SOCKSSocketParams>& GetSocksProxyConnectionParams() const;
const scoped_refptr<HttpProxySocketParams>& GetHttpProxyConnectionParams()
const;
const HostPortPair& host_and_port() const { return host_and_port_; }
const SSLConfig& ssl_config() const { return ssl_config_; }
PrivacyMode privacy_mode() const { return privacy_mode_; }
const NetworkAnonymizationKey& network_anonymization_key() const {
return network_anonymization_key_;
}
private:
friend class base::RefCounted<SSLSocketParams>;
~SSLSocketParams();
const scoped_refptr<TransportSocketParams> direct_params_;
const scoped_refptr<SOCKSSocketParams> socks_proxy_params_;
const scoped_refptr<HttpProxySocketParams> http_proxy_params_;
const HostPortPair host_and_port_;
const SSLConfig ssl_config_;
const PrivacyMode privacy_mode_;
const NetworkAnonymizationKey network_anonymization_key_;
};
class NET_EXPORT_PRIVATE SSLConnectJob : public ConnectJob,
public ConnectJob::Delegate {
public:
class NET_EXPORT_PRIVATE Factory {
public:
Factory() = default;
virtual ~Factory() = default;
virtual std::unique_ptr<SSLConnectJob> Create(
RequestPriority priority,
const SocketTag& socket_tag,
const CommonConnectJobParams* common_connect_job_params,
scoped_refptr<SSLSocketParams> params,
ConnectJob::Delegate* delegate,
const NetLogWithSource* net_log);
};
SSLConnectJob(RequestPriority priority,
const SocketTag& socket_tag,
const CommonConnectJobParams* common_connect_job_params,
scoped_refptr<SSLSocketParams> params,
ConnectJob::Delegate* delegate,
const NetLogWithSource* net_log);
SSLConnectJob(const SSLConnectJob&) = delete;
SSLConnectJob& operator=(const SSLConnectJob&) = delete;
~SSLConnectJob() override;
LoadState GetLoadState() const override;
bool HasEstablishedConnection() const override;
void OnConnectJobComplete(int result, ConnectJob* job) override;
void OnNeedsProxyAuth(const HttpResponseInfo& response,
HttpAuthController* auth_controller,
base::OnceClosure restart_with_auth_callback,
ConnectJob* job) override;
ConnectionAttempts GetConnectionAttempts() const override;
ResolveErrorInfo GetResolveErrorInfo() const override;
bool IsSSLError() const override;
scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo() override;
static base::TimeDelta HandshakeTimeoutForTesting();
#ifdef OHOS_EX_NETWORK_CONNECTION
void SetConnectTimeout(int timeout_override) override;
#endif
private:
enum State {
STATE_TRANSPORT_CONNECT,
STATE_TRANSPORT_CONNECT_COMPLETE,
STATE_SOCKS_CONNECT,
STATE_SOCKS_CONNECT_COMPLETE,
STATE_TUNNEL_CONNECT,
STATE_TUNNEL_CONNECT_COMPLETE,
STATE_SSL_CONNECT,
STATE_SSL_CONNECT_COMPLETE,
STATE_NONE,
};
void OnIOComplete(int result);
int DoLoop(int result);
int DoTransportConnect();
int DoTransportConnectComplete(int result);
int DoSOCKSConnect();
int DoSOCKSConnectComplete(int result);
int DoTunnelConnect();
int DoTunnelConnectComplete(int result);
int DoSSLConnect();
int DoSSLConnectComplete(int result);
static State GetInitialState(SSLSocketParams::ConnectionType connection_type);
int ConnectInternal() override;
void ResetStateForRestart();
void ChangePriorityInternal(RequestPriority priority) override;
scoped_refptr<SSLSocketParams> params_;
State next_state_;
CompletionRepeatingCallback callback_;
std::unique_ptr<ConnectJob> nested_connect_job_;
std::unique_ptr<StreamSocket> nested_socket_;
std::unique_ptr<SSLClientSocket> ssl_socket_;
bool ssl_negotiation_started_ = false;
bool disable_legacy_crypto_with_fallback_ = true;
scoped_refptr<SSLCertRequestInfo> ssl_cert_request_info_;
ConnectionAttempts connection_attempts_;
ResolveErrorInfo resolve_error_info_;
IPEndPoint server_address_;
std::set<std::string> dns_aliases_;
absl::optional<HostResolverEndpointResult> endpoint_result_;
absl::optional<std::vector<uint8_t>> ech_retry_configs_;
#ifdef OHOS_EX_NETWORK_CONNECTION
int timeout_override_for_nested_job_{0};
#endif
};
}
#endif