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 #include "net/quic/quic_session_pool_job.h"
6
7 #include "base/memory/weak_ptr.h"
8 #include "net/base/completion_once_callback.h"
9 #include "net/base/network_change_notifier.h"
10 #include "net/base/network_handle.h"
11 #include "net/base/proxy_chain.h"
12 #include "net/base/request_priority.h"
13 #include "net/base/trace_constants.h"
14 #include "net/base/tracing.h"
15 #include "net/dns/host_resolver.h"
16 #include "net/log/net_log_with_source.h"
17 #include "net/quic/address_utils.h"
18 #include "net/quic/quic_crypto_client_config_handle.h"
19 #include "net/quic/quic_http_stream.h"
20 #include "net/quic/quic_session_pool.h"
21 #include "net/third_party/quiche/src/quiche/quic/core/quic_versions.h"
22
23 namespace net {
24
25 namespace {
26
NetLogQuicSessionPoolJobParams(const QuicSessionPool::QuicSessionAliasKey * key)27 base::Value::Dict NetLogQuicSessionPoolJobParams(
28 const QuicSessionPool::QuicSessionAliasKey* key) {
29 const ProxyChain& proxy_chain = key->session_key().proxy_chain();
30 return base::Value::Dict()
31 .Set("host", key->server_id().host())
32 .Set("port", key->server_id().port())
33 .Set("privacy_mode",
34 PrivacyModeToDebugString(key->session_key().privacy_mode()))
35 .Set("proxy_chain",
36 proxy_chain.IsValid() ? proxy_chain.ToDebugString() : "invalid")
37 .Set("network_anonymization_key",
38 key->session_key().network_anonymization_key().ToDebugString());
39 }
40
41 } // namespace
42
Job(QuicSessionPool * pool,const QuicSessionAliasKey & key,std::unique_ptr<CryptoClientConfigHandle> client_config_handle,RequestPriority priority,const NetLogWithSource & net_log)43 QuicSessionPool::Job::Job(
44 QuicSessionPool* pool,
45 const QuicSessionAliasKey& key,
46 std::unique_ptr<CryptoClientConfigHandle> client_config_handle,
47 RequestPriority priority,
48 const NetLogWithSource& net_log)
49 : pool_(pool),
50 key_(key),
51 client_config_handle_(std::move(client_config_handle)),
52 priority_(priority),
53 net_log_(net_log) {
54 net_log_.BeginEvent(NetLogEventType::QUIC_SESSION_POOL_JOB,
55 [&] { return NetLogQuicSessionPoolJobParams(&key_); });
56 }
57
~Job()58 QuicSessionPool::Job::~Job() {
59 net_log_.EndEvent(NetLogEventType::QUIC_SESSION_POOL_JOB);
60 }
61
AddRequest(QuicSessionRequest * request)62 void QuicSessionPool::Job::AddRequest(QuicSessionRequest* request) {
63 requests_.insert(request);
64 SetRequestExpectations(request);
65 }
66
RemoveRequest(QuicSessionRequest * request)67 void QuicSessionPool::Job::RemoveRequest(QuicSessionRequest* request) {
68 auto request_iter = requests_.find(request);
69 DCHECK(request_iter != requests_.end());
70 requests_.erase(request_iter);
71 }
72
SetPriority(RequestPriority priority)73 void QuicSessionPool::Job::SetPriority(RequestPriority priority) {
74 UpdatePriority(priority_, priority);
75 priority_ = priority;
76 }
77
AssociateWithNetLogSource(const NetLogWithSource & http_stream_job_net_log) const78 void QuicSessionPool::Job::AssociateWithNetLogSource(
79 const NetLogWithSource& http_stream_job_net_log) const {
80 net_log().AddEventReferencingSource(
81 NetLogEventType::QUIC_SESSION_POOL_JOB_BOUND_TO,
82 http_stream_job_net_log.source());
83 http_stream_job_net_log.AddEventReferencingSource(
84 NetLogEventType::BOUND_TO_QUIC_SESSION_POOL_JOB, net_log().source());
85 }
86
UpdatePriority(RequestPriority old_priority,RequestPriority new_priority)87 void QuicSessionPool::Job::UpdatePriority(RequestPriority old_priority,
88 RequestPriority new_priority) {}
89
90 } // namespace net
91