Clio develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
RequestBuilder.hpp
1//------------------------------------------------------------------------------
2/*
3 This file is part of clio: https://github.com/XRPLF/clio
4 Copyright (c) 2024, the clio developers.
5
6 Permission to use, copy, modify, and distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
20#pragma once
21
22#include "util/log/Logger.hpp"
23#include "util/requests/Types.hpp"
24
25#include <boost/asio/spawn.hpp>
26#include <boost/asio/ssl/context.hpp>
27#include <boost/beast.hpp>
28#include <boost/beast/core/error.hpp>
29#include <boost/beast/http/field.hpp>
30#include <boost/beast/http/message.hpp>
31#include <boost/beast/http/string_body.hpp>
32#include <boost/beast/http/verb.hpp>
33
34#include <chrono>
35#include <expected>
36#include <string>
37#include <string_view>
38#include <vector>
39
40namespace util::requests {
41
46 util::Logger log_{"RequestBuilder"};
47 std::string host_;
48 std::string port_;
49 std::chrono::milliseconds timeout_{kDEFAULT_TIMEOUT};
50 boost::beast::http::request<boost::beast::http::string_body> request_;
51
52public:
59 RequestBuilder(std::string host, std::string port);
60
68 addHeader(HttpHeader const& header);
69
77 addHeaders(std::vector<HttpHeader> const& headers);
78
86 addData(std::string data);
87
97 setTimeout(std::chrono::milliseconds timeout);
98
108 setTarget(std::string_view target);
109
119 std::expected<std::string, RequestError>
120 getSsl(boost::asio::yield_context yield);
121
131 std::expected<std::string, RequestError>
132 getPlain(boost::asio::yield_context yield);
133
144 std::expected<std::string, RequestError>
145 get(boost::asio::yield_context yield);
146
156 std::expected<std::string, RequestError>
157 postSsl(boost::asio::yield_context yield);
158
168 std::expected<std::string, RequestError>
169 postPlain(boost::asio::yield_context yield);
170
181 std::expected<std::string, RequestError>
182 post(boost::asio::yield_context yield);
183
184 static constexpr std::chrono::milliseconds kDEFAULT_TIMEOUT{30000};
186private:
187 std::expected<std::string, RequestError>
188 doSslRequest(boost::asio::yield_context yield, boost::beast::http::verb method);
189
190 std::expected<std::string, RequestError>
191 doPlainRequest(boost::asio::yield_context yield, boost::beast::http::verb method);
192
193 std::expected<std::string, RequestError>
194 doRequest(boost::asio::yield_context yield, boost::beast::http::verb method);
195
196 template <typename StreamDataType>
197 std::expected<std::string, RequestError>
198 doRequestImpl(StreamDataType&& streamData, boost::asio::yield_context yield, boost::beast::http::verb method);
199};
200
201} // namespace util::requests
A simple thread-safe logger for the channel specified in the constructor.
Definition Logger.hpp:110
Builder for HTTP requests.
Definition RequestBuilder.hpp:45
static constexpr std::chrono::milliseconds kDEFAULT_TIMEOUT
Definition RequestBuilder.hpp:184
RequestBuilder & addHeaders(std::vector< HttpHeader > const &headers)
Add headers to the request.
Definition RequestBuilder.cpp:71
std::expected< std::string, RequestError > get(boost::asio::yield_context yield)
Perform a GET request asynchronously. The SSL will be used first, if it fails, the plain connection w...
Definition RequestBuilder.cpp:113
std::expected< std::string, RequestError > postSsl(boost::asio::yield_context yield)
Perform a POST request with SSL asynchronously.
Definition RequestBuilder.cpp:119
RequestBuilder & addHeader(HttpHeader const &header)
Add a header to the request.
Definition RequestBuilder.cpp:64
std::expected< std::string, RequestError > postPlain(boost::asio::yield_context yield)
Perform a POST request without SSL asynchronously.
Definition RequestBuilder.cpp:125
std::expected< std::string, RequestError > getPlain(boost::asio::yield_context yield)
Perform a GET request without SSL asynchronously.
Definition RequestBuilder.cpp:107
std::expected< std::string, RequestError > getSsl(boost::asio::yield_context yield)
Perform a GET request with SSL asynchronously.
Definition RequestBuilder.cpp:101
RequestBuilder(std::string host, std::string port)
Construct a new Request Builder object.
Definition RequestBuilder.cpp:57
std::expected< std::string, RequestError > post(boost::asio::yield_context yield)
Perform a POST request asynchronously. The SSL will be used first, if it fails, the plain connection ...
Definition RequestBuilder.cpp:131
RequestBuilder & addData(std::string data)
Add body or data to the request.
Definition RequestBuilder.cpp:79
RequestBuilder & setTimeout(std::chrono::milliseconds timeout)
Set the timeout for the request.
Definition RequestBuilder.cpp:87
RequestBuilder & setTarget(std::string_view target)
Set the target for the request.
Definition RequestBuilder.cpp:94
This namespace implements the data access layer and related components.
Definition AmendmentCenter.cpp:70
HTTP header.
Definition Types.hpp:70