// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_BASE_LAYERED_NETWORK_DELEGATE_H_
#define NET_BASE_LAYERED_NETWORK_DELEGATE_H_

#include "base/memory/scoped_ptr.h"
#include "base/strings/string16.h"
#include "net/base/completion_callback.h"
#include "net/base/network_delegate.h"
#include "net/cookies/canonical_cookie.h"

class GURL;

namespace base {
class FilePath;
}

namespace net {

class CookieOptions;
class HttpRequestHeaders;
class HttpResponseHeaders;
class ProxyInfo;
class ProxyServer;
class ProxyService;
class URLRequest;

// WrappingNetworkDelegate takes a |network_delegate| and extends it. When
// On*() is called, the On*Internal() method of this is first called and then
// the On*() of |network_delegate| is called. On*Internal() methods have no
// return values, and cannot prevent calling into the nested network delegate.
class NET_EXPORT LayeredNetworkDelegate : public NetworkDelegate {
 public:
  explicit LayeredNetworkDelegate(
      scoped_ptr<NetworkDelegate> nested_network_delegate);
  ~LayeredNetworkDelegate() override;

  // NetworkDelegate implementation:
  int OnBeforeURLRequest(URLRequest* request,
                         const CompletionCallback& callback,
                         GURL* new_url) final;
  void OnResolveProxy(const GURL& url,
                      int load_flags,
                      const ProxyService& proxy_service,
                      ProxyInfo* result) final;
  void OnProxyFallback(const ProxyServer& bad_proxy, int net_error) final;
  int OnBeforeSendHeaders(URLRequest* request,
                          const CompletionCallback& callback,
                          HttpRequestHeaders* headers) final;
  void OnBeforeSendProxyHeaders(URLRequest* request,
                                const ProxyInfo& proxy_info,
                                HttpRequestHeaders* headers) final;
  void OnSendHeaders(URLRequest* request,
                     const HttpRequestHeaders& headers) final;
  int OnHeadersReceived(
      URLRequest* request,
      const CompletionCallback& callback,
      const HttpResponseHeaders* original_response_headers,
      scoped_refptr<HttpResponseHeaders>* override_response_headers,
      GURL* allowed_unsafe_redirect_url) final;
  void OnBeforeRedirect(URLRequest* request, const GURL& new_location) final;
  void OnResponseStarted(URLRequest* request) final;
  void OnRawBytesRead(const URLRequest& request, int bytes_read) final;
  void OnCompleted(URLRequest* request, bool started) final;
  void OnURLRequestDestroyed(URLRequest* request) final;
  void OnPACScriptError(int line_number, const base::string16& error) final;
  AuthRequiredResponse OnAuthRequired(URLRequest* request,
                                      const AuthChallengeInfo& auth_info,
                                      const AuthCallback& callback,
                                      AuthCredentials* credentials) final;
  bool OnCanGetCookies(const URLRequest& request,
                       const CookieList& cookie_list) final;
  bool OnCanSetCookie(const URLRequest& request,
                      const std::string& cookie_line,
                      CookieOptions* options) final;
  bool OnCanAccessFile(const URLRequest& request,
                       const base::FilePath& path) const final;
  bool OnCanThrottleRequest(const URLRequest& request) const final;
  bool OnCanEnablePrivacyMode(const GURL& url,
                              const GURL& first_party_for_cookies) const final;
  bool OnCancelURLRequestWithPolicyViolatingReferrerHeader(
      const URLRequest& request,
      const GURL& target_url,
      const GURL& referrer_url) const final;

 protected:
  virtual void OnBeforeURLRequestInternal(URLRequest* request,
                                          const CompletionCallback& callback,
                                          GURL* new_url);

  virtual void OnResolveProxyInternal(const GURL& url,
                                      int load_flags,
                                      const ProxyService& proxy_service,
                                      ProxyInfo* result);

  virtual void OnProxyFallbackInternal(const ProxyServer& bad_proxy,
                                       int net_error);

  virtual void OnBeforeSendHeadersInternal(URLRequest* request,
                                           const CompletionCallback& callback,
                                           HttpRequestHeaders* headers);

  virtual void OnBeforeSendProxyHeadersInternal(URLRequest* request,
                                                const ProxyInfo& proxy_info,
                                                HttpRequestHeaders* headers);

  virtual void OnSendHeadersInternal(URLRequest* request,
                                     const HttpRequestHeaders& headers);

  virtual void OnHeadersReceivedInternal(
      URLRequest* request,
      const CompletionCallback& callback,
      const HttpResponseHeaders* original_response_headers,
      scoped_refptr<HttpResponseHeaders>* override_response_headers,
      GURL* allowed_unsafe_redirect_url);

  virtual void OnBeforeRedirectInternal(URLRequest* request,
                                        const GURL& new_location);

  virtual void OnResponseStartedInternal(URLRequest* request);

  virtual void OnRawBytesReadInternal(const URLRequest& request,
                                      int bytes_read);

  virtual void OnCompletedInternal(URLRequest* request, bool started);

  virtual void OnURLRequestDestroyedInternal(URLRequest* request);

  virtual void OnPACScriptErrorInternal(int line_number,
                                        const base::string16& error);

  virtual void OnCanGetCookiesInternal(const URLRequest& request,
                                       const CookieList& cookie_list);

  virtual void OnCanSetCookieInternal(const URLRequest& request,
                                      const std::string& cookie_line,
                                      CookieOptions* options);

  virtual void OnAuthRequiredInternal(URLRequest* request,
                                      const AuthChallengeInfo& auth_info,
                                      const AuthCallback& callback,
                                      AuthCredentials* credentials);

  virtual void OnCanAccessFileInternal(const URLRequest& request,
                                       const base::FilePath& path) const;

  virtual void OnCanThrottleRequestInternal(const URLRequest& request) const;

  virtual void OnCanEnablePrivacyModeInternal(
      const GURL& url,
      const GURL& first_party_for_cookies) const;

  virtual void OnCancelURLRequestWithPolicyViolatingReferrerHeaderInternal(
      const URLRequest& request,
      const GURL& target_url,
      const GURL& referrer_url) const;

 private:
  scoped_ptr<NetworkDelegate> nested_network_delegate_;
};

}  // namespace net

#endif  // NET_BASE_LAYERED_NETWORK_DELEGATE_H_
