xref: /aosp_15_r20/external/cronet/net/quic/quic_session_pool_direct_job.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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