// Copyright 2017 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 COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_WARMUP_URL_FETCHER_H_
#define COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_WARMUP_URL_FETCHER_H_

#include <utility>

#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/optional.h"
#include "base/sequence_checker.h"
#include "base/timer/timer.h"
#include "net/url_request/url_fetcher_delegate.h"

class GURL;

namespace net {

class ProxyServer;
class URLFetcher;
class URLRequestContextGetter;

}  // namespace net

namespace data_reduction_proxy {

// URLFetcherDelegate for fetching the warmup URL.
class WarmupURLFetcher : public net::URLFetcherDelegate {
 public:
  enum class FetchResult { kFailed, kSuccessful, kTimedOut };

  // The proxy server that was used to fetch the request, and whether the fetch
  // was successful.
  typedef base::RepeatingCallback<void(const net::ProxyServer&, FetchResult)>
      WarmupURLFetcherCallback;

  // Callback to obtain the current HTTP RTT estimate.
  typedef base::RepeatingCallback<base::Optional<base::TimeDelta>()>
      GetHttpRttCallback;

  WarmupURLFetcher(const scoped_refptr<net::URLRequestContextGetter>&
                       url_request_context_getter,
                   WarmupURLFetcherCallback callback,
                   GetHttpRttCallback get_http_rtt_callback);

  ~WarmupURLFetcher() override;

  // Creates and starts a URLFetcher that fetches the warmup URL.
  // |previous_attempt_counts| is the count of fetch attempts that have been
  // made to the proxy which is being probed. The fetching may happen after some
  // delay depending on |previous_attempt_counts|.
  void FetchWarmupURL(size_t previous_attempt_counts);

  // Returns true if a warmup URL fetch is currently in-flight.
  bool IsFetchInFlight() const;

 protected:
  // Sets |warmup_url_with_query_params| to the warmup URL. Attaches random
  // query params to the warmup URL.
  void GetWarmupURLWithQueryParam(GURL* warmup_url_with_query_params) const;

  // Returns the time for which the fetching of the warmup URL probe should be
  // delayed.
  virtual base::TimeDelta GetFetchWaitTime() const;

  // Returns the timeout value for fetching the secure proxy URL. Virtualized
  // for testing.
  virtual base::TimeDelta GetFetchTimeout() const;

  // Called when the fetch timeouts.
  void OnFetchTimeout();

  void OnURLFetchComplete(const net::URLFetcher* source) override;

  // The URLFetcher being used for fetching the warmup URL. Protected for
  // testing.
  std::unique_ptr<net::URLFetcher> fetcher_;

  // Timer used to delay the fetching of the warmup probe URL.
  base::OneShotTimer fetch_delay_timer_;

  // Timer to enforce timeout of fetching the warmup URL.
  base::OneShotTimer fetch_timeout_timer_;

  // True if the fetcher for warmup URL is in-flight.
  bool is_fetch_in_flight_;

 private:
  // Creates and immediately starts a URLFetcher that fetches the warmup URL.
  void FetchWarmupURLNow();

  // Resets the variable after the fetching of the warmup URL has completed or
  // timed out. Must be called after |callback_| has been run.
  void CleanupAfterFetch();

  // Count of fetch attempts that have been made to the proxy which is being
  // probed.
  size_t previous_attempt_counts_;

  scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;

  // Callback that should be executed when the fetching of the warmup URL is
  // completed.
  WarmupURLFetcherCallback callback_;

  // Callback to obtain the current HTTP RTT estimate.
  GetHttpRttCallback get_http_rtt_callback_;

  SEQUENCE_CHECKER(sequence_checker_);

  DISALLOW_COPY_AND_ASSIGN(WarmupURLFetcher);
};

}  // namespace data_reduction_proxy

#endif  // COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_WARMUP_URL_FETCHER_H_
