// Copyright (c) 2015 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_ATOM_NETWORK_DELEGATE_H_ #define ATOM_BROWSER_NET_ATOM_NETWORK_DELEGATE_H_ #include #include #include #include "base/callback.h" #include "base/synchronization/lock.h" #include "base/values.h" #include "brightray/browser/network_delegate.h" #include "content/public/browser/resource_request_info.h" #include "extensions/common/url_pattern.h" #include "net/base/net_errors.h" #include "net/http/http_request_headers.h" #include "net/http/http_response_headers.h" class URLPattern; namespace atom { using URLPatterns = std::set; const char* ResourceTypeToString(content::ResourceType type); class AtomNetworkDelegate : public brightray::NetworkDelegate { public: using ResponseCallback = base::Callback; using SimpleListener = base::Callback; using ResponseListener = base::Callback; enum SimpleEvent { kOnSendHeaders, kOnBeforeRedirect, kOnResponseStarted, kOnCompleted, kOnErrorOccurred, }; enum ResponseEvent { kOnBeforeRequest, kOnBeforeSendHeaders, kOnHeadersReceived, }; struct SimpleListenerInfo { URLPatterns url_patterns; SimpleListener listener; }; struct ResponseListenerInfo { URLPatterns url_patterns; ResponseListener listener; }; AtomNetworkDelegate(); ~AtomNetworkDelegate() override; void SetSimpleListenerInIO(SimpleEvent type, URLPatterns patterns, SimpleListener callback); void SetResponseListenerInIO(ResponseEvent type, URLPatterns patterns, ResponseListener callback); void SetDevToolsNetworkEmulationClientId(const std::string& client_id); protected: // net::NetworkDelegate: int OnBeforeURLRequest(net::URLRequest* request, const net::CompletionCallback& callback, GURL* new_url) override; int OnBeforeStartTransaction(net::URLRequest* request, const net::CompletionCallback& callback, net::HttpRequestHeaders* headers) override; void OnStartTransaction(net::URLRequest* request, const net::HttpRequestHeaders& headers) override; int OnHeadersReceived( net::URLRequest* request, const net::CompletionCallback& callback, const net::HttpResponseHeaders* original_response_headers, scoped_refptr* override_response_headers, GURL* allowed_unsafe_redirect_url) override; void OnBeforeRedirect(net::URLRequest* request, const GURL& new_location) override; void OnResponseStarted(net::URLRequest* request) override; void OnCompleted(net::URLRequest* request, bool started) override; void OnURLRequestDestroyed(net::URLRequest* request) override; private: void OnErrorOccurred(net::URLRequest* request, bool started); template void HandleSimpleEvent(SimpleEvent type, net::URLRequest* request, Args... args); template int HandleResponseEvent(ResponseEvent type, net::URLRequest* request, const net::CompletionCallback& callback, Out out, Args... args); // Deal with the results of Listener. template void OnListenerResultInIO(uint64_t id, T out, std::unique_ptr response); template void OnListenerResultInUI(uint64_t id, T out, const base::DictionaryValue& response); std::map simple_listeners_; std::map response_listeners_; std::map callbacks_; // Client id for devtools network emulation. std::string client_id_; DISALLOW_COPY_AND_ASSIGN(AtomNetworkDelegate); }; } // namespace atom #endif // ATOM_BROWSER_NET_ATOM_NETWORK_DELEGATE_H_