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_pool.h" 18 #include "net/quic/quic_session_pool_job.h" 19 #include "net/quic/quic_session_pool_session_attempt.h" 20 #include "net/third_party/quiche/src/quiche/quic/core/quic_versions.h" 21 22 namespace net { 23 24 // A DirectJob is a QuicSessionPool::Job that handles direct connections to the 25 // destination. 26 // 27 // A job works on behalf of a pool and a collection of requests to create a new 28 // QUIC session. 29 class QuicSessionPool::DirectJob : public QuicSessionPool::Job { 30 public: 31 DirectJob(QuicSessionPool* pool, 32 quic::ParsedQuicVersion quic_version, 33 HostResolver* host_resolver, 34 const QuicSessionAliasKey& key, 35 std::unique_ptr<CryptoClientConfigHandle> client_config_handle, 36 bool retry_on_alternate_network_before_handshake, 37 RequestPriority priority, 38 bool use_dns_aliases, 39 bool require_dns_https_alpn, 40 int cert_verify_flags, 41 const NetLogWithSource& net_log); 42 43 ~DirectJob() override; 44 45 // QuicSessionPool::Job implementation. 46 int Run(CompletionOnceCallback callback) override; 47 void SetRequestExpectations(QuicSessionRequest* request) override; 48 void UpdatePriority(RequestPriority old_priority, 49 RequestPriority new_priority) override; 50 void PopulateNetErrorDetails(NetErrorDetails* details) const override; 51 52 private: 53 int DoLoop(int rv); 54 int DoResolveHost(); 55 int DoResolveHostComplete(int rv); 56 int DoAttemptSession(); 57 58 void OnResolveHostComplete(int rv); 59 void OnSessionAttemptComplete(int rv); 60 GetWeakPtr()61 base::WeakPtr<DirectJob> GetWeakPtr() { return weak_factory_.GetWeakPtr(); } 62 63 enum IoState { 64 STATE_NONE, 65 STATE_RESOLVE_HOST, 66 STATE_RESOLVE_HOST_COMPLETE, 67 STATE_ATTEMPT_SESSION, 68 }; 69 70 // Returns whether the client should be SVCB-optional when connecting to 71 // `results`. 72 bool IsSvcbOptional( 73 base::span<const HostResolverEndpointResult> results) const; 74 75 IoState io_state_ = STATE_RESOLVE_HOST; 76 // TODO(bashi): Rename to `alt_svc_quic_version_` or `known_quic_version_`? 77 const quic::ParsedQuicVersion quic_version_; 78 const raw_ptr<HostResolver> host_resolver_; 79 const bool use_dns_aliases_; 80 const bool require_dns_https_alpn_; 81 const int cert_verify_flags_; 82 const bool retry_on_alternate_network_before_handshake_; 83 bool host_resolution_finished_ = false; 84 HostResolverEndpointResult endpoint_result_; 85 CompletionOnceCallback callback_; 86 std::unique_ptr<HostResolver::ResolveHostRequest> resolve_host_request_; 87 base::TimeTicks dns_resolution_start_time_; 88 base::TimeTicks dns_resolution_end_time_; 89 std::unique_ptr<SessionAttempt> session_attempt_; 90 base::WeakPtrFactory<DirectJob> weak_factory_{this}; 91 }; 92 93 } // namespace net 94 95 #endif // NET_QUIC_QUIC_SESSION_POOL_DIRECT_JOB_H_ 96