#ifndef NET_SOCKET_CONNECT_JOB_H_
#define NET_SOCKET_CONNECT_JOB_H_
#include <memory>
#include <optional>
#include <set>
#include <string>
#include "base/functional/callback_forward.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "net/base/load_states.h"
#include "net/base/load_timing_info.h"
#include "net/base/net_errors.h"
#include "net/base/net_export.h"
#include "net/base/request_priority.h"
#include "net/dns/public/host_resolver_results.h"
#include "net/dns/public/resolve_error_info.h"
#include "net/http/http_server_properties.h"
#include "net/log/net_log_with_source.h"
#include "net/socket/connection_attempts.h"
#include "net/socket/next_proto.h"
#include "net/socket/socket_tag.h"
#include "net/socket/ssl_client_socket.h"
#include "net/ssl/ssl_config.h"
#include "net/third_party/quiche/src/quiche/quic/core/quic_versions.h"
#if BUILDFLAG(ENABLE_ARKWEB_EXT)
#include "arkweb/ohos_nweb_ex/build/features/features.h"
#endif
namespace net {
class ClientSocketFactory;
class HostPortPair;
class HostResolver;
struct HostResolverEndpointResult;
class HttpAuthCache;
class HttpAuthController;
class HttpAuthHandlerFactory;
class HttpResponseInfo;
class HttpUserAgentSettings;
class NetLog;
class NetLogWithSource;
class NetworkQualityEstimator;
class ProxyDelegate;
class QuicSessionPool;
class SocketPerformanceWatcherFactory;
class SocketTag;
class SpdySessionPool;
class SSLCertRequestInfo;
class StreamSocket;
class WebSocketEndpointLockManager;
struct NET_EXPORT_PRIVATE CommonConnectJobParams {
CommonConnectJobParams(
ClientSocketFactory* client_socket_factory,
HostResolver* host_resolver,
HttpAuthCache* http_auth_cache,
HttpAuthHandlerFactory* http_auth_handler_factory,
SpdySessionPool* spdy_session_pool,
const quic::ParsedQuicVersionVector* quic_supported_versions,
QuicSessionPool* quic_session_pool,
ProxyDelegate* proxy_delegate,
const HttpUserAgentSettings* http_user_agent_settings,
SSLClientContext* ssl_client_context,
SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
NetworkQualityEstimator* network_quality_estimator,
NetLog* net_log,
WebSocketEndpointLockManager* websocket_endpoint_lock_manager,
HttpServerProperties* http_server_properties,
const NextProtoVector* alpn_protos,
const SSLConfig::ApplicationSettings* application_settings,
const bool* ignore_certificate_errors,
const bool* enable_early_data);
CommonConnectJobParams(const CommonConnectJobParams& other);
~CommonConnectJobParams();
CommonConnectJobParams& operator=(const CommonConnectJobParams& other);
raw_ptr<ClientSocketFactory> client_socket_factory;
raw_ptr<HostResolver> host_resolver;
raw_ptr<HttpAuthCache> http_auth_cache;
raw_ptr<HttpAuthHandlerFactory> http_auth_handler_factory;
raw_ptr<SpdySessionPool> spdy_session_pool;
raw_ptr<const quic::ParsedQuicVersionVector> quic_supported_versions;
raw_ptr<QuicSessionPool> quic_session_pool;
raw_ptr<ProxyDelegate> proxy_delegate;
raw_ptr<const HttpUserAgentSettings> http_user_agent_settings;
raw_ptr<SSLClientContext> ssl_client_context;
raw_ptr<SocketPerformanceWatcherFactory> socket_performance_watcher_factory;
raw_ptr<NetworkQualityEstimator> network_quality_estimator;
raw_ptr<NetLog> net_log;
raw_ptr<WebSocketEndpointLockManager> websocket_endpoint_lock_manager;
raw_ptr<HttpServerProperties> http_server_properties;
raw_ptr<const NextProtoVector> alpn_protos;
raw_ptr<const SSLConfig::ApplicationSettings> application_settings;
raw_ptr<const bool> ignore_certificate_errors;
raw_ptr<const bool> enable_early_data;
};
enum class OnHostResolutionCallbackResult {
kContinue,
kMayBeDeletedAsync,
};
using OnHostResolutionCallback =
base::RepeatingCallback<OnHostResolutionCallbackResult(
const HostPortPair& host_port_pair,
const std::vector<HostResolverEndpointResult>& endpoint_results,
const std::set<std::string>& aliases)>;
class NET_EXPORT_PRIVATE ConnectJob {
public:
class NET_EXPORT_PRIVATE Delegate {
public:
Delegate() = default;
Delegate(const Delegate&) = delete;
Delegate& operator=(const Delegate&) = delete;
virtual ~Delegate() = default;
virtual void OnConnectJobComplete(int result, ConnectJob* job) = 0;
virtual void OnNeedsProxyAuth(const HttpResponseInfo& response,
HttpAuthController* auth_controller,
base::OnceClosure restart_with_auth_callback,
ConnectJob* job) = 0;
virtual Error OnDestinationDnsAliasesResolved(
const std::set<std::string>& aliases,
ConnectJob* job) = 0;
};
ConnectJob(RequestPriority priority,
const SocketTag& socket_tag,
base::TimeDelta timeout_duration,
const CommonConnectJobParams* common_connect_job_params,
Delegate* delegate,
const NetLogWithSource* net_log,
NetLogSourceType net_log_source_type,
NetLogEventType net_log_connect_event_type);
ConnectJob(const ConnectJob&) = delete;
ConnectJob& operator=(const ConnectJob&) = delete;
virtual ~ConnectJob();
const NetLogWithSource& net_log() { return net_log_; }
RequestPriority priority() const { return priority_; }
std::unique_ptr<StreamSocket> PassSocket();
StreamSocket* socket() { return socket_.get(); }
void ChangePriority(RequestPriority priority);
int Connect();
virtual LoadState GetLoadState() const = 0;
virtual bool HasEstablishedConnection() const = 0;
virtual ConnectionAttempts GetConnectionAttempts() const;
virtual ResolveErrorInfo GetResolveErrorInfo() const = 0;
virtual bool IsSSLError() const;
virtual scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo();
virtual std::optional<HostResolverEndpointResult>
GetHostResolverEndpointResult() const;
const LoadTimingInfo::ConnectTiming& connect_timing() const {
return connect_timing_;
}
void set_done_closure(base::OnceClosure done_closure);
const NetLogWithSource& net_log() const { return net_log_; }
#if BUILDFLAG(ARKWEB_EXT_NETWORK_CONNECTION)
virtual void SetConnectTimeout(int timeout_override) = 0;
#endif
#if BUILDFLAG(ARKWEB_PRP_PRELOAD)
virtual void SetFromPreload(bool from_preload) {
from_preload_ = from_preload;
}
bool IsFromPreload() const {
return from_preload_;
}
#endif
protected:
const SocketTag& socket_tag() const { return socket_tag_; }
ClientSocketFactory* client_socket_factory() {
return common_connect_job_params_->client_socket_factory;
}
HostResolver* host_resolver() {
return common_connect_job_params_->host_resolver;
}
const HttpUserAgentSettings* http_user_agent_settings() const {
return common_connect_job_params_->http_user_agent_settings;
}
SSLClientContext* ssl_client_context() {
return common_connect_job_params_->ssl_client_context;
}
SocketPerformanceWatcherFactory* socket_performance_watcher_factory() {
return common_connect_job_params_->socket_performance_watcher_factory;
}
NetworkQualityEstimator* network_quality_estimator() {
return common_connect_job_params_->network_quality_estimator;
}
WebSocketEndpointLockManager* websocket_endpoint_lock_manager() {
return common_connect_job_params_->websocket_endpoint_lock_manager;
}
HttpServerProperties* http_server_properties() {
return common_connect_job_params_->http_server_properties;
}
const CommonConnectJobParams* common_connect_job_params() const {
return common_connect_job_params_;
}
void SetSocket(std::unique_ptr<StreamSocket> socket,
std::optional<std::set<std::string>> dns_aliases);
void NotifyDelegateOfCompletion(int rv);
void NotifyDelegateOfProxyAuth(const HttpResponseInfo& response,
HttpAuthController* auth_controller,
base::OnceClosure restart_with_auth_callback);
Error HandleDnsAliasesResolved(const std::set<std::string>& aliases);
void ResetTimer(base::TimeDelta remaining_time);
bool TimerIsRunning() const;
LoadTimingInfo::ConnectTiming connect_timing_;
#if BUILDFLAG(ARKWEB_EXT_NETWORK_CONNECTION)
base::TimeDelta timeout_override_ = base::TimeDelta();
#endif
#if BUILDFLAG(ARKWEB_MULTI_IP_CONNECT)
bool multi_ip_enabled_{true};
base::TimeDelta multi_connect_interval_time_ = base::Milliseconds(300);
#endif
private:
virtual int ConnectInternal() = 0;
virtual void ChangePriorityInternal(RequestPriority priority) = 0;
void LogConnectStart();
void StopTimerAndLogConnectCompletion(int net_error);
void OnTimeout();
virtual void OnTimedOutInternal();
const base::TimeDelta timeout_duration_;
RequestPriority priority_;
const SocketTag socket_tag_;
raw_ptr<const CommonConnectJobParams> common_connect_job_params_;
base::OneShotTimer timer_;
raw_ptr<Delegate> delegate_;
std::unique_ptr<StreamSocket> socket_;
const bool top_level_job_;
NetLogWithSource net_log_;
base::ScopedClosureRunner done_closure_;
const NetLogEventType net_log_connect_event_type_;
#if BUILDFLAG(ARKWEB_PRP_PRELOAD)
bool from_preload_ = false;
#endif
};
}
#endif