// Copyright (c) 2018 GitHub, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #ifndef ELECTRON_SHELL_BROWSER_NET_RESOLVE_PROXY_HELPER_H_ #define ELECTRON_SHELL_BROWSER_NET_RESOLVE_PROXY_HELPER_H_ #include #include #include "base/memory/ref_counted.h" #include "mojo/public/cpp/bindings/receiver.h" #include "services/network/public/mojom/proxy_lookup_client.mojom.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" namespace electron { class ElectronBrowserContext; class ResolveProxyHelper : public base::RefCountedThreadSafe, network::mojom::ProxyLookupClient { public: using ResolveProxyCallback = base::OnceCallback; explicit ResolveProxyHelper(ElectronBrowserContext* browser_context); void ResolveProxy(const GURL& url, ResolveProxyCallback callback); // disable copy ResolveProxyHelper(const ResolveProxyHelper&) = delete; ResolveProxyHelper& operator=(const ResolveProxyHelper&) = delete; protected: ~ResolveProxyHelper() override; private: friend class base::RefCountedThreadSafe; // A PendingRequest is a resolve request that is in progress, or queued. struct PendingRequest { public: PendingRequest(const GURL& url, ResolveProxyCallback callback); PendingRequest(PendingRequest&& pending_request) noexcept; ~PendingRequest(); // disable copy PendingRequest(const PendingRequest&) = delete; PendingRequest& operator=(const PendingRequest&) = delete; PendingRequest& operator=(PendingRequest&& pending_request) noexcept; GURL url; ResolveProxyCallback callback; }; // Starts the first pending request. void StartPendingRequest(); // network::mojom::ProxyLookupClient implementation. void OnProxyLookupComplete( int32_t net_error, const absl::optional& proxy_info) override; // Self-reference. Owned as long as there's an outstanding proxy lookup. scoped_refptr owned_self_; std::deque pending_requests_; // Receiver for the currently in-progress request, if any. mojo::Receiver receiver_{this}; // Weak Ref ElectronBrowserContext* browser_context_; }; } // namespace electron #endif // ELECTRON_SHELL_BROWSER_NET_RESOLVE_PROXY_HELPER_H_