// 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 ATOM_BROWSER_NET_RESOLVE_PROXY_HELPER_H_ #define ATOM_BROWSER_NET_RESOLVE_PROXY_HELPER_H_ #include #include #include "base/memory/ref_counted.h" #include "net/proxy_resolution/proxy_resolution_service.h" #include "url/gurl.h" namespace net { class URLRequestContextGetter; } namespace atom { class AtomBrowserContext; class ResolveProxyHelper : public base::RefCountedThreadSafe { public: using ResolveProxyCallback = base::Callback; explicit ResolveProxyHelper(AtomBrowserContext* browser_context); void ResolveProxy(const GURL& url, const ResolveProxyCallback& callback); private: friend class base::RefCountedThreadSafe; // A PendingRequest is a resolve request that is in progress, or queued. struct PendingRequest { public: PendingRequest(const GURL& url, const ResolveProxyCallback& callback); PendingRequest(PendingRequest&& pending_request) noexcept; ~PendingRequest(); PendingRequest& operator=(PendingRequest&& pending_request) noexcept; GURL url; ResolveProxyCallback callback; private: DISALLOW_COPY_AND_ASSIGN(PendingRequest); }; ~ResolveProxyHelper(); // Starts the first pending request. void StartPendingRequest(); void StartPendingRequestInIO(const GURL& url); void OnProxyResolveComplete(int result); void SendProxyResult(const std::string& proxy); net::ProxyInfo proxy_info_; std::deque pending_requests_; scoped_refptr context_getter_; scoped_refptr original_thread_; DISALLOW_COPY_AND_ASSIGN(ResolveProxyHelper); }; } // namespace atom #endif // ATOM_BROWSER_NET_RESOLVE_PROXY_HELPER_H_