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  bool resolve(char const *name, _in_addr *out);
19 };
20 
22 public:
23  virtual ~WebClientHandler() = default;
24  virtual void checkHeader(WebClient *wc)
25  {
26  (void)wc;
27  }
28  virtual void checkContent(char const *ptr, size_t len)
29  {
30  (void)ptr;
31  (void)len;
32  }
33 };
34 
35 class WebProxy {
36 public:
37  std::string server;
38  bool empty() const
39  {
40  return server.empty();
41  }
42 };
43 
44 struct ResponseHeader;
45 
46 class WebClient {
47 public:
48  class ContentType {
49  public:
50  static constexpr const char *APPLICATION_OCTET_STREAM = "application/octet-stream";
51  static constexpr const char *APPLICATION_X_WWW_FORM_URLENCODED = "application/x-www-form-urlencoded";
52  static constexpr const char *MULTIPART_FORM_DATA = "multipart/form-data";
53  };
54  class URL {
55  friend class WebClient;
56  private:
57  struct Data {
58  std::string full_request;
59  std::string scheme;
60  std::string host;
61  int port = 0;
62  std::string path;
63  } data;
64  public:
65  URL() = default;
66  URL(std::string const &addr);
67  std::string const &scheme() const { return data.scheme; }
68  std::string const &host() const { return data.host; }
69  int port() const { return data.port; }
70  std::string const &path() const { return data.path; }
71  bool isssl() const;
72  };
73  enum HttpVersion {
76  };
77  struct Authorization {
78  enum Type {
81  } type = None;
82  std::string uid;
83  std::string pwd;
84  };
85  class Request {
86  friend class ::WebClient;
87  private:
90  std::vector<std::string> headers;
91  public:
92  Request() = default;
93  Request(std::string const &loc, std::vector<std::string> const &headers = {})
94  : url(loc)
95  , headers(headers)
96  {
97  }
98  void set_location(std::string const &loc)
99  {
100  url = URL(loc);
101  }
102  void set_authorization(Authorization::Type type, std::string const &uid, std::string const &pwd)
103  {
104  auth.type = type;
105  auth.uid = uid;
106  auth.pwd = pwd;
107  }
108  void set_basic_authorization(std::string const &uid, std::string const &pwd)
109  {
111  }
112  void add_header(std::string const &s)
113  {
114  headers.push_back(s);
115  }
116  };
117  class Error {
118  private:
119  std::string msg_;
120  public:
121  Error() = default;
122  Error(std::string const &message)
123  : msg_(message)
124  {
125  }
126  virtual ~Error() = default;
127  std::string what() const
128  {
129  return msg_;
130  }
131  };
132  struct Response {
133  int code = 0;
134  struct Version {
135  unsigned int hi = 0;
136  unsigned int lo = 0;
138  std::vector<std::string> header;
139  std::vector<char> content;
140  };
141  struct Post {
142  std::string content_type;
143  std::string boundary;
144  std::vector<char> data;
145  };
147  std::string type;
148  std::string name;
149  std::string filename;
150  };
151  struct Part {
152  char const *data = nullptr;
153  size_t size = 0;
154  std::string content_type;
157  Part() = default;
158  Part(char const *data, size_t size, std::string const &content_type = {})
159  : data(data)
160  , size(size)
162  {
163  }
165  {
166  content_disposition = cd;
167  }
168  };
169  struct RequestOption {
171  bool keep_alive = true;
172  };
173 private:
174  struct Private;
176  void clear_error();
177  static int get_port(URL const *url, char const *scheme, char const *protocol);
178  void set_default_header(const Request &url, Post const *post, const RequestOption &opt);
179  std::string make_http_request(const Request &url, Post const *post, const WebProxy *proxy, bool https);
180  void parse_http_header(char const *begin, char const *end, std::vector<std::string> *header);
181  void parse_http_header(char const *begin, char const *end, Response *out);
182  bool http_get(const Request &request_req, Post const *post, RequestOption const &opt, ResponseHeader *rh, std::vector<char> *out);
183  bool https_get(const Request &request_url, Post const *post, RequestOption const &opt, ResponseHeader *rh, std::vector<char> *out);
184  bool get(const Request &req, Post const *post, Response *out, WebClientHandler *handler);
185  static void parse_header(std::vector<std::string> const *header, WebClient::Response *res);
186  static std::string header_value(std::vector<std::string> const *header, std::string const &name);
187  void append(char const *ptr, size_t len, std::vector<char> *out, WebClientHandler *handler);
188  void on_end_header(const std::vector<char> *vec, WebClientHandler *handler);
189  void receive_(const RequestOption &opt, std::function<int (char *, int)> const &, ResponseHeader *rh, std::vector<char> *out);
190  void output_debug_string(char const *str);
191  void output_debug_strings(const std::vector<std::string> &vec);
192  static void cleanup();
193  void reset();
194 public:
195  static void initialize();
196  WebClient(WebContext *webcx);
197  ~WebClient();
198  WebClient(WebClient const &) = delete;
199  void operator = (WebClient const &) = delete;
200 
201  void set_http_version(HttpVersion httpver);
202 
203  Error const &error() const;
204  int get(const Request &req, WebClientHandler *handler = nullptr);
205  int post(const Request &req, Post const *post, WebClientHandler *handler = nullptr);
206  void close();
207  void add_header(std::string const &text);
208  Response const &response() const;
209  std::string header_value(std::string const &name) const;
210  std::string content_type() const;
211  size_t content_length() const;
212  char const *content_data() const;
213 
214  static void make_application_www_form_urlencoded(char const *begin, char const *end, WebClient::Post *out);
215  static void make_multipart_form_data(const std::vector<Part> &parts, WebClient::Post *out, std::string const &boundary);
216  static void make_multipart_form_data(char const *data, size_t size, WebClient::Post *out, std::string const &boundary);
217 
218  static std::string quick_get(const std::string &url);
219  static std::string checkip();
220 };
221 
222 class WebContext {
223  friend class WebClient;
224 public:
225 private:
226  struct Private;
228 public:
230  ~WebContext();
231  WebContext(WebContext const &r) = delete;
232  void operator = (WebContext const &r) = delete;
233 
235  void set_keep_alive_enabled(bool f);
236 
237  void set_http_proxy(std::string const &proxy);
238  void set_https_proxy(std::string const &proxy);
239  WebProxy const *http_proxy() const;
240  WebProxy const *https_proxy() const;
241 
242  bool load_cacert(char const *path);
243 
244  void notify_broken_pipe();
245 };
246 
247 #endif
Definition: webclient.h:16
bool resolve(char const *name, _in_addr *out)
Definition: webclient.cpp:101
Definition: webclient.cpp:563
Definition: webclient.h:21
virtual ~WebClientHandler()=default
virtual void checkContent(char const *ptr, size_t len)
Definition: webclient.h:28
virtual void checkHeader(WebClient *wc)
Definition: webclient.h:24
Definition: webclient.h:48
static constexpr const char * APPLICATION_X_WWW_FORM_URLENCODED
Definition: webclient.h:51
static constexpr const char * MULTIPART_FORM_DATA
Definition: webclient.h:52
static constexpr const char * APPLICATION_OCTET_STREAM
Definition: webclient.h:50
Definition: webclient.h:117
virtual ~Error()=default
Error(std::string const &message)
Definition: webclient.h:122
std::string msg_
Definition: webclient.h:119
std::string what() const
Definition: webclient.h:127
Definition: webclient.h:85
void set_basic_authorization(std::string const &uid, std::string const &pwd)
Definition: webclient.h:108
std::vector< std::string > headers
Definition: webclient.h:90
Request(std::string const &loc, std::vector< std::string > const &headers={})
Definition: webclient.h:93
void add_header(std::string const &s)
Definition: webclient.h:112
Authorization auth
Definition: webclient.h:89
void set_authorization(Authorization::Type type, std::string const &uid, std::string const &pwd)
Definition: webclient.h:102
URL url
Definition: webclient.h:88
void set_location(std::string const &loc)
Definition: webclient.h:98
Definition: webclient.h:54
std::string const & path() const
Definition: webclient.h:70
int port() const
Definition: webclient.h:69
URL()=default
std::string const & host() const
Definition: webclient.h:68
bool isssl() const
Definition: webclient.cpp:220
struct WebClient::URL::Data data
std::string const & scheme() const
Definition: webclient.h:67
Definition: webclient.h:46
void output_debug_string(char const *str)
Definition: webclient.cpp:308
static void initialize()
Definition: webclient.cpp:262
static void make_application_www_form_urlencoded(char const *begin, char const *end, WebClient::Post *out)
Definition: webclient.cpp:1284
void parse_http_header(char const *begin, char const *end, std::vector< std::string > *header)
Definition: webclient.cpp:446
void set_http_version(HttpVersion httpver)
Definition: webclient.cpp:257
HttpVersion
Definition: webclient.h:73
@ HTTP_1_0
Definition: webclient.h:74
@ HTTP_1_1
Definition: webclient.h:75
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:703
WebClient(WebContext *webcx)
Definition: webclient.cpp:243
std::string make_http_request(const Request &url, Post const *post, const WebProxy *proxy, bool https)
Definition: webclient.cpp:412
static int get_port(URL const *url, char const *scheme, char const *protocol)
Definition: webclient.cpp:336
static void cleanup()
Definition: webclient.cpp:289
Error const & error() const
Definition: webclient.cpp:326
void append(char const *ptr, size_t len, std::vector< char > *out, WebClientHandler *handler)
Definition: webclient.cpp:509
static std::string quick_get(const std::string &url)
Definition: webclient.cpp:1423
void output_debug_strings(const std::vector< std::string > &vec)
Definition: webclient.cpp:319
void add_header(std::string const &text)
Definition: webclient.cpp:1274
void set_default_header(const Request &url, Post const *post, const RequestOption &opt)
Definition: webclient.cpp:364
void clear_error()
Definition: webclient.cpp:331
size_t content_length() const
Definition: webclient.cpp:1227
static void make_multipart_form_data(const std::vector< Part > &parts, WebClient::Post *out, std::string const &boundary)
Definition: webclient.cpp:1291
Response const & response() const
Definition: webclient.cpp:1279
void on_end_header(const std::vector< char > *vec, WebClientHandler *handler)
Definition: webclient.cpp:498
static std::string checkip()
Definition: webclient.cpp:1434
static std::string header_value(std::vector< std::string > const *header, std::string const &name)
Definition: webclient.cpp:1189
char const * content_data() const
Definition: webclient.cpp:1232
void reset()
Definition: webclient.cpp:299
~WebClient()
Definition: webclient.cpp:251
bool get(const Request &req, Post const *post, Response *out, WebClientHandler *handler)
Definition: webclient.cpp:1075
Private * m
Definition: webclient.h:174
void close()
Definition: webclient.cpp:1250
static void parse_header(std::vector< std::string > const *header, WebClient::Response *res)
Definition: webclient.cpp:1126
void operator=(WebClient const &)=delete
std::string content_type() const
Definition: webclient.cpp:1212
void receive_(const RequestOption &opt, std::function< int(char *, int)> const &, ResponseHeader *rh, std::vector< char > *out)
Definition: webclient.cpp:652
bool https_get(const Request &request_url, Post const *post, RequestOption const &opt, ResponseHeader *rh, std::vector< char > *out)
Definition: webclient.cpp:753
int post(const Request &req, Post const *post, WebClientHandler *handler=nullptr)
Definition: webclient.cpp:1244
Definition: webclient.h:222
void notify_broken_pipe()
Definition: webclient.cpp:1418
WebContext(WebContext const &r)=delete
~WebContext()
Definition: webclient.cpp:1359
bool load_cacert(char const *path)
Definition: webclient.cpp:1408
WebProxy const * http_proxy() const
Definition: webclient.cpp:1389
void set_keep_alive_enabled(bool f)
Definition: webclient.cpp:1372
WebContext(WebClient::HttpVersion httpver)
Definition: webclient.cpp:1347
void set_https_proxy(std::string const &proxy)
Definition: webclient.cpp:1383
Private * m
Definition: webclient.h:226
void set_http_proxy(std::string const &proxy)
Definition: webclient.cpp:1377
void set_http_version(WebClient::HttpVersion httpver)
Definition: webclient.cpp:1367
void operator=(WebContext const &r)=delete
WebProxy const * https_proxy() const
Definition: webclient.cpp:1397
Definition: webclient.h:35
bool empty() const
Definition: webclient.h:38
std::string server
Definition: webclient.h:37
Definition: webclient.h:77
enum WebClient::Authorization::Type type
std::string uid
Definition: webclient.h:82
std::string pwd
Definition: webclient.h:83
Type
Definition: webclient.h:78
@ None
Definition: webclient.h:79
@ Basic
Definition: webclient.h:80
Definition: webclient.h:146
std::string type
Definition: webclient.h:147
std::string name
Definition: webclient.h:148
std::string filename
Definition: webclient.h:149
Definition: webclient.h:151
Part(char const *data, size_t size, std::string const &content_type={})
Definition: webclient.h:158
char const * data
Definition: webclient.h:152
void set_content_disposition(ContentDisposition const &cd)
Definition: webclient.h:164
size_t size
Definition: webclient.h:153
std::string content_type
Definition: webclient.h:154
Part()=default
std::string content_transfer_encoding
Definition: webclient.h:156
ContentDisposition content_disposition
Definition: webclient.h:155
Definition: webclient.h:141
std::string boundary
Definition: webclient.h:143
std::string content_type
Definition: webclient.h:142
std::vector< char > data
Definition: webclient.h:144
Definition: webclient.cpp:228
Definition: webclient.h:169
bool keep_alive
Definition: webclient.h:171
WebClientHandler * handler
Definition: webclient.h:170
Definition: webclient.h:134
unsigned int lo
Definition: webclient.h:136
unsigned int hi
Definition: webclient.h:135
Definition: webclient.h:132
int code
Definition: webclient.h:133
std::vector< char > content
Definition: webclient.h:139
std::vector< std::string > header
Definition: webclient.h:138
struct WebClient::Response::Version version
Definition: webclient.h:57
std::string full_request
Definition: webclient.h:58
std::string host
Definition: webclient.h:60
int port
Definition: webclient.h:61
std::string path
Definition: webclient.h:62
std::string scheme
Definition: webclient.h:59
Definition: webclient.cpp:130
void _in_addr
Definition: webclient.h:13