// 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_PROXY_DELEGATE_H_ #define SERVICES_NETWORK_NETWORK_SERVICE_PROXY_DELEGATE_H_ #include #include "base/component_export.h" #include "base/macros.h" #include "mojo/public/cpp/bindings/receiver.h" #include "net/base/proxy_delegate.h" #include "services/network/public/mojom/network_context.mojom.h" namespace net { class HttpRequestHeaders; class ProxyResolutionService; } // namespace net namespace network { // NetworkServiceProxyDelegate is used to support the custom proxy // configuration, which can be set in // NetworkContextParams.custom_proxy_config_client_receiver. class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkServiceProxyDelegate : public net::ProxyDelegate, public mojom::CustomProxyConfigClient { public: explicit NetworkServiceProxyDelegate( mojom::CustomProxyConfigPtr initial_config, mojo::PendingReceiver config_client_receiver); ~NetworkServiceProxyDelegate() override; void SetProxyResolutionService( net::ProxyResolutionService* proxy_resolution_service) { proxy_resolution_service_ = proxy_resolution_service; } // net::ProxyDelegate implementation: void OnResolveProxy(const GURL& url, const std::string& method, const net::ProxyRetryInfoMap& proxy_retry_info, net::ProxyInfo* result) override; void OnFallback(const net::ProxyServer& bad_proxy, int net_error) override; void OnBeforeTunnelRequest(const net::ProxyServer& proxy_server, net::HttpRequestHeaders* extra_headers) override; net::Error OnTunnelHeadersReceived( const net::ProxyServer& proxy_server, const net::HttpResponseHeaders& response_headers) override; private: // Checks whether |proxy_server| is present in the current proxy config. bool IsInProxyConfig(const net::ProxyServer& proxy_server) const; // Whether the current config may proxy |url|. bool MayProxyURL(const GURL& url) const; // Whether the HTTP |method| with current |proxy_info| is eligible to be // proxied. bool EligibleForProxy(const net::ProxyInfo& proxy_info, const std::string& method) const; // mojom::CustomProxyConfigClient implementation: void OnCustomProxyConfigUpdated( mojom::CustomProxyConfigPtr proxy_config) override; void MarkProxiesAsBad(base::TimeDelta bypass_duration, const net::ProxyList& bad_proxies, MarkProxiesAsBadCallback callback) override; void ClearBadProxiesCache() override; mojom::CustomProxyConfigPtr proxy_config_; mojo::Receiver receiver_; net::ProxyResolutionService* proxy_resolution_service_ = nullptr; DISALLOW_COPY_AND_ASSIGN(NetworkServiceProxyDelegate); }; } // namespace network #endif // SERVICES_NETWORK_NETWORK_SERVICE_PROXY_DELEGATE_H_