#ifndef REMOTING_BASE_PROTOBUF_HTTP_REQUEST_H_
#define REMOTING_BASE_PROTOBUF_HTTP_REQUEST_H_
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "remoting/base/protobuf_http_request_base.h"
namespace google::protobuf {
class MessageLite;
}
namespace remoting {
class ProtobufHttpRequest final : public ProtobufHttpRequestBase {
public:
template <typename ResponseType>
using ResponseCallback =
base::OnceCallback<void(const ProtobufHttpStatus& status,
std::unique_ptr<ResponseType> response)>;
explicit ProtobufHttpRequest(
std::unique_ptr<ProtobufHttpRequestConfig> config);
~ProtobufHttpRequest() override;
void SetTimeoutDuration(base::TimeDelta timeout_duration);
template <typename ResponseType>
void SetResponseCallback(ResponseCallback<ResponseType> callback) {
auto response = std::make_unique<ResponseType>();
response_message_ = response.get();
response_callback_ = base::BindOnce(
[](std::unique_ptr<ResponseType> response,
ResponseCallback<ResponseType> callback,
const ProtobufHttpStatus& status) {
if (!status.ok()) {
response.reset();
}
std::move(callback).Run(status, std::move(response));
},
std::move(response), std::move(callback));
}
private:
void OnAuthFailed(const ProtobufHttpStatus& status) override;
void StartRequestInternal(
network::mojom::URLLoaderFactory* loader_factory) override;
base::TimeDelta GetRequestTimeoutDuration() const override;
void OnResponse(std::unique_ptr<std::string> response_body);
ProtobufHttpStatus ParseResponse(std::unique_ptr<std::string> response_body);
void RunResponseCallback(const ProtobufHttpStatus& status);
base::TimeDelta timeout_duration_ = base::Seconds(30);
base::OnceCallback<void(const ProtobufHttpStatus&)> response_callback_;
raw_ptr<google::protobuf::MessageLite> response_message_;
};
}
#endif