network_delegate.cc 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/base/network_delegate.h"
  5. #include <utility>
  6. #include "base/logging.h"
  7. #include "base/ranges/algorithm.h"
  8. #include "base/trace_event/trace_event.h"
  9. #include "net/base/load_flags.h"
  10. #include "net/base/net_errors.h"
  11. #include "net/base/trace_constants.h"
  12. #include "net/cookies/cookie_util.h"
  13. #include "net/proxy_resolution/proxy_info.h"
  14. #include "net/url_request/url_request.h"
  15. namespace net {
  16. NetworkDelegate::~NetworkDelegate() {
  17. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  18. }
  19. int NetworkDelegate::NotifyBeforeURLRequest(URLRequest* request,
  20. CompletionOnceCallback callback,
  21. GURL* new_url) {
  22. TRACE_EVENT0(NetTracingCategory(), "NetworkDelegate::NotifyBeforeURLRequest");
  23. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  24. DCHECK(request);
  25. DCHECK(!callback.is_null());
  26. // ClusterFuzz depends on the following VLOG. See: crbug.com/715656
  27. VLOG(1) << "NetworkDelegate::NotifyBeforeURLRequest: " << request->url();
  28. return OnBeforeURLRequest(request, std::move(callback), new_url);
  29. }
  30. int NetworkDelegate::NotifyBeforeStartTransaction(
  31. URLRequest* request,
  32. const HttpRequestHeaders& headers,
  33. OnBeforeStartTransactionCallback callback) {
  34. TRACE_EVENT0(NetTracingCategory(),
  35. "NetworkDelegate::NotifyBeforeStartTransation");
  36. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  37. DCHECK(!callback.is_null());
  38. return OnBeforeStartTransaction(request, headers, std::move(callback));
  39. }
  40. int NetworkDelegate::NotifyHeadersReceived(
  41. URLRequest* request,
  42. CompletionOnceCallback callback,
  43. const HttpResponseHeaders* original_response_headers,
  44. scoped_refptr<HttpResponseHeaders>* override_response_headers,
  45. const IPEndPoint& endpoint,
  46. absl::optional<GURL>* preserve_fragment_on_redirect_url) {
  47. TRACE_EVENT0(NetTracingCategory(), "NetworkDelegate::NotifyHeadersReceived");
  48. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  49. DCHECK(original_response_headers);
  50. DCHECK(!callback.is_null());
  51. DCHECK(!preserve_fragment_on_redirect_url->has_value());
  52. return OnHeadersReceived(request, std::move(callback),
  53. original_response_headers, override_response_headers,
  54. endpoint, preserve_fragment_on_redirect_url);
  55. }
  56. void NetworkDelegate::NotifyResponseStarted(URLRequest* request,
  57. int net_error) {
  58. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  59. DCHECK(request);
  60. OnResponseStarted(request, net_error);
  61. }
  62. void NetworkDelegate::NotifyBeforeRedirect(URLRequest* request,
  63. const GURL& new_location) {
  64. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  65. DCHECK(request);
  66. OnBeforeRedirect(request, new_location);
  67. }
  68. void NetworkDelegate::NotifyCompleted(URLRequest* request,
  69. bool started,
  70. int net_error) {
  71. TRACE_EVENT0(NetTracingCategory(), "NetworkDelegate::NotifyCompleted");
  72. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  73. DCHECK(request);
  74. OnCompleted(request, started, net_error);
  75. }
  76. void NetworkDelegate::NotifyURLRequestDestroyed(URLRequest* request) {
  77. TRACE_EVENT0(NetTracingCategory(),
  78. "NetworkDelegate::NotifyURLRequestDestroyed");
  79. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  80. DCHECK(request);
  81. OnURLRequestDestroyed(request);
  82. }
  83. void NetworkDelegate::NotifyPACScriptError(int line_number,
  84. const std::u16string& error) {
  85. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  86. OnPACScriptError(line_number, error);
  87. }
  88. bool NetworkDelegate::AnnotateAndMoveUserBlockedCookies(
  89. const URLRequest& request,
  90. net::CookieAccessResultList& maybe_included_cookies,
  91. net::CookieAccessResultList& excluded_cookies) {
  92. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  93. bool allowed = OnAnnotateAndMoveUserBlockedCookies(
  94. request, maybe_included_cookies, excluded_cookies);
  95. cookie_util::DCheckIncludedAndExcludedCookieLists(maybe_included_cookies,
  96. excluded_cookies);
  97. return allowed;
  98. }
  99. bool NetworkDelegate::CanSetCookie(const URLRequest& request,
  100. const CanonicalCookie& cookie,
  101. CookieOptions* options) {
  102. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  103. DCHECK(!(request.load_flags() & LOAD_DO_NOT_SAVE_COOKIES));
  104. return OnCanSetCookie(request, cookie, options);
  105. }
  106. NetworkDelegate::PrivacySetting NetworkDelegate::ForcePrivacyMode(
  107. const GURL& url,
  108. const SiteForCookies& site_for_cookies,
  109. const absl::optional<url::Origin>& top_frame_origin,
  110. SamePartyContext::Type same_party_context_type) const {
  111. TRACE_EVENT0(NetTracingCategory(), "NetworkDelegate::ForcePrivacyMode");
  112. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  113. return OnForcePrivacyMode(url, site_for_cookies, top_frame_origin,
  114. same_party_context_type);
  115. }
  116. bool NetworkDelegate::CancelURLRequestWithPolicyViolatingReferrerHeader(
  117. const URLRequest& request,
  118. const GURL& target_url,
  119. const GURL& referrer_url) const {
  120. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  121. return OnCancelURLRequestWithPolicyViolatingReferrerHeader(
  122. request, target_url, referrer_url);
  123. }
  124. bool NetworkDelegate::CanQueueReportingReport(const url::Origin& origin) const {
  125. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  126. return OnCanQueueReportingReport(origin);
  127. }
  128. void NetworkDelegate::CanSendReportingReports(
  129. std::set<url::Origin> origins,
  130. base::OnceCallback<void(std::set<url::Origin>)> result_callback) const {
  131. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  132. OnCanSendReportingReports(std::move(origins), std::move(result_callback));
  133. }
  134. bool NetworkDelegate::CanSetReportingClient(const url::Origin& origin,
  135. const GURL& endpoint) const {
  136. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  137. return OnCanSetReportingClient(origin, endpoint);
  138. }
  139. bool NetworkDelegate::CanUseReportingClient(const url::Origin& origin,
  140. const GURL& endpoint) const {
  141. DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  142. return OnCanUseReportingClient(origin, endpoint);
  143. }
  144. // static
  145. void NetworkDelegate::ExcludeAllCookies(
  146. net::CookieInclusionStatus::ExclusionReason reason,
  147. net::CookieAccessResultList& maybe_included_cookies,
  148. net::CookieAccessResultList& excluded_cookies) {
  149. excluded_cookies.insert(
  150. excluded_cookies.end(),
  151. std::make_move_iterator(maybe_included_cookies.begin()),
  152. std::make_move_iterator(maybe_included_cookies.end()));
  153. maybe_included_cookies.clear();
  154. // Add the ExclusionReason for all cookies.
  155. for (net::CookieWithAccessResult& cookie : excluded_cookies) {
  156. cookie.access_result.status.AddExclusionReason(reason);
  157. }
  158. }
  159. // static
  160. void NetworkDelegate::MoveExcludedCookies(
  161. net::CookieAccessResultList& maybe_included_cookies,
  162. net::CookieAccessResultList& excluded_cookies) {
  163. const auto to_be_moved = base::ranges::stable_partition(
  164. maybe_included_cookies, [](const CookieWithAccessResult& cookie) {
  165. return cookie.access_result.status.IsInclude();
  166. });
  167. excluded_cookies.insert(
  168. excluded_cookies.end(), std::make_move_iterator(to_be_moved),
  169. std::make_move_iterator(maybe_included_cookies.end()));
  170. maybe_included_cookies.erase(to_be_moved, maybe_included_cookies.end());
  171. }
  172. } // namespace net