xref: /aosp_15_r20/external/cronet/net/log/net_log_util.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_util.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <algorithm>
8*6777b538SAndroid Build Coastguard Worker #include <string>
9*6777b538SAndroid Build Coastguard Worker #include <utility>
10*6777b538SAndroid Build Coastguard Worker #include <vector>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/feature_list.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/metrics/field_trial.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/strings/strcat.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_split.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/values.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/base/address_family.h"
22*6777b538SAndroid Build Coastguard Worker #include "net/base/load_states.h"
23*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
24*6777b538SAndroid Build Coastguard Worker #include "net/base/net_info_source_list.h"
25*6777b538SAndroid Build Coastguard Worker #include "net/cert/cert_verifier.h"
26*6777b538SAndroid Build Coastguard Worker #include "net/disk_cache/disk_cache.h"
27*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_cache.h"
28*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_resolver.h"
29*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/dns_query_type.h"
30*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/doh_provider_entry.h"
31*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/secure_dns_mode.h"
32*6777b538SAndroid Build Coastguard Worker #include "net/http/http_cache.h"
33*6777b538SAndroid Build Coastguard Worker #include "net/http/http_network_session.h"
34*6777b538SAndroid Build Coastguard Worker #include "net/http/http_server_properties.h"
35*6777b538SAndroid Build Coastguard Worker #include "net/http/http_transaction_factory.h"
36*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_capture_mode.h"
37*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_entry.h"
38*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_event_type.h"
39*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_values.h"
40*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h"
41*6777b538SAndroid Build Coastguard Worker #include "net/proxy_resolution/proxy_config.h"
42*6777b538SAndroid Build Coastguard Worker #include "net/proxy_resolution/proxy_resolution_service.h"
43*6777b538SAndroid Build Coastguard Worker #include "net/proxy_resolution/proxy_retry_info.h"
44*6777b538SAndroid Build Coastguard Worker #include "net/socket/ssl_client_socket.h"
45*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/quic_error_codes.h"
46*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/quic_packets.h"
47*6777b538SAndroid Build Coastguard Worker #include "net/url_request/url_request.h"
48*6777b538SAndroid Build Coastguard Worker #include "net/url_request/url_request_context.h"
49*6777b538SAndroid Build Coastguard Worker #include "third_party/boringssl/src/pki/simple_path_builder_delegate.h"
50*6777b538SAndroid Build Coastguard Worker #include "third_party/boringssl/src/pki/trust_store.h"
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(ENABLE_REPORTING)
53*6777b538SAndroid Build Coastguard Worker #include "net/network_error_logging/network_error_logging_service.h"
54*6777b538SAndroid Build Coastguard Worker #include "net/reporting/reporting_service.h"
55*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(ENABLE_REPORTING)
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker namespace net {
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker namespace {
60*6777b538SAndroid Build Coastguard Worker 
61*6777b538SAndroid Build Coastguard Worker // This should be incremented when significant changes are made that will
62*6777b538SAndroid Build Coastguard Worker // invalidate the old loading code.
63*6777b538SAndroid Build Coastguard Worker const int kLogFormatVersion = 1;
64*6777b538SAndroid Build Coastguard Worker 
65*6777b538SAndroid Build Coastguard Worker struct StringToConstant {
66*6777b538SAndroid Build Coastguard Worker   const char* name;
67*6777b538SAndroid Build Coastguard Worker   const int constant;
68*6777b538SAndroid Build Coastguard Worker };
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker const StringToConstant kCertStatusFlags[] = {
71*6777b538SAndroid Build Coastguard Worker #define CERT_STATUS_FLAG(label, value) {#label, value},
72*6777b538SAndroid Build Coastguard Worker #include "net/cert/cert_status_flags_list.h"
73*6777b538SAndroid Build Coastguard Worker #undef CERT_STATUS_FLAG
74*6777b538SAndroid Build Coastguard Worker };
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker const StringToConstant kLoadFlags[] = {
77*6777b538SAndroid Build Coastguard Worker #define LOAD_FLAG(label, value) {#label, value},
78*6777b538SAndroid Build Coastguard Worker #include "net/base/load_flags_list.h"
79*6777b538SAndroid Build Coastguard Worker #undef LOAD_FLAG
80*6777b538SAndroid Build Coastguard Worker };
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker const StringToConstant kLoadStateTable[] = {
83*6777b538SAndroid Build Coastguard Worker #define LOAD_STATE(label, value) {#label, LOAD_STATE_##label},
84*6777b538SAndroid Build Coastguard Worker #include "net/base/load_states_list.h"
85*6777b538SAndroid Build Coastguard Worker #undef LOAD_STATE
86*6777b538SAndroid Build Coastguard Worker };
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker const short kNetErrors[] = {
89*6777b538SAndroid Build Coastguard Worker #define NET_ERROR(label, value) value,
90*6777b538SAndroid Build Coastguard Worker #include "net/base/net_error_list.h"
91*6777b538SAndroid Build Coastguard Worker #undef NET_ERROR
92*6777b538SAndroid Build Coastguard Worker };
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker // Returns the disk cache backend for |context| if there is one, or NULL.
95*6777b538SAndroid Build Coastguard Worker // Despite the name, can return an in memory "disk cache".
GetDiskCacheBackend(URLRequestContext * context)96*6777b538SAndroid Build Coastguard Worker disk_cache::Backend* GetDiskCacheBackend(URLRequestContext* context) {
97*6777b538SAndroid Build Coastguard Worker   if (!context->http_transaction_factory())
98*6777b538SAndroid Build Coastguard Worker     return nullptr;
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker   HttpCache* http_cache = context->http_transaction_factory()->GetCache();
101*6777b538SAndroid Build Coastguard Worker   if (!http_cache)
102*6777b538SAndroid Build Coastguard Worker     return nullptr;
103*6777b538SAndroid Build Coastguard Worker 
104*6777b538SAndroid Build Coastguard Worker   return http_cache->GetCurrentBackend();
105*6777b538SAndroid Build Coastguard Worker }
106*6777b538SAndroid Build Coastguard Worker 
107*6777b538SAndroid Build Coastguard Worker // Returns true if |request1| was created before |request2|.
RequestCreatedBefore(const URLRequest * request1,const URLRequest * request2)108*6777b538SAndroid Build Coastguard Worker bool RequestCreatedBefore(const URLRequest* request1,
109*6777b538SAndroid Build Coastguard Worker                           const URLRequest* request2) {
110*6777b538SAndroid Build Coastguard Worker   // Only supported when both requests have the same non-null NetLog.
111*6777b538SAndroid Build Coastguard Worker   DCHECK(request1->net_log().net_log());
112*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(request1->net_log().net_log(), request2->net_log().net_log());
113*6777b538SAndroid Build Coastguard Worker 
114*6777b538SAndroid Build Coastguard Worker   if (request1->creation_time() < request2->creation_time())
115*6777b538SAndroid Build Coastguard Worker     return true;
116*6777b538SAndroid Build Coastguard Worker   if (request1->creation_time() > request2->creation_time())
117*6777b538SAndroid Build Coastguard Worker     return false;
118*6777b538SAndroid Build Coastguard Worker   // If requests were created at the same time, sort by NetLogSource ID. Some
119*6777b538SAndroid Build Coastguard Worker   // NetLog tests assume the returned order exactly matches creation order, even
120*6777b538SAndroid Build Coastguard Worker   // creation times of two events are potentially the same.
121*6777b538SAndroid Build Coastguard Worker   return request1->net_log().source().id < request2->net_log().source().id;
122*6777b538SAndroid Build Coastguard Worker }
123*6777b538SAndroid Build Coastguard Worker 
GetActiveFieldTrialList()124*6777b538SAndroid Build Coastguard Worker base::Value GetActiveFieldTrialList() {
125*6777b538SAndroid Build Coastguard Worker   base::FieldTrial::ActiveGroups active_groups;
126*6777b538SAndroid Build Coastguard Worker   base::FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
127*6777b538SAndroid Build Coastguard Worker   base::Value::List field_trial_groups;
128*6777b538SAndroid Build Coastguard Worker   for (const auto& group : active_groups) {
129*6777b538SAndroid Build Coastguard Worker     field_trial_groups.Append(group.trial_name + ":" + group.group_name);
130*6777b538SAndroid Build Coastguard Worker   }
131*6777b538SAndroid Build Coastguard Worker   return base::Value(std::move(field_trial_groups));
132*6777b538SAndroid Build Coastguard Worker }
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker }  // namespace
135*6777b538SAndroid Build Coastguard Worker 
GetNetConstants()136*6777b538SAndroid Build Coastguard Worker base::Value::Dict GetNetConstants() {
137*6777b538SAndroid Build Coastguard Worker   base::Value::Dict constants_dict;
138*6777b538SAndroid Build Coastguard Worker 
139*6777b538SAndroid Build Coastguard Worker   // Version of the file format.
140*6777b538SAndroid Build Coastguard Worker   constants_dict.Set("logFormatVersion", kLogFormatVersion);
141*6777b538SAndroid Build Coastguard Worker 
142*6777b538SAndroid Build Coastguard Worker   // Add a dictionary with information on the relationship between event type
143*6777b538SAndroid Build Coastguard Worker   // enums and their symbolic names.
144*6777b538SAndroid Build Coastguard Worker   constants_dict.Set("logEventTypes", NetLog::GetEventTypesAsValue());
145*6777b538SAndroid Build Coastguard Worker 
146*6777b538SAndroid Build Coastguard Worker   // Add a dictionary with information about the relationship between CertStatus
147*6777b538SAndroid Build Coastguard Worker   // flags and their symbolic names.
148*6777b538SAndroid Build Coastguard Worker   {
149*6777b538SAndroid Build Coastguard Worker     base::Value::Dict dict;
150*6777b538SAndroid Build Coastguard Worker 
151*6777b538SAndroid Build Coastguard Worker     for (const auto& flag : kCertStatusFlags)
152*6777b538SAndroid Build Coastguard Worker       dict.Set(flag.name, flag.constant);
153*6777b538SAndroid Build Coastguard Worker 
154*6777b538SAndroid Build Coastguard Worker     constants_dict.Set("certStatusFlag", std::move(dict));
155*6777b538SAndroid Build Coastguard Worker   }
156*6777b538SAndroid Build Coastguard Worker 
157*6777b538SAndroid Build Coastguard Worker   // Add a dictionary with information about the relationship between
158*6777b538SAndroid Build Coastguard Worker   // CertVerifier::VerifyFlags and their symbolic names.
159*6777b538SAndroid Build Coastguard Worker   {
160*6777b538SAndroid Build Coastguard Worker     static_assert(CertVerifier::VERIFY_FLAGS_LAST == (1 << 0),
161*6777b538SAndroid Build Coastguard Worker                   "Update with new flags");
162*6777b538SAndroid Build Coastguard Worker     constants_dict.Set(
163*6777b538SAndroid Build Coastguard Worker         "certVerifierFlags",
164*6777b538SAndroid Build Coastguard Worker         base::Value::Dict().Set("VERIFY_DISABLE_NETWORK_FETCHES",
165*6777b538SAndroid Build Coastguard Worker                                 CertVerifier::VERIFY_DISABLE_NETWORK_FETCHES));
166*6777b538SAndroid Build Coastguard Worker   }
167*6777b538SAndroid Build Coastguard Worker 
168*6777b538SAndroid Build Coastguard Worker   {
169*6777b538SAndroid Build Coastguard Worker     static_assert(CertVerifyProc::VERIFY_FLAGS_LAST == (1 << 4),
170*6777b538SAndroid Build Coastguard Worker                   "Update with new flags");
171*6777b538SAndroid Build Coastguard Worker     constants_dict.Set(
172*6777b538SAndroid Build Coastguard Worker         "certVerifyFlags",
173*6777b538SAndroid Build Coastguard Worker         base::Value::Dict()
174*6777b538SAndroid Build Coastguard Worker             .Set("VERIFY_REV_CHECKING_ENABLED",
175*6777b538SAndroid Build Coastguard Worker                  CertVerifyProc::VERIFY_REV_CHECKING_ENABLED)
176*6777b538SAndroid Build Coastguard Worker             .Set("VERIFY_REV_CHECKING_REQUIRED_LOCAL_ANCHORS",
177*6777b538SAndroid Build Coastguard Worker                  CertVerifyProc::VERIFY_REV_CHECKING_REQUIRED_LOCAL_ANCHORS)
178*6777b538SAndroid Build Coastguard Worker             .Set("VERIFY_ENABLE_SHA1_LOCAL_ANCHORS",
179*6777b538SAndroid Build Coastguard Worker                  CertVerifyProc::VERIFY_ENABLE_SHA1_LOCAL_ANCHORS)
180*6777b538SAndroid Build Coastguard Worker             .Set("VERIFY_DISABLE_SYMANTEC_ENFORCEMENT",
181*6777b538SAndroid Build Coastguard Worker                  CertVerifyProc::VERIFY_DISABLE_SYMANTEC_ENFORCEMENT)
182*6777b538SAndroid Build Coastguard Worker             .Set("VERIFY_DISABLE_NETWORK_FETCHES",
183*6777b538SAndroid Build Coastguard Worker                  CertVerifyProc::VERIFY_DISABLE_NETWORK_FETCHES));
184*6777b538SAndroid Build Coastguard Worker   }
185*6777b538SAndroid Build Coastguard Worker 
186*6777b538SAndroid Build Coastguard Worker   {
187*6777b538SAndroid Build Coastguard Worker     static_assert(
188*6777b538SAndroid Build Coastguard Worker         bssl::SimplePathBuilderDelegate::DigestPolicy::kMaxValue ==
189*6777b538SAndroid Build Coastguard Worker             bssl::SimplePathBuilderDelegate::DigestPolicy::kWeakAllowSha1,
190*6777b538SAndroid Build Coastguard Worker         "Update with new flags");
191*6777b538SAndroid Build Coastguard Worker 
192*6777b538SAndroid Build Coastguard Worker     constants_dict.Set(
193*6777b538SAndroid Build Coastguard Worker         "certPathBuilderDigestPolicy",
194*6777b538SAndroid Build Coastguard Worker         base::Value::Dict()
195*6777b538SAndroid Build Coastguard Worker             .Set("kStrong",
196*6777b538SAndroid Build Coastguard Worker                  static_cast<int>(
197*6777b538SAndroid Build Coastguard Worker                      bssl::SimplePathBuilderDelegate::DigestPolicy::kStrong))
198*6777b538SAndroid Build Coastguard Worker             .Set("kWeakAllowSha1",
199*6777b538SAndroid Build Coastguard Worker                  static_cast<int>(bssl::SimplePathBuilderDelegate::
200*6777b538SAndroid Build Coastguard Worker                                       DigestPolicy::kWeakAllowSha1)));
201*6777b538SAndroid Build Coastguard Worker   }
202*6777b538SAndroid Build Coastguard Worker 
203*6777b538SAndroid Build Coastguard Worker   // Add a dictionary with information about the relationship between load flag
204*6777b538SAndroid Build Coastguard Worker   // enums and their symbolic names.
205*6777b538SAndroid Build Coastguard Worker   {
206*6777b538SAndroid Build Coastguard Worker     base::Value::Dict dict;
207*6777b538SAndroid Build Coastguard Worker 
208*6777b538SAndroid Build Coastguard Worker     for (const auto& flag : kLoadFlags)
209*6777b538SAndroid Build Coastguard Worker       dict.Set(flag.name, flag.constant);
210*6777b538SAndroid Build Coastguard Worker 
211*6777b538SAndroid Build Coastguard Worker     constants_dict.Set("loadFlag", std::move(dict));
212*6777b538SAndroid Build Coastguard Worker   }
213*6777b538SAndroid Build Coastguard Worker 
214*6777b538SAndroid Build Coastguard Worker   // Add a dictionary with information about the relationship between load state
215*6777b538SAndroid Build Coastguard Worker   // enums and their symbolic names.
216*6777b538SAndroid Build Coastguard Worker   {
217*6777b538SAndroid Build Coastguard Worker     base::Value::Dict dict;
218*6777b538SAndroid Build Coastguard Worker 
219*6777b538SAndroid Build Coastguard Worker     for (const auto& state : kLoadStateTable)
220*6777b538SAndroid Build Coastguard Worker       dict.Set(state.name, state.constant);
221*6777b538SAndroid Build Coastguard Worker 
222*6777b538SAndroid Build Coastguard Worker     constants_dict.Set("loadState", std::move(dict));
223*6777b538SAndroid Build Coastguard Worker   }
224*6777b538SAndroid Build Coastguard Worker 
225*6777b538SAndroid Build Coastguard Worker   // Add information on the relationship between net error codes and their
226*6777b538SAndroid Build Coastguard Worker   // symbolic names.
227*6777b538SAndroid Build Coastguard Worker   {
228*6777b538SAndroid Build Coastguard Worker     base::Value::Dict dict;
229*6777b538SAndroid Build Coastguard Worker 
230*6777b538SAndroid Build Coastguard Worker     for (const auto& error : kNetErrors)
231*6777b538SAndroid Build Coastguard Worker       dict.Set(ErrorToShortString(error), error);
232*6777b538SAndroid Build Coastguard Worker 
233*6777b538SAndroid Build Coastguard Worker     constants_dict.Set("netError", std::move(dict));
234*6777b538SAndroid Build Coastguard Worker   }
235*6777b538SAndroid Build Coastguard Worker 
236*6777b538SAndroid Build Coastguard Worker   // Add information on the relationship between QUIC error codes and their
237*6777b538SAndroid Build Coastguard Worker   // symbolic names.
238*6777b538SAndroid Build Coastguard Worker   {
239*6777b538SAndroid Build Coastguard Worker     base::Value::Dict dict;
240*6777b538SAndroid Build Coastguard Worker 
241*6777b538SAndroid Build Coastguard Worker     for (quic::QuicErrorCode error = quic::QUIC_NO_ERROR;
242*6777b538SAndroid Build Coastguard Worker          error < quic::QUIC_LAST_ERROR;
243*6777b538SAndroid Build Coastguard Worker          error = static_cast<quic::QuicErrorCode>(error + 1)) {
244*6777b538SAndroid Build Coastguard Worker       dict.Set(QuicErrorCodeToString(error), static_cast<int>(error));
245*6777b538SAndroid Build Coastguard Worker     }
246*6777b538SAndroid Build Coastguard Worker 
247*6777b538SAndroid Build Coastguard Worker     constants_dict.Set("quicError", std::move(dict));
248*6777b538SAndroid Build Coastguard Worker   }
249*6777b538SAndroid Build Coastguard Worker 
250*6777b538SAndroid Build Coastguard Worker   // Add information on the relationship between QUIC RST_STREAM error codes
251*6777b538SAndroid Build Coastguard Worker   // and their symbolic names.
252*6777b538SAndroid Build Coastguard Worker   {
253*6777b538SAndroid Build Coastguard Worker     base::Value::Dict dict;
254*6777b538SAndroid Build Coastguard Worker 
255*6777b538SAndroid Build Coastguard Worker     for (quic::QuicRstStreamErrorCode error = quic::QUIC_STREAM_NO_ERROR;
256*6777b538SAndroid Build Coastguard Worker          error < quic::QUIC_STREAM_LAST_ERROR;
257*6777b538SAndroid Build Coastguard Worker          error = static_cast<quic::QuicRstStreamErrorCode>(error + 1)) {
258*6777b538SAndroid Build Coastguard Worker       dict.Set(QuicRstStreamErrorCodeToString(error), static_cast<int>(error));
259*6777b538SAndroid Build Coastguard Worker     }
260*6777b538SAndroid Build Coastguard Worker 
261*6777b538SAndroid Build Coastguard Worker     constants_dict.Set("quicRstStreamError", std::move(dict));
262*6777b538SAndroid Build Coastguard Worker   }
263*6777b538SAndroid Build Coastguard Worker 
264*6777b538SAndroid Build Coastguard Worker   // Information about the relationship between event phase enums and their
265*6777b538SAndroid Build Coastguard Worker   // symbolic names.
266*6777b538SAndroid Build Coastguard Worker   {
267*6777b538SAndroid Build Coastguard Worker     constants_dict.Set(
268*6777b538SAndroid Build Coastguard Worker         "logEventPhase",
269*6777b538SAndroid Build Coastguard Worker         base::Value::Dict()
270*6777b538SAndroid Build Coastguard Worker             .Set("PHASE_BEGIN", static_cast<int>(NetLogEventPhase::BEGIN))
271*6777b538SAndroid Build Coastguard Worker             .Set("PHASE_END", static_cast<int>(NetLogEventPhase::END))
272*6777b538SAndroid Build Coastguard Worker             .Set("PHASE_NONE", static_cast<int>(NetLogEventPhase::NONE)));
273*6777b538SAndroid Build Coastguard Worker   }
274*6777b538SAndroid Build Coastguard Worker 
275*6777b538SAndroid Build Coastguard Worker   // Information about the relationship between source type enums and
276*6777b538SAndroid Build Coastguard Worker   // their symbolic names.
277*6777b538SAndroid Build Coastguard Worker   constants_dict.Set("logSourceType", NetLog::GetSourceTypesAsValue());
278*6777b538SAndroid Build Coastguard Worker 
279*6777b538SAndroid Build Coastguard Worker   // Information about the relationship between address family enums and
280*6777b538SAndroid Build Coastguard Worker   // their symbolic names.
281*6777b538SAndroid Build Coastguard Worker   {
282*6777b538SAndroid Build Coastguard Worker     constants_dict.Set(
283*6777b538SAndroid Build Coastguard Worker         "addressFamily",
284*6777b538SAndroid Build Coastguard Worker         base::Value::Dict()
285*6777b538SAndroid Build Coastguard Worker             .Set("ADDRESS_FAMILY_UNSPECIFIED", ADDRESS_FAMILY_UNSPECIFIED)
286*6777b538SAndroid Build Coastguard Worker             .Set("ADDRESS_FAMILY_IPV4", ADDRESS_FAMILY_IPV4)
287*6777b538SAndroid Build Coastguard Worker             .Set("ADDRESS_FAMILY_IPV6", ADDRESS_FAMILY_IPV6));
288*6777b538SAndroid Build Coastguard Worker   }
289*6777b538SAndroid Build Coastguard Worker 
290*6777b538SAndroid Build Coastguard Worker   // Information about the relationship between DnsQueryType enums and their
291*6777b538SAndroid Build Coastguard Worker   // symbolic names.
292*6777b538SAndroid Build Coastguard Worker   {
293*6777b538SAndroid Build Coastguard Worker     base::Value::Dict dict;
294*6777b538SAndroid Build Coastguard Worker     for (const auto& type : kDnsQueryTypes) {
295*6777b538SAndroid Build Coastguard Worker       dict.Set(type.second, static_cast<int>(type.first));
296*6777b538SAndroid Build Coastguard Worker     }
297*6777b538SAndroid Build Coastguard Worker     constants_dict.Set("dnsQueryType", std::move(dict));
298*6777b538SAndroid Build Coastguard Worker   }
299*6777b538SAndroid Build Coastguard Worker 
300*6777b538SAndroid Build Coastguard Worker   // Information about the relationship between SecureDnsMode enums and their
301*6777b538SAndroid Build Coastguard Worker   // symbolic names.
302*6777b538SAndroid Build Coastguard Worker   {
303*6777b538SAndroid Build Coastguard Worker     base::Value::Dict dict;
304*6777b538SAndroid Build Coastguard Worker     for (const auto& mode : kSecureDnsModes) {
305*6777b538SAndroid Build Coastguard Worker       dict.Set(mode.second, static_cast<int>(mode.first));
306*6777b538SAndroid Build Coastguard Worker     }
307*6777b538SAndroid Build Coastguard Worker     constants_dict.Set("secureDnsMode", std::move(dict));
308*6777b538SAndroid Build Coastguard Worker   }
309*6777b538SAndroid Build Coastguard Worker 
310*6777b538SAndroid Build Coastguard Worker   // Information about how the "time ticks" values we have given it relate to
311*6777b538SAndroid Build Coastguard Worker   // actual system times.  Time ticks are used throughout since they are stable
312*6777b538SAndroid Build Coastguard Worker   // across system clock changes. Note: |timeTickOffset| is only comparable to
313*6777b538SAndroid Build Coastguard Worker   // TimeTicks values in milliseconds.
314*6777b538SAndroid Build Coastguard Worker   // TODO(csharrison): This is an imprecise way to convert TimeTicks to unix
315*6777b538SAndroid Build Coastguard Worker   // time. In fact, there isn't really a good way to do this unless we log Time
316*6777b538SAndroid Build Coastguard Worker   // and TimeTicks values side by side for every event. crbug.com/593157 tracks
317*6777b538SAndroid Build Coastguard Worker   // a change where the user will be notified if a timing anomaly occured that
318*6777b538SAndroid Build Coastguard Worker   // would skew the conversion (i.e. the machine entered suspend mode while
319*6777b538SAndroid Build Coastguard Worker   // logging).
320*6777b538SAndroid Build Coastguard Worker   {
321*6777b538SAndroid Build Coastguard Worker     base::TimeDelta time_since_epoch =
322*6777b538SAndroid Build Coastguard Worker         base::Time::Now() - base::Time::UnixEpoch();
323*6777b538SAndroid Build Coastguard Worker     base::TimeDelta reference_time_ticks =
324*6777b538SAndroid Build Coastguard Worker         base::TimeTicks::Now() - base::TimeTicks();
325*6777b538SAndroid Build Coastguard Worker     int64_t tick_to_unix_time_ms =
326*6777b538SAndroid Build Coastguard Worker         (time_since_epoch - reference_time_ticks).InMilliseconds();
327*6777b538SAndroid Build Coastguard Worker     constants_dict.Set("timeTickOffset",
328*6777b538SAndroid Build Coastguard Worker                        NetLogNumberValue(tick_to_unix_time_ms));
329*6777b538SAndroid Build Coastguard Worker   }
330*6777b538SAndroid Build Coastguard Worker 
331*6777b538SAndroid Build Coastguard Worker   // TODO(eroman): Is this needed?
332*6777b538SAndroid Build Coastguard Worker   // "clientInfo" key is required for some log readers. Provide a default empty
333*6777b538SAndroid Build Coastguard Worker   // value for compatibility.
334*6777b538SAndroid Build Coastguard Worker   constants_dict.Set("clientInfo", base::Value::Dict());
335*6777b538SAndroid Build Coastguard Worker 
336*6777b538SAndroid Build Coastguard Worker   // Add a list of field experiments active at the start of the capture.
337*6777b538SAndroid Build Coastguard Worker   // Additional trials may be enabled later in the browser session.
338*6777b538SAndroid Build Coastguard Worker   constants_dict.Set(kNetInfoFieldTrials, GetActiveFieldTrialList());
339*6777b538SAndroid Build Coastguard Worker 
340*6777b538SAndroid Build Coastguard Worker   return constants_dict;
341*6777b538SAndroid Build Coastguard Worker }
342*6777b538SAndroid Build Coastguard Worker 
GetNetInfo(URLRequestContext * context)343*6777b538SAndroid Build Coastguard Worker NET_EXPORT base::Value::Dict GetNetInfo(URLRequestContext* context) {
344*6777b538SAndroid Build Coastguard Worker   // May only be called on the context's thread.
345*6777b538SAndroid Build Coastguard Worker   context->AssertCalledOnValidThread();
346*6777b538SAndroid Build Coastguard Worker 
347*6777b538SAndroid Build Coastguard Worker   base::Value::Dict net_info_dict =
348*6777b538SAndroid Build Coastguard Worker       context->proxy_resolution_service()->GetProxyNetLogValues();
349*6777b538SAndroid Build Coastguard Worker 
350*6777b538SAndroid Build Coastguard Worker   // Log Host Resolver info.
351*6777b538SAndroid Build Coastguard Worker   {
352*6777b538SAndroid Build Coastguard Worker     HostResolver* host_resolver = context->host_resolver();
353*6777b538SAndroid Build Coastguard Worker     DCHECK(host_resolver);
354*6777b538SAndroid Build Coastguard Worker     HostCache* cache = host_resolver->GetHostCache();
355*6777b538SAndroid Build Coastguard Worker     if (cache) {
356*6777b538SAndroid Build Coastguard Worker       base::Value::List cache_contents_list;
357*6777b538SAndroid Build Coastguard Worker       cache->GetList(cache_contents_list, true /* include_staleness */,
358*6777b538SAndroid Build Coastguard Worker                      HostCache::SerializationType::kDebug);
359*6777b538SAndroid Build Coastguard Worker 
360*6777b538SAndroid Build Coastguard Worker       net_info_dict.Set(
361*6777b538SAndroid Build Coastguard Worker           kNetInfoHostResolver,
362*6777b538SAndroid Build Coastguard Worker           base::Value::Dict()
363*6777b538SAndroid Build Coastguard Worker               .Set("dns_config", host_resolver->GetDnsConfigAsValue())
364*6777b538SAndroid Build Coastguard Worker               .Set("cache",
365*6777b538SAndroid Build Coastguard Worker                    base::Value::Dict()
366*6777b538SAndroid Build Coastguard Worker                        .Set("capacity", static_cast<int>(cache->max_entries()))
367*6777b538SAndroid Build Coastguard Worker                        .Set("network_changes", cache->network_changes())
368*6777b538SAndroid Build Coastguard Worker                        .Set("entries", std::move(cache_contents_list))));
369*6777b538SAndroid Build Coastguard Worker     }
370*6777b538SAndroid Build Coastguard Worker 
371*6777b538SAndroid Build Coastguard Worker     // Construct a list containing the names of the disabled DoH providers.
372*6777b538SAndroid Build Coastguard Worker     base::Value::List disabled_doh_providers_list;
373*6777b538SAndroid Build Coastguard Worker     for (const DohProviderEntry* provider : DohProviderEntry::GetList()) {
374*6777b538SAndroid Build Coastguard Worker       if (!base::FeatureList::IsEnabled(provider->feature)) {
375*6777b538SAndroid Build Coastguard Worker         disabled_doh_providers_list.Append(
376*6777b538SAndroid Build Coastguard Worker             NetLogStringValue(provider->provider));
377*6777b538SAndroid Build Coastguard Worker       }
378*6777b538SAndroid Build Coastguard Worker     }
379*6777b538SAndroid Build Coastguard Worker     net_info_dict.Set(kNetInfoDohProvidersDisabledDueToFeature,
380*6777b538SAndroid Build Coastguard Worker                       base::Value(std::move(disabled_doh_providers_list)));
381*6777b538SAndroid Build Coastguard Worker   }
382*6777b538SAndroid Build Coastguard Worker 
383*6777b538SAndroid Build Coastguard Worker   HttpNetworkSession* http_network_session =
384*6777b538SAndroid Build Coastguard Worker       context->http_transaction_factory()->GetSession();
385*6777b538SAndroid Build Coastguard Worker 
386*6777b538SAndroid Build Coastguard Worker   // Log Socket Pool info.
387*6777b538SAndroid Build Coastguard Worker   {
388*6777b538SAndroid Build Coastguard Worker     net_info_dict.Set(kNetInfoSocketPool,
389*6777b538SAndroid Build Coastguard Worker                       http_network_session->SocketPoolInfoToValue());
390*6777b538SAndroid Build Coastguard Worker   }
391*6777b538SAndroid Build Coastguard Worker 
392*6777b538SAndroid Build Coastguard Worker   // Log SPDY Sessions.
393*6777b538SAndroid Build Coastguard Worker   {
394*6777b538SAndroid Build Coastguard Worker     net_info_dict.Set(kNetInfoSpdySessions,
395*6777b538SAndroid Build Coastguard Worker                       base::Value::FromUniquePtrValue(
396*6777b538SAndroid Build Coastguard Worker                           http_network_session->SpdySessionPoolInfoToValue()));
397*6777b538SAndroid Build Coastguard Worker   }
398*6777b538SAndroid Build Coastguard Worker 
399*6777b538SAndroid Build Coastguard Worker   // Log SPDY status.
400*6777b538SAndroid Build Coastguard Worker   {
401*6777b538SAndroid Build Coastguard Worker     base::Value::Dict status_dict;
402*6777b538SAndroid Build Coastguard Worker 
403*6777b538SAndroid Build Coastguard Worker     status_dict.Set("enable_http2",
404*6777b538SAndroid Build Coastguard Worker                     http_network_session->params().enable_http2);
405*6777b538SAndroid Build Coastguard Worker 
406*6777b538SAndroid Build Coastguard Worker     const NextProtoVector& alpn_protos = http_network_session->GetAlpnProtos();
407*6777b538SAndroid Build Coastguard Worker     if (!alpn_protos.empty()) {
408*6777b538SAndroid Build Coastguard Worker       std::string next_protos_string;
409*6777b538SAndroid Build Coastguard Worker       for (NextProto proto : alpn_protos) {
410*6777b538SAndroid Build Coastguard Worker         if (!next_protos_string.empty())
411*6777b538SAndroid Build Coastguard Worker           next_protos_string.append(",");
412*6777b538SAndroid Build Coastguard Worker         next_protos_string.append(NextProtoToString(proto));
413*6777b538SAndroid Build Coastguard Worker       }
414*6777b538SAndroid Build Coastguard Worker       status_dict.Set("alpn_protos", next_protos_string);
415*6777b538SAndroid Build Coastguard Worker     }
416*6777b538SAndroid Build Coastguard Worker 
417*6777b538SAndroid Build Coastguard Worker     const SSLConfig::ApplicationSettings& application_settings =
418*6777b538SAndroid Build Coastguard Worker         http_network_session->GetApplicationSettings();
419*6777b538SAndroid Build Coastguard Worker     if (!application_settings.empty()) {
420*6777b538SAndroid Build Coastguard Worker       base::Value::Dict application_settings_dict;
421*6777b538SAndroid Build Coastguard Worker       for (const auto& setting : application_settings) {
422*6777b538SAndroid Build Coastguard Worker         application_settings_dict.Set(NextProtoToString(setting.first),
423*6777b538SAndroid Build Coastguard Worker                                       base::HexEncode(setting.second));
424*6777b538SAndroid Build Coastguard Worker       }
425*6777b538SAndroid Build Coastguard Worker       status_dict.Set("application_settings",
426*6777b538SAndroid Build Coastguard Worker                       std::move(application_settings_dict));
427*6777b538SAndroid Build Coastguard Worker     }
428*6777b538SAndroid Build Coastguard Worker 
429*6777b538SAndroid Build Coastguard Worker     net_info_dict.Set(kNetInfoSpdyStatus, std::move(status_dict));
430*6777b538SAndroid Build Coastguard Worker   }
431*6777b538SAndroid Build Coastguard Worker 
432*6777b538SAndroid Build Coastguard Worker   // Log ALT_SVC mappings.
433*6777b538SAndroid Build Coastguard Worker   {
434*6777b538SAndroid Build Coastguard Worker     const HttpServerProperties& http_server_properties =
435*6777b538SAndroid Build Coastguard Worker         *context->http_server_properties();
436*6777b538SAndroid Build Coastguard Worker     net_info_dict.Set(
437*6777b538SAndroid Build Coastguard Worker         kNetInfoAltSvcMappings,
438*6777b538SAndroid Build Coastguard Worker         http_server_properties.GetAlternativeServiceInfoAsValue());
439*6777b538SAndroid Build Coastguard Worker   }
440*6777b538SAndroid Build Coastguard Worker 
441*6777b538SAndroid Build Coastguard Worker   // Log QUIC info.
442*6777b538SAndroid Build Coastguard Worker   { net_info_dict.Set(kNetInfoQuic, http_network_session->QuicInfoToValue()); }
443*6777b538SAndroid Build Coastguard Worker 
444*6777b538SAndroid Build Coastguard Worker   // Log HTTP Cache info.
445*6777b538SAndroid Build Coastguard Worker   {
446*6777b538SAndroid Build Coastguard Worker     base::Value::Dict info_dict;
447*6777b538SAndroid Build Coastguard Worker     base::Value::Dict stats_dict;
448*6777b538SAndroid Build Coastguard Worker 
449*6777b538SAndroid Build Coastguard Worker     disk_cache::Backend* disk_cache = GetDiskCacheBackend(context);
450*6777b538SAndroid Build Coastguard Worker 
451*6777b538SAndroid Build Coastguard Worker     if (disk_cache) {
452*6777b538SAndroid Build Coastguard Worker       // Extract the statistics key/value pairs from the backend.
453*6777b538SAndroid Build Coastguard Worker       base::StringPairs stats;
454*6777b538SAndroid Build Coastguard Worker       disk_cache->GetStats(&stats);
455*6777b538SAndroid Build Coastguard Worker       for (auto& stat : stats) {
456*6777b538SAndroid Build Coastguard Worker         stats_dict.Set(stat.first, std::move(stat.second));
457*6777b538SAndroid Build Coastguard Worker       }
458*6777b538SAndroid Build Coastguard Worker     }
459*6777b538SAndroid Build Coastguard Worker     info_dict.Set("stats", std::move(stats_dict));
460*6777b538SAndroid Build Coastguard Worker 
461*6777b538SAndroid Build Coastguard Worker     net_info_dict.Set(kNetInfoHTTPCache, std::move(info_dict));
462*6777b538SAndroid Build Coastguard Worker   }
463*6777b538SAndroid Build Coastguard Worker 
464*6777b538SAndroid Build Coastguard Worker   // Log Reporting API info.
465*6777b538SAndroid Build Coastguard Worker   {
466*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(ENABLE_REPORTING)
467*6777b538SAndroid Build Coastguard Worker     ReportingService* reporting_service = context->reporting_service();
468*6777b538SAndroid Build Coastguard Worker     if (reporting_service) {
469*6777b538SAndroid Build Coastguard Worker       base::Value reporting_value = reporting_service->StatusAsValue();
470*6777b538SAndroid Build Coastguard Worker       NetworkErrorLoggingService* network_error_logging_service =
471*6777b538SAndroid Build Coastguard Worker           context->network_error_logging_service();
472*6777b538SAndroid Build Coastguard Worker       if (network_error_logging_service) {
473*6777b538SAndroid Build Coastguard Worker         reporting_value.GetDict().Set(
474*6777b538SAndroid Build Coastguard Worker             "networkErrorLogging",
475*6777b538SAndroid Build Coastguard Worker             network_error_logging_service->StatusAsValue());
476*6777b538SAndroid Build Coastguard Worker       }
477*6777b538SAndroid Build Coastguard Worker       net_info_dict.Set(kNetInfoReporting, std::move(reporting_value));
478*6777b538SAndroid Build Coastguard Worker     } else {
479*6777b538SAndroid Build Coastguard Worker       net_info_dict.Set(kNetInfoReporting,
480*6777b538SAndroid Build Coastguard Worker                         base::Value::Dict().Set("reportingEnabled", false));
481*6777b538SAndroid Build Coastguard Worker     }
482*6777b538SAndroid Build Coastguard Worker 
483*6777b538SAndroid Build Coastguard Worker #else   // BUILDFLAG(ENABLE_REPORTING)
484*6777b538SAndroid Build Coastguard Worker     net_info_dict.Set(kNetInfoReporting,
485*6777b538SAndroid Build Coastguard Worker                       base::Value::Dict().Set("reportingEnabled", false));
486*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(ENABLE_REPORTING)
487*6777b538SAndroid Build Coastguard Worker   }
488*6777b538SAndroid Build Coastguard Worker 
489*6777b538SAndroid Build Coastguard Worker   // Log currently-active field trials. New trials may have been enabled since
490*6777b538SAndroid Build Coastguard Worker   // the start of this browser session (crbug.com/1133396).
491*6777b538SAndroid Build Coastguard Worker   net_info_dict.Set(kNetInfoFieldTrials, GetActiveFieldTrialList());
492*6777b538SAndroid Build Coastguard Worker 
493*6777b538SAndroid Build Coastguard Worker   return net_info_dict;
494*6777b538SAndroid Build Coastguard Worker }
495*6777b538SAndroid Build Coastguard Worker 
CreateNetLogEntriesForActiveObjects(const std::set<URLRequestContext * > & contexts,NetLog::ThreadSafeObserver * observer)496*6777b538SAndroid Build Coastguard Worker NET_EXPORT void CreateNetLogEntriesForActiveObjects(
497*6777b538SAndroid Build Coastguard Worker     const std::set<URLRequestContext*>& contexts,
498*6777b538SAndroid Build Coastguard Worker     NetLog::ThreadSafeObserver* observer) {
499*6777b538SAndroid Build Coastguard Worker   // Put together the list of all requests.
500*6777b538SAndroid Build Coastguard Worker   std::vector<const URLRequest*> requests;
501*6777b538SAndroid Build Coastguard Worker   for (auto* context : contexts) {
502*6777b538SAndroid Build Coastguard Worker     // May only be called on the context's thread.
503*6777b538SAndroid Build Coastguard Worker     context->AssertCalledOnValidThread();
504*6777b538SAndroid Build Coastguard Worker     // Contexts should all be using the same NetLog.
505*6777b538SAndroid Build Coastguard Worker     DCHECK_EQ((*contexts.begin())->net_log(), context->net_log());
506*6777b538SAndroid Build Coastguard Worker     for (const URLRequest* request : *context->url_requests()) {
507*6777b538SAndroid Build Coastguard Worker       requests.push_back(request);
508*6777b538SAndroid Build Coastguard Worker     }
509*6777b538SAndroid Build Coastguard Worker   }
510*6777b538SAndroid Build Coastguard Worker 
511*6777b538SAndroid Build Coastguard Worker   // Sort by creation time.
512*6777b538SAndroid Build Coastguard Worker   std::sort(requests.begin(), requests.end(), RequestCreatedBefore);
513*6777b538SAndroid Build Coastguard Worker 
514*6777b538SAndroid Build Coastguard Worker   // Create fake events.
515*6777b538SAndroid Build Coastguard Worker   for (auto* request : requests) {
516*6777b538SAndroid Build Coastguard Worker     NetLogEntry entry(NetLogEventType::REQUEST_ALIVE,
517*6777b538SAndroid Build Coastguard Worker                       request->net_log().source(), NetLogEventPhase::BEGIN,
518*6777b538SAndroid Build Coastguard Worker                       request->creation_time(), request->GetStateAsValue());
519*6777b538SAndroid Build Coastguard Worker     observer->OnAddEntry(entry);
520*6777b538SAndroid Build Coastguard Worker   }
521*6777b538SAndroid Build Coastguard Worker }
522*6777b538SAndroid Build Coastguard Worker 
523*6777b538SAndroid Build Coastguard Worker }  // namespace net
524