#ifndef NET_SOCKET_STREAM_ATTEMPT_H_
#define NET_SOCKET_STREAM_ATTEMPT_H_
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/values.h"
#include "net/base/completion_once_callback.h"
#include "net/base/ip_endpoint.h"
#include "net/base/load_states.h"
#include "net/base/load_timing_info.h"
#include "net/base/net_export.h"
#include "net/base/tracing.h"
#include "net/log/net_log_event_type.h"
#include "net/log/net_log_with_source.h"
#include "net/socket/stream_socket_close_reason.h"
namespace net {
class ClientSocketFactory;
class HttpNetworkSession;
class SocketPerformanceWatcherFactory;
class SSLClientContext;
class SSLCertRequestInfo;
class StreamSocket;
class NetworkQualityEstimator;
class NetLog;
struct NET_EXPORT_PRIVATE StreamAttemptParams {
static StreamAttemptParams FromHttpNetworkSession(
HttpNetworkSession* session);
StreamAttemptParams(
ClientSocketFactory* client_socket_factory,
SSLClientContext* ssl_client_context,
SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
NetworkQualityEstimator* network_quality_estimator,
NetLog* net_log);
raw_ptr<ClientSocketFactory> client_socket_factory;
raw_ptr<SSLClientContext> ssl_client_context;
raw_ptr<SocketPerformanceWatcherFactory> socket_performance_watcher_factory;
raw_ptr<NetworkQualityEstimator> network_quality_estimator;
raw_ptr<NetLog> net_log;
};
class NET_EXPORT_PRIVATE StreamAttempt {
public:
StreamAttempt(const StreamAttemptParams* params,
IPEndPoint ip_endpoint,
perfetto::Track track,
NetLogSourceType net_log_source_type,
NetLogEventType net_log_attempt_event_type,
const NetLogWithSource* net_log = nullptr);
StreamAttempt(const StreamAttempt&) = delete;
StreamAttempt& operator=(const StreamAttempt&) = delete;
virtual ~StreamAttempt();
int Start(CompletionOnceCallback callback);
virtual LoadState GetLoadState() const = 0;
virtual base::Value::Dict GetInfoAsValue() const = 0;
virtual scoped_refptr<SSLCertRequestInfo> GetCertRequestInfo();
StreamSocket* stream_socket() const { return stream_socket_.get(); }
std::unique_ptr<StreamSocket> ReleaseStreamSocket();
const IPEndPoint& ip_endpoint() const { return ip_endpoint_; }
const NetLogWithSource& net_log() const { return net_log_; }
const LoadTimingInfo::ConnectTiming& connect_timing() const {
return connect_timing_;
}
void SetCancelReason(StreamSocketCloseReason cancel_reason);
protected:
virtual int StartInternal() = 0;
virtual base::Value::Dict GetNetLogStartParams() = 0;
const StreamAttemptParams& params() { return *params_; }
void SetStreamSocket(std::unique_ptr<StreamSocket> stream_socket);
void NotifyOfCompletion(int rv);
LoadTimingInfo::ConnectTiming& mutable_connect_timing() {
return connect_timing_;
}
perfetto::Track track() const { return track_; }
private:
void LogCompletion(int rv);
const raw_ptr<const StreamAttemptParams> params_;
const IPEndPoint ip_endpoint_;
perfetto::Track track_;
NetLogWithSource net_log_;
NetLogEventType net_log_attempt_event_type_;
CompletionOnceCallback callback_;
std::unique_ptr<StreamSocket> stream_socket_;
LoadTimingInfo::ConnectTiming connect_timing_;
std::optional<StreamSocketCloseReason> cancel_reason_;
};
}
#endif