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 
16 public:
17  virtual ~WebClientHandler() = default;
18  virtual void checkHeader(WebClient *wc)
19  {
20  (void)wc;
21  }
22  virtual void checkContent(char const *ptr, size_t len)
23  {
24  (void)ptr;
25  (void)len;
26  }
27 };
28 
29 class WebProxy {
30 public:
31  std::string server;
32  bool empty() const
33  {
34  return server.empty();
35  }
36 };
37 
38 struct ResponseHeader;
39 
40 class WebClient {
41 public:
42  class ContentType {
43  public:
44  static constexpr const char *APPLICATION_OCTET_STREAM = "application/octet-stream";
45  static constexpr const char *APPLICATION_X_WWW_FORM_URLENCODED = "application/x-www-form-urlencoded";
46  static constexpr const char *MULTIPART_FORM_DATA = "multipart/form-data";
47  };
48  class URL {
49  friend class WebClient;
50  private:
51  struct Data {
52  std::string full_request;
53  std::string scheme;
54  std::string host;
55  int port = 0;
56  std::string path;
57  } data;
58  public:
59  URL() = default;
60  URL(std::string const &addr);
61  std::string const &scheme() const { return data.scheme; }
62  std::string const &host() const { return data.host; }
63  int port() const { return data.port; }
64  std::string const &path() const { return data.path; }
65  bool isssl() const;
66  };
67  enum HttpVersion {
70  };
71  struct Authorization {
72  enum Type {
75  } type = None;
76  std::string uid;
77  std::string pwd;
78  };
79  class Request {
80  friend class ::WebClient;
81  private:
84  std::vector<std::string> headers;
85  public:
86  Request() = default;
87  Request(std::string const &loc, std::vector<std::string> const &headers = {})
88  : url(loc)
89  , headers(headers)
90  {
91  }
92  void set_location(std::string const &loc)
93  {
94  url = URL(loc);
95  }
96  void set_authorization(Authorization::Type type, std::string const &uid, std::string const &pwd)
97  {
98  auth.type = type;
99  auth.uid = uid;
100  auth.pwd = pwd;
101  }
102  void set_basic_authorization(std::string const &uid, std::string const &pwd)
103  {
105  }
106  void add_header(std::string const &s)
107  {
108  headers.push_back(s);
109  }
110  };
111  class Error {
112  private:
113  std::string msg_;
114  public:
115  Error() = default;
116  Error(std::string const &message)
117  : msg_(message)
118  {
119  }
120  virtual ~Error() = default;
121  std::string what() const
122  {
123  return msg_;
124  }
125  };
126  struct Response {
127  int code = 0;
128  struct Version {
129  unsigned int hi = 0;
130  unsigned int lo = 0;
132  std::vector<std::string> header;
133  std::vector<char> content;
134  };
135  struct Post {
136  std::string content_type;
137  std::string boundary;
138  std::vector<char> data;
139  };
141  std::string type;
142  std::string name;
143  std::string filename;
144  };
145  struct Part {
146  char const *data = nullptr;
147  size_t size = 0;
148  std::string content_type;
151  Part() = default;
152  Part(char const *data, size_t size, std::string const &content_type = {})
153  : data(data)
154  , size(size)
156  {
157  }
159  {
160  content_disposition = cd;
161  }
162  };
163  struct RequestOption {
165  bool keep_alive = true;
166  };
167 private:
168  struct Private;
170  void clear_error();
171  static int get_port(URL const *url, char const *scheme, char const *protocol);
172  void set_default_header(const Request &url, Post const *post, const RequestOption &opt);
173  std::string make_http_request(const Request &url, Post const *post, const WebProxy *proxy, bool https);
174  void parse_http_header(char const *begin, char const *end, std::vector<std::string> *header);
175  void parse_http_header(char const *begin, char const *end, Response *out);
176  bool http_get(const Request &request_req, Post const *post, RequestOption const &opt, ResponseHeader *rh, std::vector<char> *out);
177  bool https_get(const Request &request_url, Post const *post, RequestOption const &opt, ResponseHeader *rh, std::vector<char> *out);
178  bool get(const Request &req, Post const *post, Response *out, WebClientHandler *handler);
179  static void parse_header(std::vector<std::string> const *header, WebClient::Response *res);
180  static std::string header_value(std::vector<std::string> const *header, std::string const &name);
181  void append(char const *ptr, size_t len, std::vector<char> *out, WebClientHandler *handler);
182  void on_end_header(const std::vector<char> *vec, WebClientHandler *handler);
183  void receive_(const RequestOption &opt, std::function<int (char *, int)> const &, ResponseHeader *rh, std::vector<char> *out);
184  void output_debug_string(char const *str);
185  void output_debug_strings(const std::vector<std::string> &vec);
186  static void cleanup();
187  void reset();
188 public:
189  static void initialize();
190  WebClient(WebContext *webcx);
191  ~WebClient();
192  WebClient(WebClient const &) = delete;
193  void operator = (WebClient const &) = delete;
194 
195  void set_http_version(HttpVersion httpver);
196 
197  Error const &error() const;
198  int get(const Request &req, WebClientHandler *handler = nullptr);
199  int post(const Request &req, Post const *post, WebClientHandler *handler = nullptr);
200  void close();
201  void add_header(std::string const &text);
202  Response const &response() const;
203  std::string header_value(std::string const &name) const;
204  std::string content_type() const;
205  size_t content_length() const;
206  char const *content_data() const;
207 
208  static void make_application_www_form_urlencoded(char const *begin, char const *end, WebClient::Post *out);
209  static void make_multipart_form_data(const std::vector<Part> &parts, WebClient::Post *out, std::string const &boundary);
210  static void make_multipart_form_data(char const *data, size_t size, WebClient::Post *out, std::string const &boundary);
211 
212  static std::string quick_get(const std::string &url);
213  static std::string checkip();
214 };
215 
216 class WebContext {
217  friend class WebClient;
218 public:
219 private:
220  struct Private;
222 public:
224  ~WebContext();
225  WebContext(WebContext const &r) = delete;
226  void operator = (WebContext const &r) = delete;
227 
229  void set_keep_alive_enabled(bool f);
230 
231  void set_http_proxy(std::string const &proxy);
232  void set_https_proxy(std::string const &proxy);
233  WebProxy const *http_proxy() const;
234  WebProxy const *https_proxy() const;
235 
236  bool load_cacert(char const *path);
237 
238  void notify_broken_pipe();
239 };
240 
241 #endif
Definition: webclient.cpp:539
Definition: webclient.h:15
virtual ~WebClientHandler()=default
virtual void checkContent(char const *ptr, size_t len)
Definition: webclient.h:22
virtual void checkHeader(WebClient *wc)
Definition: webclient.h:18
Definition: webclient.h:42
static constexpr const char * APPLICATION_X_WWW_FORM_URLENCODED
Definition: webclient.h:45
static constexpr const char * MULTIPART_FORM_DATA
Definition: webclient.h:46
static constexpr const char * APPLICATION_OCTET_STREAM
Definition: webclient.h:44
Definition: webclient.h:111
virtual ~Error()=default
Error(std::string const &message)
Definition: webclient.h:116
std::string msg_
Definition: webclient.h:113
std::string what() const
Definition: webclient.h:121
Definition: webclient.h:79
void set_basic_authorization(std::string const &uid, std::string const &pwd)
Definition: webclient.h:102
std::vector< std::string > headers
Definition: webclient.h:84
Request(std::string const &loc, std::vector< std::string > const &headers={})
Definition: webclient.h:87
void add_header(std::string const &s)
Definition: webclient.h:106
Authorization auth
Definition: webclient.h:83
void set_authorization(Authorization::Type type, std::string const &uid, std::string const &pwd)
Definition: webclient.h:96
URL url
Definition: webclient.h:82
void set_location(std::string const &loc)
Definition: webclient.h:92
Definition: webclient.h:48
std::string const & path() const
Definition: webclient.h:64
int port() const
Definition: webclient.h:63
URL()=default
std::string const & host() const
Definition: webclient.h:62
bool isssl() const
Definition: webclient.cpp:196
struct WebClient::URL::Data data
std::string const & scheme() const
Definition: webclient.h:61
Definition: webclient.h:40
void output_debug_string(char const *str)
Definition: webclient.cpp:284
static void initialize()
Definition: webclient.cpp:238
static void make_application_www_form_urlencoded(char const *begin, char const *end, WebClient::Post *out)
Definition: webclient.cpp:1345
void parse_http_header(char const *begin, char const *end, std::vector< std::string > *header)
Definition: webclient.cpp:422
void set_http_version(HttpVersion httpver)
Definition: webclient.cpp:233
HttpVersion
Definition: webclient.h:67
@ HTTP_1_0
Definition: webclient.h:68
@ HTTP_1_1
Definition: webclient.h:69
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:764
WebClient(WebContext *webcx)
Definition: webclient.cpp:219
std::string make_http_request(const Request &url, Post const *post, const WebProxy *proxy, bool https)
Definition: webclient.cpp:388
static int get_port(URL const *url, char const *scheme, char const *protocol)
Definition: webclient.cpp:312
static void cleanup()
Definition: webclient.cpp:265
Error const & error() const
Definition: webclient.cpp:302
void append(char const *ptr, size_t len, std::vector< char > *out, WebClientHandler *handler)
Definition: webclient.cpp:485
static std::string quick_get(const std::string &url)
Definition: webclient.cpp:1484
void output_debug_strings(const std::vector< std::string > &vec)
Definition: webclient.cpp:295
void add_header(std::string const &text)
Definition: webclient.cpp:1335
void set_default_header(const Request &url, Post const *post, const RequestOption &opt)
Definition: webclient.cpp:340
void clear_error()
Definition: webclient.cpp:307
size_t content_length() const
Definition: webclient.cpp:1288
static void make_multipart_form_data(const std::vector< Part > &parts, WebClient::Post *out, std::string const &boundary)
Definition: webclient.cpp:1352
Response const & response() const
Definition: webclient.cpp:1340
void on_end_header(const std::vector< char > *vec, WebClientHandler *handler)
Definition: webclient.cpp:474
static std::string checkip()
Definition: webclient.cpp:1495
static std::string header_value(std::vector< std::string > const *header, std::string const &name)
Definition: webclient.cpp:1250
char const * content_data() const
Definition: webclient.cpp:1293
void reset()
Definition: webclient.cpp:275
~WebClient()
Definition: webclient.cpp:227
bool get(const Request &req, Post const *post, Response *out, WebClientHandler *handler)
Definition: webclient.cpp:1136
Private * m
Definition: webclient.h:168
void close()
Definition: webclient.cpp:1311
static void parse_header(std::vector< std::string > const *header, WebClient::Response *res)
Definition: webclient.cpp:1187
void operator=(WebClient const &)=delete
std::string content_type() const
Definition: webclient.cpp:1273
void receive_(const RequestOption &opt, std::function< int(char *, int)> const &, ResponseHeader *rh, std::vector< char > *out)
Definition: webclient.cpp:628
bool https_get(const Request &request_url, Post const *post, RequestOption const &opt, ResponseHeader *rh, std::vector< char > *out)
Definition: webclient.cpp:814
int post(const Request &req, Post const *post, WebClientHandler *handler=nullptr)
Definition: webclient.cpp:1305
Definition: webclient.h:216
void notify_broken_pipe()
Definition: webclient.cpp:1479
WebContext(WebContext const &r)=delete
~WebContext()
Definition: webclient.cpp:1420
bool load_cacert(char const *path)
Definition: webclient.cpp:1469
WebProxy const * http_proxy() const
Definition: webclient.cpp:1450
void set_keep_alive_enabled(bool f)
Definition: webclient.cpp:1433
WebContext(WebClient::HttpVersion httpver)
Definition: webclient.cpp:1408
void set_https_proxy(std::string const &proxy)
Definition: webclient.cpp:1444
Private * m
Definition: webclient.h:220
void set_http_proxy(std::string const &proxy)
Definition: webclient.cpp:1438
void set_http_version(WebClient::HttpVersion httpver)
Definition: webclient.cpp:1428
void operator=(WebContext const &r)=delete
WebProxy const * https_proxy() const
Definition: webclient.cpp:1458
Definition: webclient.h:29
bool empty() const
Definition: webclient.h:32
std::string server
Definition: webclient.h:31
Definition: webclient.h:71
enum WebClient::Authorization::Type type
std::string uid
Definition: webclient.h:76
std::string pwd
Definition: webclient.h:77
Type
Definition: webclient.h:72
@ None
Definition: webclient.h:73
@ Basic
Definition: webclient.h:74
Definition: webclient.h:140
std::string type
Definition: webclient.h:141
std::string name
Definition: webclient.h:142
std::string filename
Definition: webclient.h:143
Definition: webclient.h:145
Part(char const *data, size_t size, std::string const &content_type={})
Definition: webclient.h:152
char const * data
Definition: webclient.h:146
void set_content_disposition(ContentDisposition const &cd)
Definition: webclient.h:158
size_t size
Definition: webclient.h:147
std::string content_type
Definition: webclient.h:148
Part()=default
std::string content_transfer_encoding
Definition: webclient.h:150
ContentDisposition content_disposition
Definition: webclient.h:149
Definition: webclient.h:135
std::string boundary
Definition: webclient.h:137
std::string content_type
Definition: webclient.h:136
std::vector< char > data
Definition: webclient.h:138
Definition: webclient.cpp:204
Definition: webclient.h:163
bool keep_alive
Definition: webclient.h:165
WebClientHandler * handler
Definition: webclient.h:164
Definition: webclient.h:128
unsigned int lo
Definition: webclient.h:130
unsigned int hi
Definition: webclient.h:129
Definition: webclient.h:126
int code
Definition: webclient.h:127
std::vector< char > content
Definition: webclient.h:133
std::vector< std::string > header
Definition: webclient.h:132
struct WebClient::Response::Version version
Definition: webclient.h:51
std::string full_request
Definition: webclient.h:52
std::string host
Definition: webclient.h:54
int port
Definition: webclient.h:55
std::string path
Definition: webclient.h:56
std::string scheme
Definition: webclient.h:53
Definition: webclient.cpp:106