blob: c34b6021ffe59da76862f80ff3dc684e02f92cbf [file] [log] [blame]
// 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_