1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef REMOTING_BASE_PROTOBUF_HTTP_REQUEST_H_
#define REMOTING_BASE_PROTOBUF_HTTP_REQUEST_H_
#include <optional>
#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 google::protobuf
namespace remoting {
// A simple unary request.
class ProtobufHttpRequest final : public ProtobufHttpRequestBase {
public:
template <typename ResponseType>
using ResponseCallback =
base::OnceCallback<void(const HttpStatus& status,
std::unique_ptr<ResponseType> response)>;
explicit ProtobufHttpRequest(
std::unique_ptr<ProtobufHttpRequestConfig> config);
~ProtobufHttpRequest() override;
// Sets the amount of time to wait before giving up on a given network request
// and considering it an error. The default value is 30s. Set it to zero to
// disable timeout.
void SetTimeoutDuration(base::TimeDelta timeout_duration);
// Sets the response callback. |ResponseType| needs to be a protobuf message
// type.
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 HttpStatus& status) {
if (!status.ok()) {
response.reset();
}
std::move(callback).Run(status, std::move(response));
},
std::move(response), std::move(callback));
}
private:
// ProtobufHttpRequestBase implementations.
void OnAuthFailed(const HttpStatus& status) override;
void StartRequestInternal(
network::mojom::URLLoaderFactory* loader_factory) override;
base::TimeDelta GetRequestTimeoutDuration() const override;
void OnResponse(std::optional<std::string> response_body);
// Parses |response_body| and writes it to |response_message_|.
HttpStatus ParseResponse(std::optional<std::string> response_body);
void RunResponseCallback(const HttpStatus& status, bool run_invalidator);
base::TimeDelta timeout_duration_ = base::Seconds(30);
base::OnceCallback<void(const HttpStatus&)> response_callback_;
// This is owned by |response_callback_|.
raw_ptr<google::protobuf::MessageLite> response_message_;
};
} // namespace remoting
#endif // REMOTING_BASE_PROTOBUF_HTTP_REQUEST_H_
|