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