// 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 "brightray/browser/network_delegate.h" #include "base/callback.h" #include "base/values.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" namespace extensions { class URLPattern; } namespace atom { using URLPatterns = std::set; 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, const URLPatterns& patterns, const SimpleListener& callback); void SetResponseListenerInIO(ResponseEvent type, const URLPatterns& patterns, const ResponseListener& callback); protected: // net::NetworkDelegate: int OnBeforeURLRequest(net::URLRequest* request, const net::CompletionCallback& callback, GURL* new_url) override; int OnBeforeSendHeaders(net::URLRequest* request, const net::CompletionCallback& callback, net::HttpRequestHeaders* headers) override; void OnSendHeaders(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 OnErrorOccurred(net::URLRequest* request); private: 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); std::map simple_listeners_; std::map response_listeners_;; DISALLOW_COPY_AND_ASSIGN(AtomNetworkDelegate); }; } // namespace atom #endif // ATOM_BROWSER_NET_ATOM_NETWORK_DELEGATE_H_