1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef NET_HTTP_HTTP_STREAM_POOL_JOB_H_
#define NET_HTTP_HTTP_STREAM_POOL_JOB_H_
#include <memory>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "net/base/net_error_details.h"
#include "net/base/net_export.h"
#include "net/dns/public/resolve_error_info.h"
#include "net/http/http_stream_pool.h"
#include "net/socket/connection_attempts.h"
#include "net/socket/next_proto.h"
#include "net/socket/stream_socket.h"
#include "net/ssl/ssl_info.h"
#include "net/third_party/quiche/src/quiche/quic/core/quic_versions.h"
namespace net {
class HttpStream;
class SSLCertRequestInfo;
class NetLogWithSource;
struct NetErrorDetails;
// Used by a `Delegate` to handle a stream request or a preconnect for a
// destination. The destination could be the origin or alternative services.
class HttpStreamPool::Job {
public:
// Interface to report Job's results. JobController is the only implementation
// of this interface other than tests. We abstract the interface to avoid a
// circular dependency.
class NET_EXPORT_PRIVATE Delegate {
public:
virtual ~Delegate() = default;
// Returns the priority of the job.
virtual RequestPriority priority() const = 0;
// Returns whether the limits should be respected.
virtual RespectLimits respect_limits() const = 0;
// Returns allowed bad certificates.
virtual const std::vector<SSLConfig::CertAndStatus>& allowed_bad_certs()
const = 0;
// True when IP-based pooling is enabled.
virtual bool enable_ip_based_pooling() const = 0;
// True when alternative services is enabled.
virtual bool enable_alternative_services() const = 0;
// Returns the set of ALPNs that are allowed for this job.
virtual NextProtoSet allowed_alpns() const = 0;
// Returns the proxy info.
virtual const ProxyInfo& proxy_info() const = 0;
virtual const NetLogWithSource& net_log() const = 0;
// Callback methods: Only one of these methods will be called.
// Called when a stream is ready.
virtual void OnStreamReady(Job* job,
std::unique_ptr<HttpStream> stream,
NextProto negotiated_protocol) = 0;
// Called when stream attempts failed.
virtual void OnStreamFailed(Job* job,
int status,
const NetErrorDetails& net_error_details,
ResolveErrorInfo resolve_error_info) = 0;
// Called when a stream attempt has failed due to a certificate error.
virtual void OnCertificateError(Job* job,
int status,
const SSLInfo& ssl_info) = 0;
// Called when a stream attempt has requested a client certificate.
virtual void OnNeedsClientAuth(Job* job, SSLCertRequestInfo* cert_info) = 0;
// Called when the preconnect has completed.
virtual void OnPreconnectComplete(Job* job, int status) = 0;
};
// `delegate` must outlive `this`. For a stream request, `num_streams` must
// not be specified. For a preconnect, `num_streams` must be specified.
Job(Delegate* delegate,
Group* group,
quic::ParsedQuicVersion quic_version,
NextProto expected_protocol,
const NetLogWithSource& request_net_log,
size_t num_streams = 0);
Job& operator=(const Job&) = delete;
~Job();
// Starts this job.
void Start();
// Returns the LoadState of this job.
LoadState GetLoadState() const;
// Called when the priority of this job changes.
void SetPriority(RequestPriority priority);
// Add connection attempts to the job.
void AddConnectionAttempts(const ConnectionAttempts& attempts);
// Called by the associated AttemptManager when a stream is ready.
void OnStreamReady(std::unique_ptr<HttpStream> stream,
NextProto negotiated_protocol);
// Called by the associated AttemptManager when stream attempts failed.
void OnStreamFailed(int rv,
const NetErrorDetails& net_error_details,
ResolveErrorInfo resolve_error_info);
// Called by the associated AttemptManager when an stream attempt has failed
// due to a certificate error.
void OnCertificateError(int status, const SSLInfo& ssl_info);
// Called by the associated AttemptManager when an stream attempt has
// requested a client certificate.
void OnNeedsClientAuth(SSLCertRequestInfo* cert_info);
// Called by the associated AttemptManager when the preconnect completed.
void OnPreconnectComplete(int status);
// Helper method to call OnPreconnectComplete asynchronously. Used to avoid
// a dangling pointer since calling `delegate_->OnPreconnectComplete()`
// deletes `this` synchronously.
void CallOnPreconnectCompleteLater(int status);
RequestPriority priority() const { return delegate_->priority(); }
RespectLimits respect_limits() const { return delegate_->respect_limits(); }
bool enable_ip_based_pooling() const {
return delegate_->enable_ip_based_pooling();
}
bool enable_alternative_services() const {
return delegate_->enable_alternative_services();
}
const ProxyInfo& proxy_info() const { return delegate_->proxy_info(); }
const std::vector<SSLConfig::CertAndStatus>& allowed_bad_certs() const {
return delegate_->allowed_bad_certs();
}
const NetLogWithSource& delegate_net_log() const {
return delegate_->net_log();
}
const NetLogWithSource& net_log() const { return job_net_log_; }
const NetLogWithSource& request_net_log() const { return request_net_log_; }
quic::ParsedQuicVersion quic_version() const { return quic_version_; }
const NextProtoSet& allowed_alpns() const { return allowed_alpns_; }
size_t num_streams() const { return num_streams_; }
bool IsPreconnect() const { return num_streams_ > 0; }
const ConnectionAttempts& connection_attempts() const {
return connection_attempts_;
}
base::TimeTicks create_time() const { return create_time_; }
private:
const raw_ptr<Delegate> delegate_;
raw_ptr<AttemptManager> attempt_manager_;
const quic::ParsedQuicVersion quic_version_;
const NextProtoSet allowed_alpns_;
const NetLogWithSource request_net_log_;
const NetLogWithSource job_net_log_;
const size_t num_streams_;
const base::TimeTicks create_time_;
std::optional<int> result_;
std::optional<NextProto> negotiated_protocol_;
ConnectionAttempts connection_attempts_;
base::WeakPtrFactory<Job> weak_ptr_factory_{this};
};
} // namespace net
#endif // NET_HTTP_HTTP_STREAM_POOL_JOB_H_
|