// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef SERVICES_NETWORK_NETWORK_SERVICE_NETWORK_DELEGATE_H_ #define SERVICES_NETWORK_NETWORK_SERVICE_NETWORK_DELEGATE_H_ #include "base/component_export.h" #include "base/memory/raw_ptr.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "net/base/completion_once_callback.h" #include "net/base/network_delegate_impl.h" #include "net/cookies/same_party_context.h" #include "services/network/cookie_settings.h" #include "services/network/network_context.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace net { class SiteForCookies; } // namespace net namespace network { // TODO(mmenke): Look into merging this with URLLoader, and removing the // NetworkDelegate interface. class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkServiceNetworkDelegate : public net::NetworkDelegateImpl { public: // |network_context| is guaranteed to outlive this class. NetworkServiceNetworkDelegate( bool enable_referrers, bool validate_referrer_policy_on_initial_request, mojo::PendingRemote proxy_error_client_remote, NetworkContext* network_context); NetworkServiceNetworkDelegate(const NetworkServiceNetworkDelegate&) = delete; NetworkServiceNetworkDelegate& operator=( const NetworkServiceNetworkDelegate&) = delete; ~NetworkServiceNetworkDelegate() override; void set_enable_referrers(bool enable_referrers) { enable_referrers_ = enable_referrers; } private: using QueryReason = CookieSettings::QueryReason; // net::NetworkDelegateImpl implementation. int OnBeforeURLRequest(net::URLRequest* request, net::CompletionOnceCallback callback, GURL* new_url) override; int OnBeforeStartTransaction( net::URLRequest* request, const net::HttpRequestHeaders& headers, OnBeforeStartTransactionCallback callback) override; int OnHeadersReceived( net::URLRequest* request, net::CompletionOnceCallback callback, const net::HttpResponseHeaders* original_response_headers, scoped_refptr* override_response_headers, const net::IPEndPoint& endpoint, absl::optional* preserve_fragment_on_redirect_url) override; void OnBeforeRedirect(net::URLRequest* request, const GURL& new_location) override; void OnResponseStarted(net::URLRequest* request, int net_error) override; void OnCompleted(net::URLRequest* request, bool started, int net_error) override; void OnPACScriptError(int line_number, const std::u16string& error) override; bool OnAnnotateAndMoveUserBlockedCookies( const net::URLRequest& request, net::CookieAccessResultList& maybe_included_cookies, net::CookieAccessResultList& excluded_cookies) override; bool OnCanSetCookie(const net::URLRequest& request, const net::CanonicalCookie& cookie, net::CookieOptions* options) override; net::NetworkDelegate::PrivacySetting OnForcePrivacyMode( const GURL& url, const net::SiteForCookies& site_for_cookies, const absl::optional& top_frame_origin, net::SamePartyContext::Type same_party_context_type) const override; bool OnCancelURLRequestWithPolicyViolatingReferrerHeader( const net::URLRequest& request, const GURL& target_url, const GURL& referrer_url) const override; bool OnCanQueueReportingReport(const url::Origin& origin) const override; void OnCanSendReportingReports(std::set origins, base::OnceCallback)> result_callback) const override; bool OnCanSetReportingClient(const url::Origin& origin, const GURL& endpoint) const override; bool OnCanUseReportingClient(const url::Origin& origin, const GURL& endpoint) const override; int HandleClearSiteDataHeader( net::URLRequest* request, net::CompletionOnceCallback callback, const net::HttpResponseHeaders* original_response_headers); void FinishedClearSiteData(base::WeakPtr request, net::CompletionOnceCallback callback); void FinishedCanSendReportingReports( base::OnceCallback)> result_callback, const std::vector& origins); void ForwardProxyErrors(int net_error); // Truncates the given request's referrer if required by // related configuration (for instance, the enable_referrers_ // attribute or pertinent features/flags) void MaybeTruncateReferrer(net::URLRequest* request, const GURL& effective_url); bool enable_referrers_; bool validate_referrer_policy_on_initial_request_; mojo::Remote proxy_error_client_; raw_ptr network_context_; mutable base::WeakPtrFactory weak_ptr_factory_{ this}; }; } // namespace network #endif // SERVICES_NETWORK_NETWORK_SERVICE_NETWORK_DELEGATE_H_