183 lines
		
	
	
	
		
			6.9 KiB
			
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			183 lines
		
	
	
	
		
			6.9 KiB
			
		
	
	
	
		
			C++
		
	
	
	
	
	
// 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 SHELL_BROWSER_NET_ATOM_NETWORK_DELEGATE_H_
 | 
						|
#define SHELL_BROWSER_NET_ATOM_NETWORK_DELEGATE_H_
 | 
						|
 | 
						|
#include <map>
 | 
						|
#include <memory>
 | 
						|
#include <set>
 | 
						|
#include <string>
 | 
						|
#include <vector>
 | 
						|
 | 
						|
#include "base/callback.h"
 | 
						|
#include "base/synchronization/lock.h"
 | 
						|
#include "base/values.h"
 | 
						|
#include "content/public/browser/resource_request_info.h"
 | 
						|
#include "extensions/common/url_pattern.h"
 | 
						|
#include "net/base/network_delegate.h"
 | 
						|
#include "net/http/http_request_headers.h"
 | 
						|
#include "net/http/http_response_headers.h"
 | 
						|
 | 
						|
class URLPattern;
 | 
						|
 | 
						|
namespace electron {
 | 
						|
 | 
						|
using URLPatterns = std::set<URLPattern>;
 | 
						|
 | 
						|
const char* ResourceTypeToString(content::ResourceType type);
 | 
						|
 | 
						|
class LoginHandler;
 | 
						|
 | 
						|
class AtomNetworkDelegate : public net::NetworkDelegate {
 | 
						|
 public:
 | 
						|
  using ResponseCallback =
 | 
						|
      base::OnceCallback<void(const base::DictionaryValue&)>;
 | 
						|
  using SimpleListener =
 | 
						|
      base::RepeatingCallback<void(const base::DictionaryValue&)>;
 | 
						|
  using ResponseListener =
 | 
						|
      base::RepeatingCallback<void(const base::DictionaryValue&,
 | 
						|
                                   ResponseCallback)>;
 | 
						|
 | 
						|
  enum SimpleEvent {
 | 
						|
    kOnSendHeaders,
 | 
						|
    kOnBeforeRedirect,
 | 
						|
    kOnResponseStarted,
 | 
						|
    kOnCompleted,
 | 
						|
    kOnErrorOccurred,
 | 
						|
  };
 | 
						|
 | 
						|
  enum ResponseEvent {
 | 
						|
    kOnBeforeRequest,
 | 
						|
    kOnBeforeSendHeaders,
 | 
						|
    kOnHeadersReceived,
 | 
						|
  };
 | 
						|
 | 
						|
  struct SimpleListenerInfo {
 | 
						|
    URLPatterns url_patterns;
 | 
						|
    SimpleListener listener;
 | 
						|
 | 
						|
    SimpleListenerInfo(URLPatterns, SimpleListener);
 | 
						|
    SimpleListenerInfo();
 | 
						|
    ~SimpleListenerInfo();
 | 
						|
  };
 | 
						|
 | 
						|
  struct ResponseListenerInfo {
 | 
						|
    URLPatterns url_patterns;
 | 
						|
    ResponseListener listener;
 | 
						|
 | 
						|
    ResponseListenerInfo(URLPatterns, ResponseListener);
 | 
						|
    ResponseListenerInfo();
 | 
						|
    ~ResponseListenerInfo();
 | 
						|
  };
 | 
						|
 | 
						|
  AtomNetworkDelegate();
 | 
						|
  ~AtomNetworkDelegate() override;
 | 
						|
 | 
						|
  void SetSimpleListenerInIO(SimpleEvent type,
 | 
						|
                             URLPatterns patterns,
 | 
						|
                             SimpleListener callback);
 | 
						|
  void SetResponseListenerInIO(ResponseEvent type,
 | 
						|
                               URLPatterns patterns,
 | 
						|
                               ResponseListener callback);
 | 
						|
 | 
						|
 protected:
 | 
						|
  // net::NetworkDelegate:
 | 
						|
  int OnBeforeURLRequest(net::URLRequest* request,
 | 
						|
                         net::CompletionOnceCallback callback,
 | 
						|
                         GURL* new_url) override;
 | 
						|
  int OnBeforeStartTransaction(net::URLRequest* request,
 | 
						|
                               net::CompletionOnceCallback callback,
 | 
						|
                               net::HttpRequestHeaders* headers) override;
 | 
						|
  void OnBeforeSendHeaders(net::URLRequest* request,
 | 
						|
                           const net::ProxyInfo& proxy_info,
 | 
						|
                           const net::ProxyRetryInfoMap& proxy_retry_info,
 | 
						|
                           net::HttpRequestHeaders* headers) override {}
 | 
						|
  void OnStartTransaction(net::URLRequest* request,
 | 
						|
                          const net::HttpRequestHeaders& headers) override;
 | 
						|
  int OnHeadersReceived(
 | 
						|
      net::URLRequest* request,
 | 
						|
      net::CompletionOnceCallback callback,
 | 
						|
      const net::HttpResponseHeaders* original_response_headers,
 | 
						|
      scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
 | 
						|
      GURL* allowed_unsafe_redirect_url) override;
 | 
						|
  void OnBeforeRedirect(net::URLRequest* request,
 | 
						|
                        const GURL& new_location) override;
 | 
						|
  void OnResponseStarted(net::URLRequest* request, int net_error) override;
 | 
						|
  void OnNetworkBytesReceived(net::URLRequest* request,
 | 
						|
                              int64_t bytes_read) override {}
 | 
						|
  void OnNetworkBytesSent(net::URLRequest* request,
 | 
						|
                          int64_t bytes_sent) override {}
 | 
						|
  void OnCompleted(net::URLRequest* request,
 | 
						|
                   bool started,
 | 
						|
                   int net_error) override;
 | 
						|
  void OnURLRequestDestroyed(net::URLRequest* request) override;
 | 
						|
  void OnPACScriptError(int line_number, const base::string16& error) override {
 | 
						|
  }
 | 
						|
  AuthRequiredResponse OnAuthRequired(
 | 
						|
      net::URLRequest* request,
 | 
						|
      const net::AuthChallengeInfo& auth_info,
 | 
						|
      AuthCallback callback,
 | 
						|
      net::AuthCredentials* credentials) override;
 | 
						|
  bool OnCanGetCookies(const net::URLRequest& request,
 | 
						|
                       const net::CookieList& cookie_list,
 | 
						|
                       bool allowed_from_caller) override;
 | 
						|
  bool OnCanSetCookie(const net::URLRequest& request,
 | 
						|
                      const net::CanonicalCookie& cookie_line,
 | 
						|
                      net::CookieOptions* options,
 | 
						|
                      bool allowed_from_caller) override;
 | 
						|
  bool OnCanAccessFile(const net::URLRequest& request,
 | 
						|
                       const base::FilePath& original_path,
 | 
						|
                       const base::FilePath& absolute_path) const override;
 | 
						|
  bool OnForcePrivacyMode(const GURL& url,
 | 
						|
                          const GURL& first_party_for_cookies) const override;
 | 
						|
  bool OnCancelURLRequestWithPolicyViolatingReferrerHeader(
 | 
						|
      const net::URLRequest& request,
 | 
						|
      const GURL& target_url,
 | 
						|
      const GURL& referrer_url) const override;
 | 
						|
  bool OnCanQueueReportingReport(const url::Origin& origin) const override;
 | 
						|
  void OnCanSendReportingReports(std::set<url::Origin> origins,
 | 
						|
                                 base::OnceCallback<void(std::set<url::Origin>)>
 | 
						|
                                     result_callback) const override;
 | 
						|
  bool OnCanSetReportingClient(const url::Origin& origin,
 | 
						|
                               const GURL& endpoint) const override;
 | 
						|
  bool OnCanUseReportingClient(const url::Origin& origin,
 | 
						|
                               const GURL& endpoint) const override;
 | 
						|
 | 
						|
 private:
 | 
						|
  void OnErrorOccurred(net::URLRequest* request, bool started, int net_error);
 | 
						|
 | 
						|
  template <typename... Args>
 | 
						|
  void HandleSimpleEvent(SimpleEvent type,
 | 
						|
                         net::URLRequest* request,
 | 
						|
                         Args... args);
 | 
						|
  template <typename Out, typename... Args>
 | 
						|
  int HandleResponseEvent(ResponseEvent type,
 | 
						|
                          net::URLRequest* request,
 | 
						|
                          net::CompletionOnceCallback callback,
 | 
						|
                          Out out,
 | 
						|
                          Args... args);
 | 
						|
 | 
						|
  // Deal with the results of Listener.
 | 
						|
  template <typename T>
 | 
						|
  void OnListenerResultInIO(uint64_t id,
 | 
						|
                            T out,
 | 
						|
                            std::unique_ptr<base::DictionaryValue> response);
 | 
						|
  template <typename T>
 | 
						|
  void OnListenerResultInUI(uint64_t id,
 | 
						|
                            T out,
 | 
						|
                            const base::DictionaryValue& response);
 | 
						|
 | 
						|
  std::map<uint64_t, scoped_refptr<LoginHandler>> login_handler_map_;
 | 
						|
  std::map<SimpleEvent, SimpleListenerInfo> simple_listeners_;
 | 
						|
  std::map<ResponseEvent, ResponseListenerInfo> response_listeners_;
 | 
						|
  std::map<uint64_t, net::CompletionOnceCallback> callbacks_;
 | 
						|
  std::vector<std::string> ignore_connections_limit_domains_;
 | 
						|
 | 
						|
  DISALLOW_COPY_AND_ASSIGN(AtomNetworkDelegate);
 | 
						|
};
 | 
						|
 | 
						|
}  // namespace electron
 | 
						|
 | 
						|
#endif  // SHELL_BROWSER_NET_ATOM_NETWORK_DELEGATE_H_
 |