Guitar
webclient.h
Go to the documentation of this file.
1 
2 #ifndef WEBCLIENT_H_
3 #define WEBCLIENT_H_
4 
5 #include <vector>
6 #include <string>
7 #include <functional>
8 
9 #define USE_OPENSSL 1
10 #define OPENSSL_NO_SHA1 1
11 
12 class WebContext;
13 class WebClient;
14 
15 typedef void _in_addr;
17 public:
18  enum Type {
19  IN4,
20  IN6,
21  };
22  typedef void _in_addr;
23  typedef void _in6_addr;
24  struct Addr {
26  std::vector<std::vector<char>> addr;
27  size_t size() const
28  {
29  return addr.size();
30  }
31  bool empty() const
32  {
33  return size() == 0;
34  }
35  operator bool () const
36  {
37  return !empty();
38  }
39  _in_addr const *to_in4(size_t i) const
40  {
41  return reinterpret_cast<_in_addr const *>(addr[i].data());
42  }
43  _in6_addr const *to_in6(size_t i) const
44  {
45  return reinterpret_cast<_in6_addr const *>(addr[i].data());
46  }
47  };
48  bool resolve(char const *name, Type type, Addr *out);
49 };
50 
52 public:
53  virtual ~WebClientHandler() = default;
54  virtual void checkHeader(WebClient *wc)
55  {
56  (void)wc;
57  }
58  virtual void checkContent(char const *ptr, size_t len)
59  {
60  (void)ptr;
61  (void)len;
62  }
63 };
64 
65 class WebProxy {
66 public:
67  std::string server;
68  bool empty() const
69  {
70  return server.empty();
71  }
72 };
73 
74 struct ResponseHeader;
75 
76 class WebClient {
77 public:
78  class ContentType {
79  public:
80  static constexpr const char *APPLICATION_OCTET_STREAM = "application/octet-stream";
81  static constexpr const char *APPLICATION_X_WWW_FORM_URLENCODED = "application/x-www-form-urlencoded";
82  static constexpr const char *MULTIPART_FORM_DATA = "multipart/form-data";
83  };
84  class URL {
85  friend class WebClient;
86  private:
87  struct Data {
88  std::string full_request;
89  std::string scheme;
90  std::string host;
91  int port = 0;
92  std::string path;
93  } data;
94  public:
95  URL() = default;
96  URL(std::string const &addr);
97  std::string const &scheme() const { return data.scheme; }
98  std::string const &host() const { return data.host; }
99  int port() const { return data.port; }
100  std::string const &path() const { return data.path; }
101  bool isssl() const;
102  };
103  enum HttpVersion {
106  };
107  struct Authorization {
108  enum Type {
111  } type = None;
112  std::string uid;
113  std::string pwd;
114  };
115  class Request {
116  friend class ::WebClient;
117  private:
120  std::vector<std::string> headers;
121  public:
122  Request() = default;
123  Request(std::string const &loc, std::vector<std::string> const &headers = {})
124  : url(loc)
125  , headers(headers)
126  {
127  }
128  void set_location(std::string const &loc)
129  {
130  url = URL(loc);
131  }
132  void set_authorization(Authorization::Type type, std::string const &uid, std::string const &pwd)
133  {
134  auth.type = type;
135  auth.uid = uid;
136  auth.pwd = pwd;
137  }
138  void set_basic_authorization(std::string const &uid, std::string const &pwd)
139  {
141  }
142  void add_header(std::string const &s)
143  {
144  headers.push_back(s);
145  }
146  };
147  class Error {
148  private:
149  std::string msg_;
150  public:
151  Error() = default;
152  Error(std::string const &message)
153  : msg_(message)
154  {
155  }
156  virtual ~Error() = default;
157  std::string what() const
158  {
159  return msg_;
160  }
161  };
162  struct Response {
163  int code = 0;
164  struct Version {
165  unsigned int hi = 0;
166  unsigned int lo = 0;
168  std::vector<std::string> header;
169  std::vector<char> content;
170  };
171  struct Post {
172  std::string content_type;
173  std::string boundary;
174  std::vector<char> data;
175  };
177  std::string type;
178  std::string name;
179  std::string filename;
180  };
181  struct Part {
182  char const *data = nullptr;
183  size_t size = 0;
184  std::string content_type;
187  Part() = default;
188  Part(char const *data, size_t size, std::string const &content_type = {})
189  : data(data)
190  , size(size)
192  {
193  }
195  {
196  content_disposition = cd;
197  }
198  };
199  struct RequestOption {
201  bool keep_alive = true;
202  };
203 private:
204  struct Private;
206  void clear_error();
207  static int get_port(URL const *url, char const *scheme, char const *protocol);
208  void set_default_header(const Request &url, Post const *post, const RequestOption &opt);
209  std::string make_http_request(const Request &url, Post const *post, const WebProxy *proxy, bool https);
210  void parse_http_header(char const *begin, char const *end, std::vector<std::string> *header);
211  void parse_http_header(char const *begin, char const *end, Response *out);
212  bool http_get(const Request &request_req, Post const *post, RequestOption const &opt, ResponseHeader *rh, std::vector<char> *out);
213  bool https_get(const Request &request_url, Post const *post, RequestOption const &opt, ResponseHeader *rh, std::vector<char> *out);
214  bool get(const Request &req, Post const *post, Response *out, WebClientHandler *handler);
215  static void parse_header(std::vector<std::string> const *header, WebClient::Response *res);
216  static std::string header_value(std::vector<std::string> const *header, std::string const &name);
217  void append(char const *ptr, size_t len, std::vector<char> *out, WebClientHandler *handler);
218  void on_end_header(const std::vector<char> *vec, WebClientHandler *handler);
219  void receive_(const RequestOption &opt, std::function<int (char *, int)> const &, ResponseHeader *rh, std::vector<char> *out);
220  void output_debug_string(char const *str);
221  void output_debug_strings(const std::vector<std::string> &vec);
222  static void cleanup();
223  void reset();
224 public:
225  static void initialize();
226  WebClient(WebContext *webcx);
227  ~WebClient();
228  WebClient(WebClient const &) = delete;
229  void operator = (WebClient const &) = delete;
230 
231  void set_http_version(HttpVersion httpver);
232 
233  Error const &error() const;
234  int get(const Request &req, WebClientHandler *handler = nullptr);
235  int post(const Request &req, Post const *post, WebClientHandler *handler = nullptr);
236  void close();
237  void add_header(std::string const &text);
238  Response const &response() const;
239  std::string header_value(std::string const &name) const;
240  std::string content_type() const;
241  size_t content_length() const;
242  char const *content_data() const;
243 
244  static void make_application_www_form_urlencoded(char const *begin, char const *end, WebClient::Post *out);
245  static void make_multipart_form_data(const std::vector<Part> &parts, WebClient::Post *out, std::string const &boundary);
246  static void make_multipart_form_data(char const *data, size_t size, WebClient::Post *out, std::string const &boundary);
247 
248  static std::string quick_get(const std::string &url);
249  static std::string checkip();
250 };
251 
252 class WebContext {
253  friend class WebClient;
254 public:
255 private:
256  struct Private;
258 public:
260  ~WebContext();
261  WebContext(WebContext const &r) = delete;
262  void operator = (WebContext const &r) = delete;
263 
265  void set_keep_alive_enabled(bool f);
266 
267  void set_http_proxy(std::string const &proxy);
268  void set_https_proxy(std::string const &proxy);
269  WebProxy const *http_proxy() const;
270  WebProxy const *https_proxy() const;
271 
272  bool load_cacert(char const *path);
273 
274  void notify_broken_pipe();
275 };
276 
277 #endif
Definition: webclient.h:16
void _in_addr
Definition: webclient.h:22
Type
Definition: webclient.h:18
@ IN4
Definition: webclient.h:19
@ IN6
Definition: webclient.h:20
bool resolve(char const *name, Type type, Addr *out)
Definition: webclient.cpp:105
void _in6_addr
Definition: webclient.h:23
Definition: webclient.cpp:611
Definition: webclient.h:51
virtual ~WebClientHandler()=default
virtual void checkContent(char const *ptr, size_t len)
Definition: webclient.h:58
virtual void checkHeader(WebClient *wc)
Definition: webclient.h:54
Definition: webclient.h:78
static constexpr const char * APPLICATION_X_WWW_FORM_URLENCODED
Definition: webclient.h:81
static constexpr const char * MULTIPART_FORM_DATA
Definition: webclient.h:82
static constexpr const char * APPLICATION_OCTET_STREAM
Definition: webclient.h:80
Definition: webclient.h:147
virtual ~Error()=default
Error(std::string const &message)
Definition: webclient.h:152
std::string msg_
Definition: webclient.h:149
std::string what() const
Definition: webclient.h:157
Definition: webclient.h:115
void set_basic_authorization(std::string const &uid, std::string const &pwd)
Definition: webclient.h:138
std::vector< std::string > headers
Definition: webclient.h:120
Request(std::string const &loc, std::vector< std::string > const &headers={})
Definition: webclient.h:123
void add_header(std::string const &s)
Definition: webclient.h:142
Authorization auth
Definition: webclient.h:119
void set_authorization(Authorization::Type type, std::string const &uid, std::string const &pwd)
Definition: webclient.h:132
URL url
Definition: webclient.h:118
void set_location(std::string const &loc)
Definition: webclient.h:128
Definition: webclient.h:84
std::string const & path() const
Definition: webclient.h:100
int port() const
Definition: webclient.h:99
URL()=default
std::string const & host() const
Definition: webclient.h:98
bool isssl() const
Definition: webclient.cpp:268
struct WebClient::URL::Data data
std::string const & scheme() const
Definition: webclient.h:97
Definition: webclient.h:76
void output_debug_string(char const *str)
Definition: webclient.cpp:356
static void initialize()
Definition: webclient.cpp:310
static void make_application_www_form_urlencoded(char const *begin, char const *end, WebClient::Post *out)
Definition: webclient.cpp:1417
void parse_http_header(char const *begin, char const *end, std::vector< std::string > *header)
Definition: webclient.cpp:494
void set_http_version(HttpVersion httpver)
Definition: webclient.cpp:305
HttpVersion
Definition: webclient.h:103
@ HTTP_1_0
Definition: webclient.h:104
@ HTTP_1_1
Definition: webclient.h:105
WebClient(WebClient const &)=delete
bool http_get(const Request &request_req, Post const *post, RequestOption const &opt, ResponseHeader *rh, std::vector< char > *out)
Definition: webclient.cpp:836
WebClient(WebContext *webcx)
Definition: webclient.cpp:291
std::string make_http_request(const Request &url, Post const *post, const WebProxy *proxy, bool https)
Definition: webclient.cpp:460
static int get_port(URL const *url, char const *scheme, char const *protocol)
Definition: webclient.cpp:384
static void cleanup()
Definition: webclient.cpp:337
Error const & error() const
Definition: webclient.cpp:374
void append(char const *ptr, size_t len, std::vector< char > *out, WebClientHandler *handler)
Definition: webclient.cpp:557
static std::string quick_get(const std::string &url)
Definition: webclient.cpp:1556
void output_debug_strings(const std::vector< std::string > &vec)
Definition: webclient.cpp:367
void add_header(std::string const &text)
Definition: webclient.cpp:1407
void set_default_header(const Request &url, Post const *post, const RequestOption &opt)
Definition: webclient.cpp:412
void clear_error()
Definition: webclient.cpp:379
size_t content_length() const
Definition: webclient.cpp:1360
static void make_multipart_form_data(const std::vector< Part > &parts, WebClient::Post *out, std::string const &boundary)
Definition: webclient.cpp:1424
Response const & response() const
Definition: webclient.cpp:1412
void on_end_header(const std::vector< char > *vec, WebClientHandler *handler)
Definition: webclient.cpp:546
static std::string checkip()
Definition: webclient.cpp:1567
static std::string header_value(std::vector< std::string > const *header, std::string const &name)
Definition: webclient.cpp:1322
char const * content_data() const
Definition: webclient.cpp:1365
void reset()
Definition: webclient.cpp:347
~WebClient()
Definition: webclient.cpp:299
bool get(const Request &req, Post const *post, Response *out, WebClientHandler *handler)
Definition: webclient.cpp:1208
Private * m
Definition: webclient.h:204
void close()
Definition: webclient.cpp:1383
static void parse_header(std::vector< std::string > const *header, WebClient::Response *res)
Definition: webclient.cpp:1259
void operator=(WebClient const &)=delete
std::string content_type() const
Definition: webclient.cpp:1345
void receive_(const RequestOption &opt, std::function< int(char *, int)> const &, ResponseHeader *rh, std::vector< char > *out)
Definition: webclient.cpp:700
bool https_get(const Request &request_url, Post const *post, RequestOption const &opt, ResponseHeader *rh, std::vector< char > *out)
Definition: webclient.cpp:886
int post(const Request &req, Post const *post, WebClientHandler *handler=nullptr)
Definition: webclient.cpp:1377
Definition: webclient.h:252
void notify_broken_pipe()
Definition: webclient.cpp:1551
WebContext(WebContext const &r)=delete
~WebContext()
Definition: webclient.cpp:1492
bool load_cacert(char const *path)
Definition: webclient.cpp:1541
WebProxy const * http_proxy() const
Definition: webclient.cpp:1522
void set_keep_alive_enabled(bool f)
Definition: webclient.cpp:1505
WebContext(WebClient::HttpVersion httpver)
Definition: webclient.cpp:1480
void set_https_proxy(std::string const &proxy)
Definition: webclient.cpp:1516
Private * m
Definition: webclient.h:256
void set_http_proxy(std::string const &proxy)
Definition: webclient.cpp:1510
void set_http_version(WebClient::HttpVersion httpver)
Definition: webclient.cpp:1500
void operator=(WebContext const &r)=delete
WebProxy const * https_proxy() const
Definition: webclient.cpp:1530
Definition: webclient.h:65
bool empty() const
Definition: webclient.h:68
std::string server
Definition: webclient.h:67
Definition: webclient.h:24
size_t size() const
Definition: webclient.h:27
bool empty() const
Definition: webclient.h:31
std::vector< std::vector< char > > addr
Definition: webclient.h:26
_in_addr const * to_in4(size_t i) const
Definition: webclient.h:39
Type type
Definition: webclient.h:25
_in6_addr const * to_in6(size_t i) const
Definition: webclient.h:43
Definition: webclient.h:107
enum WebClient::Authorization::Type type
std::string uid
Definition: webclient.h:112
std::string pwd
Definition: webclient.h:113
Type
Definition: webclient.h:108
@ None
Definition: webclient.h:109
@ Basic
Definition: webclient.h:110
Definition: webclient.h:176
std::string type
Definition: webclient.h:177
std::string name
Definition: webclient.h:178
std::string filename
Definition: webclient.h:179
Definition: webclient.h:181
Part(char const *data, size_t size, std::string const &content_type={})
Definition: webclient.h:188
char const * data
Definition: webclient.h:182
void set_content_disposition(ContentDisposition const &cd)
Definition: webclient.h:194
size_t size
Definition: webclient.h:183
std::string content_type
Definition: webclient.h:184
Part()=default
std::string content_transfer_encoding
Definition: webclient.h:186
ContentDisposition content_disposition
Definition: webclient.h:185
Definition: webclient.h:171
std::string boundary
Definition: webclient.h:173
std::string content_type
Definition: webclient.h:172
std::vector< char > data
Definition: webclient.h:174
Definition: webclient.cpp:276
Definition: webclient.h:199
bool keep_alive
Definition: webclient.h:201
WebClientHandler * handler
Definition: webclient.h:200
Definition: webclient.h:164
unsigned int lo
Definition: webclient.h:166
unsigned int hi
Definition: webclient.h:165
Definition: webclient.h:162
int code
Definition: webclient.h:163
std::vector< char > content
Definition: webclient.h:169
std::vector< std::string > header
Definition: webclient.h:168
struct WebClient::Response::Version version
Definition: webclient.h:87
std::string full_request
Definition: webclient.h:88
std::string host
Definition: webclient.h:90
int port
Definition: webclient.h:91
std::string path
Definition: webclient.h:92
std::string scheme
Definition: webclient.h:89
Definition: webclient.cpp:178
void _in_addr
Definition: webclient.h:13