// Copyright 2019 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 CHROME_UPDATER_WIN_NET_NETWORK_WINHTTP_H_
#define CHROME_UPDATER_WIN_NET_NETWORK_WINHTTP_H_

#include <windows.h>

#include <stdint.h>

#include <memory>
#include <string>
#include <vector>

#include "base/callback.h"
#include "base/files/file.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/strings/string_piece_forward.h"
#include "base/threading/thread_checker.h"
#include "chrome/updater/win/net/scoped_hinternet.h"
#include "components/update_client/network.h"
#include "url/gurl.h"

namespace base {
class SingleThreadTaskRunner;
}

namespace updater {

// Implements a network fetcher in terms of WinHTTP. The class is ref-counted
// as it is accessed from both the main thread and the worker threads in
// WinHTTP.
class NetworkFetcherWinHTTP
    : public base::RefCountedThreadSafe<NetworkFetcherWinHTTP> {
 public:
  using FetchCompleteCallback = base::OnceCallback<void()>;
  using FetchStartedCallback =
      update_client::NetworkFetcher::ResponseStartedCallback;
  using FetchProgressCallback = update_client::NetworkFetcher::ProgressCallback;

  explicit NetworkFetcherWinHTTP(const HINTERNET& session_handle_);

  void Close();

  void PostRequest(
      const GURL& url,
      const std::string& post_data,
      const base::flat_map<std::string, std::string>& post_additional_headers,
      FetchStartedCallback fetch_started_callback,
      FetchProgressCallback fetch_progress_callback,
      FetchCompleteCallback fetch_complete_callback);
  void DownloadToFile(const GURL& url,
                      const base::FilePath& file_path,
                      FetchStartedCallback fetch_started_callback,
                      FetchProgressCallback fetch_progress_callback,
                      FetchCompleteCallback fetch_complete_callback);

  std::string GetResponseBody() const;
  HRESULT GetNetError() const;
  std::string GetHeaderETag() const;
  int64_t GetXHeaderRetryAfterSec() const;
  base::FilePath GetFilePath() const;
  int64_t GetContentSize() const;

 private:
  friend class base::RefCountedThreadSafe<NetworkFetcherWinHTTP>;
  using WriteDataCallback = base::RepeatingCallback<void()>;

  ~NetworkFetcherWinHTTP();

  static void __stdcall WinHttpStatusCallback(HINTERNET handle,
                                              DWORD_PTR context,
                                              DWORD status,
                                              void* info,
                                              DWORD info_len);

  DWORD_PTR context() const { return reinterpret_cast<DWORD_PTR>(this); }

  void StatusCallback(HINTERNET handle,
                      uint32_t status,
                      void* info,
                      uint32_t info_len);

  HRESULT BeginFetch(
      const std::string& data,
      const base::flat_map<std::string, std::string>& additional_headers);
  scoped_hinternet Connect();
  scoped_hinternet OpenRequest();
  HRESULT SendRequest(const std::string& data);
  void SendRequestComplete();
  HRESULT ReceiveResponse();
  void ReceiveResponseComplete();
  HRESULT QueryDataAvailable();
  void QueryDataAvailableComplete(size_t num_bytes_available);
  HRESULT ReadData(size_t num_bytes_available);
  void ReadDataComplete(size_t num_bytes_read);
  void RequestError(const WINHTTP_ASYNC_RESULT* result);

  void WriteDataToMemory();
  void WriteDataToFile();
  bool WriteDataToFileBlocking();
  void WriteDataToFileComplete(bool is_eof);

  THREAD_CHECKER(thread_checker_);
  scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;

  const HINTERNET& session_handle_;  // Owned by NetworkFetcherWinHTTPFactory.
  scoped_hinternet connect_handle_;
  scoped_hinternet request_handle_;

  // Keeps an outstanding reference count on itself as long as there is a
  // valid request handle and the context for the handle is set to this
  // instance.
  scoped_refptr<NetworkFetcherWinHTTP> self_;

  GURL url_;
  bool is_https_ = false;
  std::string host_;
  int port_ = 0;
  std::string path_for_request_;

  GURL final_url_;
  base::StringPiece16 verb_;
  base::StringPiece16 content_type_;
  WriteDataCallback write_data_callback_;
  HRESULT net_error_ = S_OK;
  std::string etag_;
  int64_t xheader_retry_after_sec_ = -1;
  std::vector<char> read_buffer_;
  std::string post_response_body_;
  base::FilePath file_path_;
  base::File file_;
  int64_t content_size_ = 0;

  FetchStartedCallback fetch_started_callback_;
  FetchProgressCallback fetch_progress_callback_;
  FetchCompleteCallback fetch_complete_callback_;

  scoped_refptr<update_client::NetworkFetcherFactory> network_fetcher_factory_;

  DISALLOW_COPY_AND_ASSIGN(NetworkFetcherWinHTTP);
};

}  // namespace updater

#endif  // CHROME_UPDATER_WIN_NET_NETWORK_WINHTTP_H_
