• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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