• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/base/network_delegate.h"
6 
7 #include <utility>
8 
9 #include "base/logging.h"
10 #include "base/ranges/algorithm.h"
11 #include "base/threading/thread_checker.h"
12 #include "net/base/load_flags.h"
13 #include "net/base/net_errors.h"
14 #include "net/base/trace_constants.h"
15 #include "net/base/tracing.h"
16 #include "net/cookies/cookie_setting_override.h"
17 #include "net/cookies/cookie_util.h"
18 #include "net/proxy_resolution/proxy_info.h"
19 #include "net/url_request/redirect_info.h"
20 #include "net/url_request/url_request.h"
21 
22 namespace net {
23 
~NetworkDelegate()24 NetworkDelegate::~NetworkDelegate() {
25   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
26 }
27 
NotifyBeforeURLRequest(URLRequest * request,CompletionOnceCallback callback,GURL * new_url)28 int NetworkDelegate::NotifyBeforeURLRequest(URLRequest* request,
29                                             CompletionOnceCallback callback,
30                                             GURL* new_url) {
31   TRACE_EVENT0(NetTracingCategory(), "NetworkDelegate::NotifyBeforeURLRequest");
32   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
33   DCHECK(request);
34   DCHECK(!callback.is_null());
35 
36   // ClusterFuzz depends on the following VLOG. See: crbug.com/715656
37   VLOG(1) << "NetworkDelegate::NotifyBeforeURLRequest: " << request->url();
38   return OnBeforeURLRequest(request, std::move(callback), new_url);
39 }
40 
NotifyBeforeStartTransaction(URLRequest * request,const HttpRequestHeaders & headers,OnBeforeStartTransactionCallback callback)41 int NetworkDelegate::NotifyBeforeStartTransaction(
42     URLRequest* request,
43     const HttpRequestHeaders& headers,
44     OnBeforeStartTransactionCallback callback) {
45   TRACE_EVENT0(NetTracingCategory(),
46                "NetworkDelegate::NotifyBeforeStartTransation");
47   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
48   DCHECK(!callback.is_null());
49   return OnBeforeStartTransaction(request, headers, std::move(callback));
50 }
51 
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)52 int NetworkDelegate::NotifyHeadersReceived(
53     URLRequest* request,
54     CompletionOnceCallback callback,
55     const HttpResponseHeaders* original_response_headers,
56     scoped_refptr<HttpResponseHeaders>* override_response_headers,
57     const IPEndPoint& endpoint,
58     std::optional<GURL>* preserve_fragment_on_redirect_url) {
59   TRACE_EVENT0(NetTracingCategory(), "NetworkDelegate::NotifyHeadersReceived");
60   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
61   DCHECK(original_response_headers);
62   DCHECK(!callback.is_null());
63   DCHECK(!preserve_fragment_on_redirect_url->has_value());
64   return OnHeadersReceived(request, std::move(callback),
65                            original_response_headers, override_response_headers,
66                            endpoint, preserve_fragment_on_redirect_url);
67 }
68 
NotifyResponseStarted(URLRequest * request,int net_error)69 void NetworkDelegate::NotifyResponseStarted(URLRequest* request,
70                                             int net_error) {
71   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
72   DCHECK(request);
73 
74   OnResponseStarted(request, net_error);
75 }
76 
NotifyBeforeRedirect(URLRequest * request,const GURL & new_location)77 void NetworkDelegate::NotifyBeforeRedirect(URLRequest* request,
78                                            const GURL& new_location) {
79   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
80   DCHECK(request);
81   OnBeforeRedirect(request, new_location);
82 }
83 
NotifyBeforeRetry(URLRequest * request)84 void NetworkDelegate::NotifyBeforeRetry(URLRequest* request) {
85   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
86   CHECK(request);
87   OnBeforeRetry(request);
88 }
89 
NotifyCompleted(URLRequest * request,bool started,int net_error)90 void NetworkDelegate::NotifyCompleted(URLRequest* request,
91                                       bool started,
92                                       int net_error) {
93   TRACE_EVENT0(NetTracingCategory(), "NetworkDelegate::NotifyCompleted");
94   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
95   DCHECK(request);
96   OnCompleted(request, started, net_error);
97 }
98 
NotifyURLRequestDestroyed(URLRequest * request)99 void NetworkDelegate::NotifyURLRequestDestroyed(URLRequest* request) {
100   TRACE_EVENT0(NetTracingCategory(),
101                "NetworkDelegate::NotifyURLRequestDestroyed");
102   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
103   DCHECK(request);
104   OnURLRequestDestroyed(request);
105 }
106 
NotifyPACScriptError(int line_number,const std::u16string & error)107 void NetworkDelegate::NotifyPACScriptError(int line_number,
108                                            const std::u16string& error) {
109   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
110   OnPACScriptError(line_number, error);
111 }
112 
AnnotateAndMoveUserBlockedCookies(const URLRequest & request,const net::FirstPartySetMetadata & first_party_set_metadata,net::CookieAccessResultList & maybe_included_cookies,net::CookieAccessResultList & excluded_cookies)113 bool NetworkDelegate::AnnotateAndMoveUserBlockedCookies(
114     const URLRequest& request,
115     const net::FirstPartySetMetadata& first_party_set_metadata,
116     net::CookieAccessResultList& maybe_included_cookies,
117     net::CookieAccessResultList& excluded_cookies) {
118   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
119   bool allowed = OnAnnotateAndMoveUserBlockedCookies(
120       request, first_party_set_metadata, maybe_included_cookies,
121       excluded_cookies);
122   cookie_util::DCheckIncludedAndExcludedCookieLists(maybe_included_cookies,
123                                                     excluded_cookies);
124   return allowed;
125 }
126 
CanSetCookie(const URLRequest & request,const CanonicalCookie & cookie,CookieOptions * options,const net::FirstPartySetMetadata & first_party_set_metadata,CookieInclusionStatus * inclusion_status)127 bool NetworkDelegate::CanSetCookie(
128     const URLRequest& request,
129     const CanonicalCookie& cookie,
130     CookieOptions* options,
131     const net::FirstPartySetMetadata& first_party_set_metadata,
132     CookieInclusionStatus* inclusion_status) {
133   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
134   DCHECK(!(request.load_flags() & LOAD_DO_NOT_SAVE_COOKIES));
135   return OnCanSetCookie(request, cookie, options, first_party_set_metadata,
136                         inclusion_status);
137 }
138 
139 std::optional<cookie_util::StorageAccessStatus>
GetStorageAccessStatus(const URLRequest & request,base::optional_ref<const RedirectInfo> redirect_info) const140 NetworkDelegate::GetStorageAccessStatus(
141     const URLRequest& request,
142     base::optional_ref<const RedirectInfo> redirect_info) const {
143   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
144   return OnGetStorageAccessStatus(request, redirect_info);
145 }
146 
IsStorageAccessHeaderEnabled(const url::Origin * top_frame_origin,const GURL & url) const147 bool NetworkDelegate::IsStorageAccessHeaderEnabled(
148     const url::Origin* top_frame_origin,
149     const GURL& url) const {
150   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
151   return OnIsStorageAccessHeaderEnabled(top_frame_origin, url);
152 }
153 
ForcePrivacyMode(const URLRequest & request) const154 NetworkDelegate::PrivacySetting NetworkDelegate::ForcePrivacyMode(
155     const URLRequest& request) const {
156   TRACE_EVENT0(NetTracingCategory(), "NetworkDelegate::ForcePrivacyMode");
157   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
158   return OnForcePrivacyMode(request);
159 }
160 
CancelURLRequestWithPolicyViolatingReferrerHeader(const URLRequest & request,const GURL & target_url,const GURL & referrer_url) const161 bool NetworkDelegate::CancelURLRequestWithPolicyViolatingReferrerHeader(
162     const URLRequest& request,
163     const GURL& target_url,
164     const GURL& referrer_url) const {
165   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
166   return OnCancelURLRequestWithPolicyViolatingReferrerHeader(
167       request, target_url, referrer_url);
168 }
169 
CanQueueReportingReport(const url::Origin & origin) const170 bool NetworkDelegate::CanQueueReportingReport(const url::Origin& origin) const {
171   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
172   return OnCanQueueReportingReport(origin);
173 }
174 
CanSendReportingReports(std::set<url::Origin> origins,base::OnceCallback<void (std::set<url::Origin>)> result_callback) const175 void NetworkDelegate::CanSendReportingReports(
176     std::set<url::Origin> origins,
177     base::OnceCallback<void(std::set<url::Origin>)> result_callback) const {
178   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
179   OnCanSendReportingReports(std::move(origins), std::move(result_callback));
180 }
181 
CanSetReportingClient(const url::Origin & origin,const GURL & endpoint) const182 bool NetworkDelegate::CanSetReportingClient(const url::Origin& origin,
183                                             const GURL& endpoint) const {
184   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
185   return OnCanSetReportingClient(origin, endpoint);
186 }
187 
CanUseReportingClient(const url::Origin & origin,const GURL & endpoint) const188 bool NetworkDelegate::CanUseReportingClient(const url::Origin& origin,
189                                             const GURL& endpoint) const {
190   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
191   return OnCanUseReportingClient(origin, endpoint);
192 }
193 
194 // static
ExcludeAllCookies(net::CookieInclusionStatus::ExclusionReason reason,net::CookieAccessResultList & maybe_included_cookies,net::CookieAccessResultList & excluded_cookies)195 void NetworkDelegate::ExcludeAllCookies(
196     net::CookieInclusionStatus::ExclusionReason reason,
197     net::CookieAccessResultList& maybe_included_cookies,
198     net::CookieAccessResultList& excluded_cookies) {
199   excluded_cookies.insert(
200       excluded_cookies.end(),
201       std::make_move_iterator(maybe_included_cookies.begin()),
202       std::make_move_iterator(maybe_included_cookies.end()));
203   maybe_included_cookies.clear();
204   // Add the ExclusionReason for all cookies.
205   for (net::CookieWithAccessResult& cookie : excluded_cookies) {
206     cookie.access_result.status.AddExclusionReason(reason);
207   }
208 }
209 
210 // static
ExcludeAllCookiesExceptPartitioned(net::CookieInclusionStatus::ExclusionReason reason,net::CookieAccessResultList & maybe_included_cookies,net::CookieAccessResultList & excluded_cookies)211 void NetworkDelegate::ExcludeAllCookiesExceptPartitioned(
212     net::CookieInclusionStatus::ExclusionReason reason,
213     net::CookieAccessResultList& maybe_included_cookies,
214     net::CookieAccessResultList& excluded_cookies) {
215   // If cookies are not universally disabled, we will preserve partitioned
216   // cookies
217   const auto to_be_moved = base::ranges::stable_partition(
218       maybe_included_cookies, [](const net::CookieWithAccessResult& cookie) {
219         return cookie.cookie.IsPartitioned();
220       });
221   excluded_cookies.insert(
222       excluded_cookies.end(), std::make_move_iterator(to_be_moved),
223       std::make_move_iterator(maybe_included_cookies.end()));
224   maybe_included_cookies.erase(to_be_moved, maybe_included_cookies.end());
225 
226   // Add the ExclusionReason for all excluded cookies.
227   for (net::CookieWithAccessResult& cookie : excluded_cookies) {
228     cookie.access_result.status.AddExclusionReason(reason);
229   }
230 }
231 
232 // static
MoveExcludedCookies(net::CookieAccessResultList & maybe_included_cookies,net::CookieAccessResultList & excluded_cookies)233 void NetworkDelegate::MoveExcludedCookies(
234     net::CookieAccessResultList& maybe_included_cookies,
235     net::CookieAccessResultList& excluded_cookies) {
236   const auto to_be_moved = base::ranges::stable_partition(
237       maybe_included_cookies, [](const CookieWithAccessResult& cookie) {
238         return cookie.access_result.status.IsInclude();
239       });
240   excluded_cookies.insert(
241       excluded_cookies.end(), std::make_move_iterator(to_be_moved),
242       std::make_move_iterator(maybe_included_cookies.end()));
243   maybe_included_cookies.erase(to_be_moved, maybe_included_cookies.end());
244 }
245 }  // namespace net
246