Giri's C++ Support Library
C++ library providing everything you need to quickly create awesome applications.
HTTPClient.h
Go to the documentation of this file.
1 
10 #ifndef SUPPORTLIB_HTTPCLIENT_H
11 #define SUPPORTLIB_HTTPCLIENT_H
12 #include "Object.h"
13 #include "Blob.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>
19 #include <iostream>
20 #include <string>
21 #include <map>
22 
23 namespace giri {
24  namespace ssl = boost::asio::ssl;
25  namespace http = boost::beast::http;
26 
58  class HTTPClient : public Object<HTTPClient> {
59  using tcp = boost::asio::ip::tcp;
60  public:
61  enum class Version : size_t {
62  v_10 = 10,
63  v_11 = 11
64  };
74  HTTPClient(bool ssl = false,
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 = {}
79  ) :
80  m_SSL(ssl),
81  m_Version(version),
82  m_UserAgent(userAgent),
83  m_ContentType(contentType),
84  m_CustomHead(customHead){}
85 
89  void setUserAgentString(const std::string & userAgent) {
90  m_UserAgent = userAgent;
91  }
95  void setContentType(const std::string & contentType) {
96  m_ContentType = contentType;
97  }
101  void setVersion(const HTTPClient::Version v) {
102  m_Version = v;
103  }
107  void setSSL(bool ssl){
108  m_SSL = ssl;
109  }
113  void setCustomHead(std::map<std::string, std::string> customHead){
114  m_CustomHead = customHead;
115  }
116 
120  std::string getUserAgentString() const {
121  return m_UserAgent;
122  }
126  std::string getContentType() const {
127  return m_ContentType;
128  }
132  HTTPClient::Version getVersion() const {
133  return m_Version;
134  }
138  bool getSSL() const {
139  return m_SSL;
140  }
144  boost::system::error_code getError() const {
145  return m_Ec;
146  }
150  std::map<std::string, std::string> getCustomHead() const {
151  return m_CustomHead;
152  }
153 
162  std::vector<char> HTTPGet(const std::string & host, const std::string& port, const std::string &target = "/")
163  {
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);
167 
168  for(const auto& curHead : m_CustomHead)
169  req.set(curHead.first, curHead.second);
170 
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());
175  }
176 
185  std::vector<char> HTTPDelete(const std::string & host, const std::string& port, const std::string &target = "/")
186  {
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);
190 
191  for(const auto& curHead : m_CustomHead)
192  req.set(curHead.first, curHead.second);
193 
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());
198  }
199 
209  std::vector<char> HTTPPost(const std::string & host, const std::string& port, const std::string &target, const std::vector<char>& data)
210  {
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);
215 
216  for(const auto& curHead : m_CustomHead)
217  req.set(curHead.first, curHead.second);
218 
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());
225  }
226 
236  std::vector<char> HTTPPost(const std::string & host, const std::string& port, const std::string &target, const Blob& data)
237  {
238  std::vector<char> dat;
239  dat.reserve(data.size());
240  dat.assign(data.begin(), data.end());
241  return HTTPPost(host, port, target, dat);
242  }
243 
253  std::vector<char> HTTPPut(const std::string & host, const std::string& port, const std::string &target, const std::vector<char>& data)
254  {
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);
259 
260  for(const auto& curHead : m_CustomHead)
261  req.set(curHead.first, curHead.second);
262 
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());
269  }
270 
280  std::vector<char> HTTPPut(const std::string & host, const std::string& port, const std::string &target, const Blob& data)
281  {
282  std::vector<char> dat;
283  dat.reserve(data.size());
284  dat.assign(data.begin(), data.end());
285  return HTTPPut(host, port, target, dat);
286  }
287 
288  private:
289  void performRequest(const std::string& host, const std::string& port, const http::request<http::string_body>& req)
290  {
291  tcp::resolver resolver{m_Ioc};
292  auto const results = resolver.resolve(host, port);
293  if(m_SSL){
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);
300  }
301  else{
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);
307  }
308  }
309  bool m_SSL;
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;
319  };
320 }
321 #endif //SUPPORTLIB_HTTPCLIENT_H
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