Guitar
webclient.h
Go to the documentation of this file.
1 
2 #ifndef WEBCLIENT_H_
3 #define WEBCLIENT_H_
4 
5 #include <inet/inetclient.h>
6 
7 #include <vector>
8 #include <string>
9 #include <functional>
10 
11 #define USE_OPENSSL 1
12 #define OPENSSL_NO_SHA1 1
13 
14 class WebContext;
15 class WebClient;
16 
18 public:
19  virtual ~WebClientHandler() = default;
20  virtual void checkHeader(WebClient *wc)
21  {
22  (void)wc;
23  }
24  virtual void checkContent(char const *ptr, size_t len)
25  {
26  (void)ptr;
27  (void)len;
28  }
29 };
30 
31 class WebProxy {
32 public:
33  std::string server;
34  bool empty() const
35  {
36  return server.empty();
37  }
38 };
39 
40 class ResponseHeader;
41 
42 class WebClient : public AbstractInetClient {
43 public:
44  class ContentType {
45  public:
46  static constexpr const char *APPLICATION_OCTET_STREAM = "application/octet-stream";
47  static constexpr const char *APPLICATION_X_WWW_FORM_URLENCODED = "application/x-www-form-urlencoded";
48  static constexpr const char *MULTIPART_FORM_DATA = "multipart/form-data";
49  };
50  enum HttpVersion {
53  };
55  std::string type;
56  std::string name;
57  std::string filename;
58  };
59  struct Part {
60  char const *data = nullptr;
61  size_t size = 0;
62  std::string content_type;
65  Part() = default;
66  Part(char const *data, size_t size, std::string const &content_type = {})
67  : data(data)
68  , size(size)
70  {
71  }
73  {
75  }
76  };
77  struct RequestOption {
79  bool keep_alive = true;
80  };
81 private:
82  struct Private;
84  void clear_error();
85  static int get_port(InetClient::URL const *url, char const *scheme, char const *protocol);
86  void set_default_header(InetClient::Request const &url, bool is_standard_port, InetClient::Post const *postdata, const RequestOption &opt);
87  std::string make_http_request(InetClient::Request const &url, InetClient::Post const *postdata, const WebProxy *proxy, bool https);
88  void parse_http_header(char const *begin, char const *end, std::vector<std::string> *header);
89  void parse_http_header(char const *begin, char const *end, InetClient::Response *out);
90  bool http_getpost(InetClient::Request const &request_req, InetClient::Post const *postdata, RequestOption const &opt, ResponseHeader *rh, std::vector<char> *out);
91  bool https_getpost(InetClient::Request const &request_url, InetClient::Post const *postdata, RequestOption const &opt, ResponseHeader *rh, std::vector<char> *out);
93  static void parse_header(std::vector<std::string> const *header, InetClient::Response *res);
94  static std::string header_value(std::vector<std::string> const *header, std::string const &name);
95  void append(char const *ptr, size_t len, std::vector<char> *out, WebClientHandler *handler);
96  void on_end_header(const std::vector<char> *vec, WebClientHandler *handler);
97  void receive_(const RequestOption &opt, std::function<int (char *, int)> const &, ResponseHeader *rh, std::vector<char> *out);
98  void output_debug_string(char const *str);
99  void output_debug_strings(const std::vector<std::string> &vec);
100 
101  int get(InetClient::Request const &req, WebClientHandler *handler);
102  int post(InetClient::Request const &req, InetClient::Post const *postdata, WebClientHandler *handler);
103 protected:
104  void reset() override;
105 public:
106  static void initialize();
107  static void cleanup();
108 
109  WebClient(WebContext *webcx);
110  ~WebClient();
111  WebClient(WebClient const &) = delete;
112  void operator = (WebClient const &) = delete;
113 
114  void set_http_version(HttpVersion httpver);
115 
116  InetClient::Error const &error() const override;
117  int get(InetClient::Request const &req) override;
118  int post(InetClient::Request const &req, InetClient::Post const *postdata) override;
119  void close() override;
120  void add_header(std::string const &text);
121  InetClient::Response const &response() const override;
122  std::string header_value(std::string const &name) const;
123  std::string content_type() const;
124  size_t content_length() const override;
125  char const *content_data() const override;
126 
127  static void make_application_www_form_urlencoded(char const *begin, char const *end, InetClient::Post *out);
128  static void make_multipart_form_data(const std::vector<Part> &parts, InetClient::Post *out, std::string const &boundary);
129  static void make_multipart_form_data(char const *data, size_t size, InetClient::Post *out, std::string const &boundary);
130 
131  static std::string quick_get(const std::string &url);
132  static std::string checkip();
133  static void self_test();
134 };
135 
136 class WebContext {
137  friend class WebClient;
138 public:
139 private:
140  struct Private;
142 public:
144  ~WebContext();
145  WebContext(WebContext const &r) = delete;
146  void operator = (WebContext const &r) = delete;
147 
149  void set_keep_alive_enabled(bool f);
150 
151  void set_http_proxy(std::string const &proxy);
152  void set_https_proxy(std::string const &proxy);
153  WebProxy const *http_proxy() const;
154  WebProxy const *https_proxy() const;
155 
156  bool load_cacert(char const *path);
157 
158  void set_strict_certificate_verification(bool strict);
160 
161  void notify_broken_pipe();
162 };
163 
164 #endif
Definition: inetclient.h:138
Definition: inetclient.h:11
Definition: inetclient.h:72
Definition: inetclient.h:40
Definition: webclient.cpp:468
Definition: webclient.h:17
virtual ~WebClientHandler()=default
virtual void checkContent(char const *ptr, size_t len)
Definition: webclient.h:24
virtual void checkHeader(WebClient *wc)
Definition: webclient.h:20
Definition: webclient.h:44
static constexpr const char * APPLICATION_X_WWW_FORM_URLENCODED
Definition: webclient.h:47
static constexpr const char * MULTIPART_FORM_DATA
Definition: webclient.h:48
static constexpr const char * APPLICATION_OCTET_STREAM
Definition: webclient.h:46
Definition: webclient.h:42
void output_debug_string(char const *str)
Definition: webclient.cpp:206
void close() override
Definition: webclient.cpp:1432
static void initialize()
Definition: webclient.cpp:161
char const * content_data() const override
Definition: webclient.cpp:1426
void parse_http_header(char const *begin, char const *end, std::vector< std::string > *header)
Definition: webclient.cpp:351
void set_http_version(HttpVersion httpver)
Definition: webclient.cpp:156
HttpVersion
Definition: webclient.h:50
@ HTTP_1_0
Definition: webclient.h:51
@ HTTP_1_1
Definition: webclient.h:52
WebClient(WebClient const &)=delete
bool https_getpost(InetClient::Request const &request_url, InetClient::Post const *postdata, RequestOption const &opt, ResponseHeader *rh, std::vector< char > *out)
Definition: webclient.cpp:872
int post(InetClient::Request const &req, InetClient::Post const *postdata, WebClientHandler *handler)
Definition: webclient.cpp:1365
WebClient(WebContext *webcx)
Definition: webclient.cpp:142
static void cleanup()
Definition: webclient.cpp:188
void append(char const *ptr, size_t len, std::vector< char > *out, WebClientHandler *handler)
Definition: webclient.cpp:414
static std::string quick_get(const std::string &url)
Definition: webclient.cpp:1619
static void make_multipart_form_data(const std::vector< Part > &parts, InetClient::Post *out, std::string const &boundary)
Definition: webclient.cpp:1476
void output_debug_strings(const std::vector< std::string > &vec)
Definition: webclient.cpp:217
void add_header(std::string const &text)
Definition: webclient.cpp:1456
size_t content_length() const override
Definition: webclient.cpp:1421
void clear_error()
Definition: webclient.cpp:229
InetClient::Error const & error() const override
Definition: webclient.cpp:224
static int get_port(InetClient::URL const *url, char const *scheme, char const *protocol)
Definition: webclient.cpp:234
static void make_application_www_form_urlencoded(char const *begin, char const *end, InetClient::Post *out)
Definition: webclient.cpp:1469
void on_end_header(const std::vector< char > *vec, WebClientHandler *handler)
Definition: webclient.cpp:403
static std::string checkip()
Definition: webclient.cpp:1630
static void self_test()
Definition: webclient.cpp:1647
static std::string header_value(std::vector< std::string > const *header, std::string const &name)
Definition: webclient.cpp:1383
~WebClient()
Definition: webclient.cpp:150
bool getpost(InetClient::Request const &req, InetClient::Post const *post, InetClient::Response *out, WebClientHandler *handler)
Definition: webclient.cpp:1243
Private * m
Definition: webclient.h:82
bool http_getpost(InetClient::Request const &request_req, InetClient::Post const *postdata, RequestOption const &opt, ResponseHeader *rh, std::vector< char > *out)
Definition: webclient.cpp:806
void operator=(WebClient const &)=delete
std::string content_type() const
Definition: webclient.cpp:1406
void set_default_header(InetClient::Request const &url, bool is_standard_port, InetClient::Post const *postdata, const RequestOption &opt)
Definition: webclient.cpp:262
static void parse_header(std::vector< std::string > const *header, InetClient::Response *res)
Definition: webclient.cpp:1294
void reset() override
Definition: webclient.cpp:198
void receive_(const RequestOption &opt, std::function< int(char *, int)> const &, ResponseHeader *rh, std::vector< char > *out)
Definition: webclient.cpp:557
int get(InetClient::Request const &req, WebClientHandler *handler)
Definition: webclient.cpp:1357
std::string make_http_request(InetClient::Request const &url, InetClient::Post const *postdata, const WebProxy *proxy, bool https)
Definition: webclient.cpp:317
InetClient::Response const & response() const override
Definition: webclient.cpp:1464
Definition: webclient.h:136
void notify_broken_pipe()
Definition: webclient.cpp:1614
WebContext(WebContext const &r)=delete
~WebContext()
Definition: webclient.cpp:1545
bool load_cacert(char const *path)
Definition: webclient.cpp:1594
WebProxy const * http_proxy() const
Definition: webclient.cpp:1575
void set_keep_alive_enabled(bool f)
Definition: webclient.cpp:1558
void set_strict_certificate_verification(bool strict)
Definition: webclient.cpp:1604
WebContext(WebClient::HttpVersion httpver)
Definition: webclient.cpp:1532
bool is_strict_certificate_verification() const
Definition: webclient.cpp:1609
void set_https_proxy(std::string const &proxy)
Definition: webclient.cpp:1569
Private * m
Definition: webclient.h:140
void set_http_proxy(std::string const &proxy)
Definition: webclient.cpp:1563
void set_http_version(WebClient::HttpVersion httpver)
Definition: webclient.cpp:1553
void operator=(WebContext const &r)=delete
WebProxy const * https_proxy() const
Definition: webclient.cpp:1583
Definition: webclient.h:31
bool empty() const
Definition: webclient.h:34
std::string server
Definition: webclient.h:33
Definition: inetclient.h:67
Definition: inetclient.h:118
Definition: webclient.h:54
std::string type
Definition: webclient.h:55
std::string name
Definition: webclient.h:56
std::string filename
Definition: webclient.h:57
Definition: webclient.h:59
Part(char const *data, size_t size, std::string const &content_type={})
Definition: webclient.h:66
char const * data
Definition: webclient.h:60
void set_content_disposition(ContentDisposition const &cd)
Definition: webclient.h:72
size_t size
Definition: webclient.h:61
std::string content_type
Definition: webclient.h:62
Part()=default
std::string content_transfer_encoding
Definition: webclient.h:64
ContentDisposition content_disposition
Definition: webclient.h:63
Definition: webclient.cpp:127
Definition: webclient.h:77
bool keep_alive
Definition: webclient.h:79
WebClientHandler * handler
Definition: webclient.h:78
Definition: webclient.cpp:117