xref: /aosp_15_r20/external/cronet/net/base/network_delegate.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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/base/network_delegate.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <utility>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/ranges/algorithm.h"
11*6777b538SAndroid Build Coastguard Worker #include "net/base/load_flags.h"
12*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/base/trace_constants.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/base/tracing.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/cookies/cookie_setting_override.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/cookies/cookie_util.h"
17*6777b538SAndroid Build Coastguard Worker #include "net/proxy_resolution/proxy_info.h"
18*6777b538SAndroid Build Coastguard Worker #include "net/url_request/url_request.h"
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker namespace net {
21*6777b538SAndroid Build Coastguard Worker 
~NetworkDelegate()22*6777b538SAndroid Build Coastguard Worker NetworkDelegate::~NetworkDelegate() {
23*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
24*6777b538SAndroid Build Coastguard Worker }
25*6777b538SAndroid Build Coastguard Worker 
NotifyBeforeURLRequest(URLRequest * request,CompletionOnceCallback callback,GURL * new_url)26*6777b538SAndroid Build Coastguard Worker int NetworkDelegate::NotifyBeforeURLRequest(URLRequest* request,
27*6777b538SAndroid Build Coastguard Worker                                             CompletionOnceCallback callback,
28*6777b538SAndroid Build Coastguard Worker                                             GURL* new_url) {
29*6777b538SAndroid Build Coastguard Worker   TRACE_EVENT0(NetTracingCategory(), "NetworkDelegate::NotifyBeforeURLRequest");
30*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
31*6777b538SAndroid Build Coastguard Worker   DCHECK(request);
32*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker   // ClusterFuzz depends on the following VLOG. See: crbug.com/715656
35*6777b538SAndroid Build Coastguard Worker   VLOG(1) << "NetworkDelegate::NotifyBeforeURLRequest: " << request->url();
36*6777b538SAndroid Build Coastguard Worker   return OnBeforeURLRequest(request, std::move(callback), new_url);
37*6777b538SAndroid Build Coastguard Worker }
38*6777b538SAndroid Build Coastguard Worker 
NotifyBeforeStartTransaction(URLRequest * request,const HttpRequestHeaders & headers,OnBeforeStartTransactionCallback callback)39*6777b538SAndroid Build Coastguard Worker int NetworkDelegate::NotifyBeforeStartTransaction(
40*6777b538SAndroid Build Coastguard Worker     URLRequest* request,
41*6777b538SAndroid Build Coastguard Worker     const HttpRequestHeaders& headers,
42*6777b538SAndroid Build Coastguard Worker     OnBeforeStartTransactionCallback callback) {
43*6777b538SAndroid Build Coastguard Worker   TRACE_EVENT0(NetTracingCategory(),
44*6777b538SAndroid Build Coastguard Worker                "NetworkDelegate::NotifyBeforeStartTransation");
45*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
46*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
47*6777b538SAndroid Build Coastguard Worker   return OnBeforeStartTransaction(request, headers, std::move(callback));
48*6777b538SAndroid Build Coastguard Worker }
49*6777b538SAndroid Build Coastguard Worker 
NotifyHeadersReceived(URLRequest * request,CompletionOnceCallback callback,const HttpResponseHeaders * original_response_headers,scoped_refptr<HttpResponseHeaders> * override_response_headers,const IPEndPoint & endpoint,std::optional<GURL> * preserve_fragment_on_redirect_url)50*6777b538SAndroid Build Coastguard Worker int NetworkDelegate::NotifyHeadersReceived(
51*6777b538SAndroid Build Coastguard Worker     URLRequest* request,
52*6777b538SAndroid Build Coastguard Worker     CompletionOnceCallback callback,
53*6777b538SAndroid Build Coastguard Worker     const HttpResponseHeaders* original_response_headers,
54*6777b538SAndroid Build Coastguard Worker     scoped_refptr<HttpResponseHeaders>* override_response_headers,
55*6777b538SAndroid Build Coastguard Worker     const IPEndPoint& endpoint,
56*6777b538SAndroid Build Coastguard Worker     std::optional<GURL>* preserve_fragment_on_redirect_url) {
57*6777b538SAndroid Build Coastguard Worker   TRACE_EVENT0(NetTracingCategory(), "NetworkDelegate::NotifyHeadersReceived");
58*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
59*6777b538SAndroid Build Coastguard Worker   DCHECK(original_response_headers);
60*6777b538SAndroid Build Coastguard Worker   DCHECK(!callback.is_null());
61*6777b538SAndroid Build Coastguard Worker   DCHECK(!preserve_fragment_on_redirect_url->has_value());
62*6777b538SAndroid Build Coastguard Worker   return OnHeadersReceived(request, std::move(callback),
63*6777b538SAndroid Build Coastguard Worker                            original_response_headers, override_response_headers,
64*6777b538SAndroid Build Coastguard Worker                            endpoint, preserve_fragment_on_redirect_url);
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker 
NotifyResponseStarted(URLRequest * request,int net_error)67*6777b538SAndroid Build Coastguard Worker void NetworkDelegate::NotifyResponseStarted(URLRequest* request,
68*6777b538SAndroid Build Coastguard Worker                                             int net_error) {
69*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
70*6777b538SAndroid Build Coastguard Worker   DCHECK(request);
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker   OnResponseStarted(request, net_error);
73*6777b538SAndroid Build Coastguard Worker }
74*6777b538SAndroid Build Coastguard Worker 
NotifyBeforeRedirect(URLRequest * request,const GURL & new_location)75*6777b538SAndroid Build Coastguard Worker void NetworkDelegate::NotifyBeforeRedirect(URLRequest* request,
76*6777b538SAndroid Build Coastguard Worker                                            const GURL& new_location) {
77*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
78*6777b538SAndroid Build Coastguard Worker   DCHECK(request);
79*6777b538SAndroid Build Coastguard Worker   OnBeforeRedirect(request, new_location);
80*6777b538SAndroid Build Coastguard Worker }
81*6777b538SAndroid Build Coastguard Worker 
NotifyCompleted(URLRequest * request,bool started,int net_error)82*6777b538SAndroid Build Coastguard Worker void NetworkDelegate::NotifyCompleted(URLRequest* request,
83*6777b538SAndroid Build Coastguard Worker                                       bool started,
84*6777b538SAndroid Build Coastguard Worker                                       int net_error) {
85*6777b538SAndroid Build Coastguard Worker   TRACE_EVENT0(NetTracingCategory(), "NetworkDelegate::NotifyCompleted");
86*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
87*6777b538SAndroid Build Coastguard Worker   DCHECK(request);
88*6777b538SAndroid Build Coastguard Worker   OnCompleted(request, started, net_error);
89*6777b538SAndroid Build Coastguard Worker }
90*6777b538SAndroid Build Coastguard Worker 
NotifyURLRequestDestroyed(URLRequest * request)91*6777b538SAndroid Build Coastguard Worker void NetworkDelegate::NotifyURLRequestDestroyed(URLRequest* request) {
92*6777b538SAndroid Build Coastguard Worker   TRACE_EVENT0(NetTracingCategory(),
93*6777b538SAndroid Build Coastguard Worker                "NetworkDelegate::NotifyURLRequestDestroyed");
94*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
95*6777b538SAndroid Build Coastguard Worker   DCHECK(request);
96*6777b538SAndroid Build Coastguard Worker   OnURLRequestDestroyed(request);
97*6777b538SAndroid Build Coastguard Worker }
98*6777b538SAndroid Build Coastguard Worker 
NotifyPACScriptError(int line_number,const std::u16string & error)99*6777b538SAndroid Build Coastguard Worker void NetworkDelegate::NotifyPACScriptError(int line_number,
100*6777b538SAndroid Build Coastguard Worker                                            const std::u16string& error) {
101*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
102*6777b538SAndroid Build Coastguard Worker   OnPACScriptError(line_number, error);
103*6777b538SAndroid Build Coastguard Worker }
104*6777b538SAndroid Build Coastguard Worker 
AnnotateAndMoveUserBlockedCookies(const URLRequest & request,const net::FirstPartySetMetadata & first_party_set_metadata,net::CookieAccessResultList & maybe_included_cookies,net::CookieAccessResultList & excluded_cookies)105*6777b538SAndroid Build Coastguard Worker bool NetworkDelegate::AnnotateAndMoveUserBlockedCookies(
106*6777b538SAndroid Build Coastguard Worker     const URLRequest& request,
107*6777b538SAndroid Build Coastguard Worker     const net::FirstPartySetMetadata& first_party_set_metadata,
108*6777b538SAndroid Build Coastguard Worker     net::CookieAccessResultList& maybe_included_cookies,
109*6777b538SAndroid Build Coastguard Worker     net::CookieAccessResultList& excluded_cookies) {
110*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
111*6777b538SAndroid Build Coastguard Worker   bool allowed = OnAnnotateAndMoveUserBlockedCookies(
112*6777b538SAndroid Build Coastguard Worker       request, first_party_set_metadata, maybe_included_cookies,
113*6777b538SAndroid Build Coastguard Worker       excluded_cookies);
114*6777b538SAndroid Build Coastguard Worker   cookie_util::DCheckIncludedAndExcludedCookieLists(maybe_included_cookies,
115*6777b538SAndroid Build Coastguard Worker                                                     excluded_cookies);
116*6777b538SAndroid Build Coastguard Worker   return allowed;
117*6777b538SAndroid Build Coastguard Worker }
118*6777b538SAndroid Build Coastguard Worker 
CanSetCookie(const URLRequest & request,const CanonicalCookie & cookie,CookieOptions * options,const net::FirstPartySetMetadata & first_party_set_metadata,CookieInclusionStatus * inclusion_status)119*6777b538SAndroid Build Coastguard Worker bool NetworkDelegate::CanSetCookie(
120*6777b538SAndroid Build Coastguard Worker     const URLRequest& request,
121*6777b538SAndroid Build Coastguard Worker     const CanonicalCookie& cookie,
122*6777b538SAndroid Build Coastguard Worker     CookieOptions* options,
123*6777b538SAndroid Build Coastguard Worker     const net::FirstPartySetMetadata& first_party_set_metadata,
124*6777b538SAndroid Build Coastguard Worker     CookieInclusionStatus* inclusion_status) {
125*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
126*6777b538SAndroid Build Coastguard Worker   DCHECK(!(request.load_flags() & LOAD_DO_NOT_SAVE_COOKIES));
127*6777b538SAndroid Build Coastguard Worker   return OnCanSetCookie(request, cookie, options, first_party_set_metadata,
128*6777b538SAndroid Build Coastguard Worker                         inclusion_status);
129*6777b538SAndroid Build Coastguard Worker }
130*6777b538SAndroid Build Coastguard Worker 
ForcePrivacyMode(const URLRequest & request) const131*6777b538SAndroid Build Coastguard Worker NetworkDelegate::PrivacySetting NetworkDelegate::ForcePrivacyMode(
132*6777b538SAndroid Build Coastguard Worker     const URLRequest& request) const {
133*6777b538SAndroid Build Coastguard Worker   TRACE_EVENT0(NetTracingCategory(), "NetworkDelegate::ForcePrivacyMode");
134*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
135*6777b538SAndroid Build Coastguard Worker   return OnForcePrivacyMode(request);
136*6777b538SAndroid Build Coastguard Worker }
137*6777b538SAndroid Build Coastguard Worker 
CancelURLRequestWithPolicyViolatingReferrerHeader(const URLRequest & request,const GURL & target_url,const GURL & referrer_url) const138*6777b538SAndroid Build Coastguard Worker bool NetworkDelegate::CancelURLRequestWithPolicyViolatingReferrerHeader(
139*6777b538SAndroid Build Coastguard Worker     const URLRequest& request,
140*6777b538SAndroid Build Coastguard Worker     const GURL& target_url,
141*6777b538SAndroid Build Coastguard Worker     const GURL& referrer_url) const {
142*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
143*6777b538SAndroid Build Coastguard Worker   return OnCancelURLRequestWithPolicyViolatingReferrerHeader(
144*6777b538SAndroid Build Coastguard Worker       request, target_url, referrer_url);
145*6777b538SAndroid Build Coastguard Worker }
146*6777b538SAndroid Build Coastguard Worker 
CanQueueReportingReport(const url::Origin & origin) const147*6777b538SAndroid Build Coastguard Worker bool NetworkDelegate::CanQueueReportingReport(const url::Origin& origin) const {
148*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
149*6777b538SAndroid Build Coastguard Worker   return OnCanQueueReportingReport(origin);
150*6777b538SAndroid Build Coastguard Worker }
151*6777b538SAndroid Build Coastguard Worker 
CanSendReportingReports(std::set<url::Origin> origins,base::OnceCallback<void (std::set<url::Origin>)> result_callback) const152*6777b538SAndroid Build Coastguard Worker void NetworkDelegate::CanSendReportingReports(
153*6777b538SAndroid Build Coastguard Worker     std::set<url::Origin> origins,
154*6777b538SAndroid Build Coastguard Worker     base::OnceCallback<void(std::set<url::Origin>)> result_callback) const {
155*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
156*6777b538SAndroid Build Coastguard Worker   OnCanSendReportingReports(std::move(origins), std::move(result_callback));
157*6777b538SAndroid Build Coastguard Worker }
158*6777b538SAndroid Build Coastguard Worker 
CanSetReportingClient(const url::Origin & origin,const GURL & endpoint) const159*6777b538SAndroid Build Coastguard Worker bool NetworkDelegate::CanSetReportingClient(const url::Origin& origin,
160*6777b538SAndroid Build Coastguard Worker                                             const GURL& endpoint) const {
161*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
162*6777b538SAndroid Build Coastguard Worker   return OnCanSetReportingClient(origin, endpoint);
163*6777b538SAndroid Build Coastguard Worker }
164*6777b538SAndroid Build Coastguard Worker 
CanUseReportingClient(const url::Origin & origin,const GURL & endpoint) const165*6777b538SAndroid Build Coastguard Worker bool NetworkDelegate::CanUseReportingClient(const url::Origin& origin,
166*6777b538SAndroid Build Coastguard Worker                                             const GURL& endpoint) const {
167*6777b538SAndroid Build Coastguard Worker   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
168*6777b538SAndroid Build Coastguard Worker   return OnCanUseReportingClient(origin, endpoint);
169*6777b538SAndroid Build Coastguard Worker }
170*6777b538SAndroid Build Coastguard Worker 
171*6777b538SAndroid Build Coastguard Worker // static
ExcludeAllCookies(net::CookieInclusionStatus::ExclusionReason reason,net::CookieAccessResultList & maybe_included_cookies,net::CookieAccessResultList & excluded_cookies)172*6777b538SAndroid Build Coastguard Worker void NetworkDelegate::ExcludeAllCookies(
173*6777b538SAndroid Build Coastguard Worker     net::CookieInclusionStatus::ExclusionReason reason,
174*6777b538SAndroid Build Coastguard Worker     net::CookieAccessResultList& maybe_included_cookies,
175*6777b538SAndroid Build Coastguard Worker     net::CookieAccessResultList& excluded_cookies) {
176*6777b538SAndroid Build Coastguard Worker   excluded_cookies.insert(
177*6777b538SAndroid Build Coastguard Worker       excluded_cookies.end(),
178*6777b538SAndroid Build Coastguard Worker       std::make_move_iterator(maybe_included_cookies.begin()),
179*6777b538SAndroid Build Coastguard Worker       std::make_move_iterator(maybe_included_cookies.end()));
180*6777b538SAndroid Build Coastguard Worker   maybe_included_cookies.clear();
181*6777b538SAndroid Build Coastguard Worker   // Add the ExclusionReason for all cookies.
182*6777b538SAndroid Build Coastguard Worker   for (net::CookieWithAccessResult& cookie : excluded_cookies) {
183*6777b538SAndroid Build Coastguard Worker     cookie.access_result.status.AddExclusionReason(reason);
184*6777b538SAndroid Build Coastguard Worker   }
185*6777b538SAndroid Build Coastguard Worker }
186*6777b538SAndroid Build Coastguard Worker 
187*6777b538SAndroid Build Coastguard Worker // static
ExcludeAllCookiesExceptPartitioned(net::CookieInclusionStatus::ExclusionReason reason,net::CookieAccessResultList & maybe_included_cookies,net::CookieAccessResultList & excluded_cookies)188*6777b538SAndroid Build Coastguard Worker void NetworkDelegate::ExcludeAllCookiesExceptPartitioned(
189*6777b538SAndroid Build Coastguard Worker     net::CookieInclusionStatus::ExclusionReason reason,
190*6777b538SAndroid Build Coastguard Worker     net::CookieAccessResultList& maybe_included_cookies,
191*6777b538SAndroid Build Coastguard Worker     net::CookieAccessResultList& excluded_cookies) {
192*6777b538SAndroid Build Coastguard Worker   // If cookies are not universally disabled, we will preserve partitioned
193*6777b538SAndroid Build Coastguard Worker   // cookies
194*6777b538SAndroid Build Coastguard Worker   const auto to_be_moved = base::ranges::stable_partition(
195*6777b538SAndroid Build Coastguard Worker       maybe_included_cookies, [](const net::CookieWithAccessResult& cookie) {
196*6777b538SAndroid Build Coastguard Worker         return cookie.cookie.IsPartitioned();
197*6777b538SAndroid Build Coastguard Worker       });
198*6777b538SAndroid Build Coastguard Worker   excluded_cookies.insert(
199*6777b538SAndroid Build Coastguard Worker       excluded_cookies.end(), std::make_move_iterator(to_be_moved),
200*6777b538SAndroid Build Coastguard Worker       std::make_move_iterator(maybe_included_cookies.end()));
201*6777b538SAndroid Build Coastguard Worker   maybe_included_cookies.erase(to_be_moved, maybe_included_cookies.end());
202*6777b538SAndroid Build Coastguard Worker 
203*6777b538SAndroid Build Coastguard Worker   // Add the ExclusionReason for all excluded cookies.
204*6777b538SAndroid Build Coastguard Worker   for (net::CookieWithAccessResult& cookie : excluded_cookies) {
205*6777b538SAndroid Build Coastguard Worker     cookie.access_result.status.AddExclusionReason(reason);
206*6777b538SAndroid Build Coastguard Worker   }
207*6777b538SAndroid Build Coastguard Worker }
208*6777b538SAndroid Build Coastguard Worker 
209*6777b538SAndroid Build Coastguard Worker // static
MoveExcludedCookies(net::CookieAccessResultList & maybe_included_cookies,net::CookieAccessResultList & excluded_cookies)210*6777b538SAndroid Build Coastguard Worker void NetworkDelegate::MoveExcludedCookies(
211*6777b538SAndroid Build Coastguard Worker     net::CookieAccessResultList& maybe_included_cookies,
212*6777b538SAndroid Build Coastguard Worker     net::CookieAccessResultList& excluded_cookies) {
213*6777b538SAndroid Build Coastguard Worker   const auto to_be_moved = base::ranges::stable_partition(
214*6777b538SAndroid Build Coastguard Worker       maybe_included_cookies, [](const CookieWithAccessResult& cookie) {
215*6777b538SAndroid Build Coastguard Worker         return cookie.access_result.status.IsInclude();
216*6777b538SAndroid Build Coastguard Worker       });
217*6777b538SAndroid Build Coastguard Worker   excluded_cookies.insert(
218*6777b538SAndroid Build Coastguard Worker       excluded_cookies.end(), std::make_move_iterator(to_be_moved),
219*6777b538SAndroid Build Coastguard Worker       std::make_move_iterator(maybe_included_cookies.end()));
220*6777b538SAndroid Build Coastguard Worker   maybe_included_cookies.erase(to_be_moved, maybe_included_cookies.end());
221*6777b538SAndroid Build Coastguard Worker }
222*6777b538SAndroid Build Coastguard Worker }  // namespace net
223