1 // Copyright 2024 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_QUIC_QUIC_SESSION_POOL_DIRECT_JOB_H_ 6 #define NET_QUIC_QUIC_SESSION_POOL_DIRECT_JOB_H_ 7 8 #include "base/memory/weak_ptr.h" 9 #include "base/time/time.h" 10 #include "net/base/completion_once_callback.h" 11 #include "net/base/net_error_details.h" 12 #include "net/base/request_priority.h" 13 #include "net/dns/host_resolver.h" 14 #include "net/dns/public/host_resolver_results.h" 15 #include "net/log/net_log_with_source.h" 16 #include "net/quic/quic_chromium_client_session.h" 17 #include "net/quic/quic_session_attempt.h" 18 #include "net/quic/quic_session_pool.h" 19 #include "net/quic/quic_session_pool_job.h" 20 #include "net/spdy/multiplexed_session_creation_initiator.h" 21 #include "net/third_party/quiche/src/quiche/quic/core/quic_versions.h" 22 23 namespace net { 24 25 // A DirectJob is a QuicSessionPool::Job that handles direct connections to the 26 // destination. 27 // 28 // A job works on behalf of a pool and a collection of requests to create a new 29 // QUIC session. 30 class QuicSessionPool::DirectJob : public QuicSessionPool::Job { 31 public: 32 DirectJob(QuicSessionPool* pool, 33 quic::ParsedQuicVersion quic_version, 34 HostResolver* host_resolver, 35 QuicSessionAliasKey key, 36 std::unique_ptr<CryptoClientConfigHandle> client_config_handle, 37 bool retry_on_alternate_network_before_handshake, 38 RequestPriority priority, 39 bool use_dns_aliases, 40 bool require_dns_https_alpn, 41 int cert_verify_flags, 42 MultiplexedSessionCreationInitiator session_creation_initiator, 43 const NetLogWithSource& net_log); 44 45 ~DirectJob() override; 46 47 // QuicSessionPool::Job implementation. 48 int Run(CompletionOnceCallback callback) override; 49 void SetRequestExpectations(QuicSessionRequest* request) override; 50 void UpdatePriority(RequestPriority old_priority, 51 RequestPriority new_priority) override; 52 void PopulateNetErrorDetails(NetErrorDetails* details) const override; 53 54 private: 55 int DoLoop(int rv); 56 int DoResolveHost(); 57 int DoResolveHostComplete(int rv); 58 int DoAttemptSession(); 59 60 void OnResolveHostComplete(int rv); 61 void OnSessionAttemptComplete(int rv); 62 GetWeakPtr()63 base::WeakPtr<DirectJob> GetWeakPtr() { return weak_factory_.GetWeakPtr(); } 64 65 enum IoState { 66 STATE_NONE, 67 STATE_RESOLVE_HOST, 68 STATE_RESOLVE_HOST_COMPLETE, 69 STATE_ATTEMPT_SESSION, 70 }; 71 72 // Returns whether the client should be SVCB-optional when connecting to 73 // `results`. 74 bool IsSvcbOptional( 75 base::span<const HostResolverEndpointResult> results) const; 76 77 IoState io_state_ = STATE_RESOLVE_HOST; 78 // TODO(bashi): Rename to `alt_svc_quic_version_` or `known_quic_version_`? 79 const quic::ParsedQuicVersion quic_version_; 80 const raw_ptr<HostResolver> host_resolver_; 81 const bool use_dns_aliases_; 82 const bool require_dns_https_alpn_; 83 const int cert_verify_flags_; 84 const bool retry_on_alternate_network_before_handshake_; 85 bool host_resolution_finished_ = false; 86 HostResolverEndpointResult endpoint_result_; 87 CompletionOnceCallback callback_; 88 std::unique_ptr<HostResolver::ResolveHostRequest> resolve_host_request_; 89 base::TimeTicks dns_resolution_start_time_; 90 base::TimeTicks dns_resolution_end_time_; 91 std::unique_ptr<QuicSessionAttempt> session_attempt_; 92 const MultiplexedSessionCreationInitiator session_creation_initiator_; 93 base::WeakPtrFactory<DirectJob> weak_factory_{this}; 94 }; 95 96 } // namespace net 97 98 #endif // NET_QUIC_QUIC_SESSION_POOL_DIRECT_JOB_H_ 99