10 #ifndef SUPPORTLIB_HTTPCLIENT_H
11 #define SUPPORTLIB_HTTPCLIENT_H
14 #include <boost/beast/core.hpp>
15 #include <boost/beast/http.hpp>
16 #include <boost/asio/connect.hpp>
17 #include <boost/asio/ip/tcp.hpp>
18 #include <boost/asio/ssl/stream.hpp>
24 namespace ssl = boost::asio::ssl;
25 namespace http = boost::beast::http;
59 using tcp = boost::asio::ip::tcp;
61 enum class Version : size_t {
75 HTTPClient::Version version = HTTPClient::Version::v_11,
76 const std::string& userAgent =
"giris_supportlib_http_client",
77 const std::string& contentType =
"application/x-www-form-urlencoded",
78 const std::map<std::string, std::string>& customHead = {}
82 m_UserAgent(userAgent),
83 m_ContentType(contentType),
84 m_CustomHead(customHead){}
90 m_UserAgent = userAgent;
96 m_ContentType = contentType;
114 m_CustomHead = customHead;
127 return m_ContentType;
162 std::vector<char>
HTTPGet(
const std::string & host,
const std::string& port,
const std::string &target =
"/")
164 http::request<http::string_body> req{http::verb::get, target, (size_t)m_Version};
165 req.set(http::field::host, host);
166 req.set(http::field::user_agent, m_UserAgent);
168 for(
const auto& curHead : m_CustomHead)
169 req.set(curHead.first, curHead.second);
171 performRequest(host, port, req);
172 std::ostringstream ostr;
173 ostr << boost::beast::buffers_to_string(m_Res.body().data()); std::string s = ostr.str();
174 return std::vector<char>(s.begin(), s.end());
185 std::vector<char>
HTTPDelete(
const std::string & host,
const std::string& port,
const std::string &target =
"/")
187 http::request<http::string_body> req{http::verb::delete_, target, (size_t)m_Version};
188 req.set(http::field::host, host);
189 req.set(http::field::user_agent, m_UserAgent);
191 for(
const auto& curHead : m_CustomHead)
192 req.set(curHead.first, curHead.second);
194 performRequest(host, port, req);
195 std::ostringstream ostr;
196 ostr << boost::beast::buffers_to_string(m_Res.body().data()); std::string s = ostr.str();
197 return std::vector<char>(s.begin(), s.end());
209 std::vector<char>
HTTPPost(
const std::string & host,
const std::string& port,
const std::string &target,
const std::vector<char>& data)
211 http::request<http::string_body> req{http::verb::post, target, (size_t)m_Version};
212 req.set(http::field::host, host);
213 req.set(http::field::user_agent, m_UserAgent);
214 req.set(http::field::content_type, m_ContentType);
216 for(
const auto& curHead : m_CustomHead)
217 req.set(curHead.first, curHead.second);
219 req.body() = std::string(data.begin(), data.end());
220 req.prepare_payload();
221 performRequest(host, port, req);
222 std::ostringstream ostr;
223 ostr << boost::beast::buffers_to_string(m_Res.body().data()); std::string s = ostr.str();
224 return std::vector<char>(s.begin(), s.end());
236 std::vector<char>
HTTPPost(
const std::string & host,
const std::string& port,
const std::string &target,
const Blob& data)
238 std::vector<char> dat;
239 dat.reserve(data.size());
240 dat.assign(data.begin(), data.end());
241 return HTTPPost(host, port, target, dat);
253 std::vector<char>
HTTPPut(
const std::string & host,
const std::string& port,
const std::string &target,
const std::vector<char>& data)
255 http::request<http::string_body> req{http::verb::put, target, (size_t)m_Version};
256 req.set(http::field::host, host);
257 req.set(http::field::user_agent, m_UserAgent);
258 req.set(http::field::content_type, m_ContentType);
260 for(
const auto& curHead : m_CustomHead)
261 req.set(curHead.first, curHead.second);
263 req.body() = std::string(data.begin(), data.end());
264 req.prepare_payload();
265 performRequest(host, port, req);
266 std::ostringstream ostr;
267 ostr << boost::beast::buffers_to_string(m_Res.body().data()); std::string s = ostr.str();
268 return std::vector<char>(s.begin(), s.end());
280 std::vector<char>
HTTPPut(
const std::string & host,
const std::string& port,
const std::string &target,
const Blob& data)
282 std::vector<char> dat;
283 dat.reserve(data.size());
284 dat.assign(data.begin(), data.end());
285 return HTTPPut(host, port, target, dat);
289 void performRequest(
const std::string& host,
const std::string& port,
const http::request<http::string_body>& req)
291 tcp::resolver resolver{m_Ioc};
292 auto const results = resolver.resolve(host, port);
294 ssl::stream<tcp::socket> stream{m_Ioc, m_Ctx};
295 boost::asio::connect(stream.next_layer(), results.begin(), results.end());
296 stream.handshake(ssl::stream_base::client);
297 http::write(stream, req);
298 http::read(stream, m_Buffer, m_Res);
299 stream.shutdown(m_Ec);
302 tcp::socket stream{m_Ioc};
303 boost::asio::connect(stream, results.begin(), results.end());
304 http::write(stream, req);
305 http::read(stream, m_Buffer, m_Res);
306 stream.shutdown(tcp::socket::shutdown_both, m_Ec);
310 HTTPClient::Version m_Version;
311 std::string m_UserAgent;
312 std::string m_ContentType;
313 ssl::context m_Ctx{ssl::context::sslv23_client};
314 boost::asio::io_context m_Ioc;
315 boost::system::error_code m_Ec;
316 boost::beast::flat_buffer m_Buffer;
317 http::response<http::dynamic_body> m_Res;
318 std::map<std::string, std::string> m_CustomHead;
Binary large object implementation using std::vector<char>.
Base class of all classes.
Binary large object.
Definition: Blob.h:24
Simple HTTP Client.
Definition: HTTPClient.h:58
std::string getUserAgentString() const
Definition: HTTPClient.h:120
void setSSL(bool ssl)
Definition: HTTPClient.h:107
std::vector< char > HTTPGet(const std::string &host, const std::string &port, const std::string &target="/")
Definition: HTTPClient.h:162
std::vector< char > HTTPPost(const std::string &host, const std::string &port, const std::string &target, const std::vector< char > &data)
Definition: HTTPClient.h:209
HTTPClient::Version getVersion() const
Definition: HTTPClient.h:132
void setUserAgentString(const std::string &userAgent)
Definition: HTTPClient.h:89
std::string getContentType() const
Definition: HTTPClient.h:126
boost::system::error_code getError() const
Definition: HTTPClient.h:144
std::vector< char > HTTPDelete(const std::string &host, const std::string &port, const std::string &target="/")
Definition: HTTPClient.h:185
std::vector< char > HTTPPut(const std::string &host, const std::string &port, const std::string &target, const std::vector< char > &data)
Definition: HTTPClient.h:253
std::map< std::string, std::string > getCustomHead() const
Definition: HTTPClient.h:150
void setVersion(const HTTPClient::Version v)
Definition: HTTPClient.h:101
HTTPClient(bool ssl=false, HTTPClient::Version version=HTTPClient::Version::v_11, const std::string &userAgent="giris_supportlib_http_client", const std::string &contentType="application/x-www-form-urlencoded", const std::map< std::string, std::string > &customHead={})
Definition: HTTPClient.h:74
void setCustomHead(std::map< std::string, std::string > customHead)
Definition: HTTPClient.h:113
void setContentType(const std::string &contentType)
Definition: HTTPClient.h:95
std::vector< char > HTTPPut(const std::string &host, const std::string &port, const std::string &target, const Blob &data)
Definition: HTTPClient.h:280
bool getSSL() const
Definition: HTTPClient.h:138
std::vector< char > HTTPPost(const std::string &host, const std::string &port, const std::string &target, const Blob &data)
Definition: HTTPClient.h:236
Base Class of all classes.
Definition: Object.h:33
Namespace for giri's C++ support library.
Definition: Base64.h:47