31 #ifndef LEDGER_CORE_HTTPCLIENT_HPP 32 #define LEDGER_CORE_HTTPCLIENT_HPP 34 #include "../api/HttpClient.hpp" 35 #include "../api/HttpMethod.hpp" 36 #include "../api/HttpRequest.hpp" 37 #include "../api/HttpUrlConnection.hpp" 38 #include "../api/HttpReadBodyResult.hpp" 39 #include "../api/ExecutionContext.hpp" 40 #include "../utils/optional.hpp" 41 #include <unordered_map> 43 #include "../async/Future.hpp" 44 #include "../async/Promise.hpp" 45 #include "../utils/Either.hpp" 46 #include "HttpUrlConnectionInputStream.hpp" 48 #include "../debug/logger.hpp" 49 #include "../utils/Option.hpp" 51 #include <rapidjson/document.h> 52 #include <rapidjson/reader.h> 57 template <
typename Success,
typename Failure,
class Handler>
60 class HttpRequest :
public std::enable_shared_from_this<HttpRequest> {
62 using JsonResult = std::tuple<std::shared_ptr<api::HttpUrlConnection>, std::shared_ptr<rapidjson::Document>>;
65 const std::string& url,
66 const std::unordered_map<std::string, std::string>& headers,
68 const std::shared_ptr<api::HttpClient> &client,
69 const std::shared_ptr<api::ExecutionContext> &context,
73 template <
typename Success,
typename Failure,
typename Handler>
75 return operator()().recover(_context, [] (
const Exception& exception) {
76 if (exception.getErrorCode() == api::ErrorCode::HTTP_ERROR && exception.getUserData().nonEmpty()) {
82 std::shared_ptr<api::HttpUrlConnection> connection = c;
85 rapidjson::Reader reader;
86 reader.Parse<rapidjson::ParseFlag::kParseNumbersAsStringsFlag>(is, h);
87 return (
Either<Failure, std::shared_ptr<Success>>) h.build();
92 std::shared_ptr<api::HttpRequest> toApiRequest()
const;
96 api::HttpMethod _method;
98 std::unordered_map<std::string, std::string> _headers;
100 std::shared_ptr<api::HttpClient> _client;
101 std::shared_ptr<api::ExecutionContext> _context;
106 ApiRequest(
const std::shared_ptr<const ledger::core::HttpRequest>&
self);
107 virtual api::HttpMethod getMethod()
override;
109 virtual std::unordered_map<std::string, std::string> getHeaders()
override;
111 virtual std::vector<uint8_t> getBody()
override;
113 virtual std::string getUrl()
override;
115 virtual ~ApiRequest();
117 virtual void complete(
const std::shared_ptr<api::HttpUrlConnection> &response,
123 std::shared_ptr<const ledger::core::HttpRequest> _self;
131 const std::shared_ptr<api::HttpClient> &client,
132 const std::shared_ptr<api::ExecutionContext> &context
135 const std::unordered_map<std::string, std::string>& headers = {},
136 const std::string &baseUrl =
"");
137 HttpRequest PUT(
const std::string& path,
const std::vector<uint8_t> &body,
const std::unordered_map<std::string, std::string>& headers = {});
138 HttpRequest DEL(
const std::string& path,
const std::unordered_map<std::string, std::string>& headers = {});
140 const std::vector<uint8_t> &body,
141 const std::unordered_map<std::string, std::string>& headers = {},
142 const std::string &baseUrl =
"");
143 HttpClient& addHeader(
const std::string& key,
const std::string& value);
144 HttpClient& removeHeader(
const std::string& key);
145 void setLogger(
const std::shared_ptr<spdlog::logger>&
logger);
149 const std::string& path,
151 const std::unordered_map<std::string, std::string>& headers,
152 const std::string &baseUrl =
"");
155 std::string _baseUrl;
156 std::shared_ptr<api::HttpClient> _client;
157 std::shared_ptr<api::ExecutionContext> _context;
158 std::unordered_map<std::string, std::string> _headers;
165 #endif //LEDGER_CORE_HTTPCLIENT_HPP Definition: HttpClient.hpp:58
Definition: Either.hpp:43
a class to store JSON values
Definition: json.hpp:231
Definition: Option.hpp:49
Definition: Deffered.hpp:49
Definition: HttpUrlConnection.hpp:23
Definition: Deffered.hpp:52
Definition: Account.cpp:8
Definition: HttpClient.hpp:128
Definition: HttpRequest.hpp:28
Definition: optional.hpp:177
Definition: Exception.hpp:45
Definition: logger.hpp:44
Definition: HttpClient.hpp:60