Guitar
webclient.h
Go to the documentation of this file.
1 
2 #ifndef WEBCLIENT_H_
3 #define WEBCLIENT_H_
4 
5 #include "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 struct 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, 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_get(InetClient::Request const &request_req, InetClient::Post const *postdata, RequestOption const &opt, ResponseHeader *rh, std::vector<char> *out);
91  bool https_get(InetClient::Request const &request_url, InetClient::Post const *postdata, RequestOption const &opt, ResponseHeader *rh, std::vector<char> *out);
92  bool get(InetClient::Request const &req, InetClient::Post const *post, InetClient::Response *out, WebClientHandler *handler);
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 protected:
101  void reset() override;
102 public:
103  static void initialize();
104  static void cleanup();
105 
106  WebClient(WebContext *webcx);
107  ~WebClient();
108  WebClient(WebClient const &) = delete;
109  void operator = (WebClient const &) = delete;
110 
111  void set_http_version(HttpVersion httpver);
112 
113  InetClient::Error const &error() const override;
114  int get(InetClient::Request const &req, WebClientHandler *handler);
115  int get(InetClient::Request const &req) override
116  {
117  return get(req, nullptr);
118  }
119  int post(InetClient::Request const &req, InetClient::Post const *postdata, WebClientHandler *handler);
120  int post(InetClient::Request const &req, InetClient::Post const *postdata) override
121  {
122  return post(req, postdata, nullptr);
123  }
124  void close() override;
125  void add_header(std::string const &text);
126  InetClient::Response const &response() const override;
127  std::string header_value(std::string const &name) const;
128  std::string content_type() const;
129  size_t content_length() const override;
130  char const *content_data() const override;
131 
132  static void make_application_www_form_urlencoded(char const *begin, char const *end, InetClient::Post *out);
133  static void make_multipart_form_data(const std::vector<Part> &parts, InetClient::Post *out, std::string const &boundary);
134  static void make_multipart_form_data(char const *data, size_t size, InetClient::Post *out, std::string const &boundary);
135 
136  static std::string quick_get(const std::string &url);
137  static std::string checkip();
138 };
139 
140 class WebContext {
141  friend class WebClient;
142 public:
143 private:
144  struct Private;
146 public:
148  ~WebContext();
149  WebContext(WebContext const &r) = delete;
150  void operator = (WebContext const &r) = delete;
151 
153  void set_keep_alive_enabled(bool f);
154 
155  void set_http_proxy(std::string const &proxy);
156  void set_https_proxy(std::string const &proxy);
157  WebProxy const *http_proxy() const;
158  WebProxy const *https_proxy() const;
159 
160  bool load_cacert(char const *path);
161 
162  void notify_broken_pipe();
163 };
164 
165 #endif
Definition: inetclient.h:120
Definition: inetclient.h:11
Definition: inetclient.h:57
Definition: inetclient.h:25
Definition: webclient.cpp:449
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:194
void close() override
Definition: webclient.cpp:1221
static void initialize()
Definition: webclient.cpp:149
char const * content_data() const override
Definition: webclient.cpp:1203
bool http_get(InetClient::Request const &request_req, InetClient::Post const *postdata, RequestOption const &opt, ResponseHeader *rh, std::vector< char > *out)
Definition: webclient.cpp:674
void parse_http_header(char const *begin, char const *end, std::vector< std::string > *header)
Definition: webclient.cpp:332
void set_http_version(HttpVersion httpver)
Definition: webclient.cpp:144
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_get(InetClient::Request const &request_url, InetClient::Post const *postdata, RequestOption const &opt, ResponseHeader *rh, std::vector< char > *out)
Definition: webclient.cpp:724
int post(InetClient::Request const &req, InetClient::Post const *postdata, WebClientHandler *handler)
Definition: webclient.cpp:1215
WebClient(WebContext *webcx)
Definition: webclient.cpp:130
bool get(InetClient::Request const &req, InetClient::Post const *post, InetClient::Response *out, WebClientHandler *handler)
Definition: webclient.cpp:1046
static void cleanup()
Definition: webclient.cpp:176
void append(char const *ptr, size_t len, std::vector< char > *out, WebClientHandler *handler)
Definition: webclient.cpp:395
static std::string quick_get(const std::string &url)
Definition: webclient.cpp:1394
static void make_multipart_form_data(const std::vector< Part > &parts, InetClient::Post *out, std::string const &boundary)
Definition: webclient.cpp:1262
void output_debug_strings(const std::vector< std::string > &vec)
Definition: webclient.cpp:205
void set_default_header(InetClient::Request const &url, InetClient::Post const *postdata, const RequestOption &opt)
Definition: webclient.cpp:250
void add_header(std::string const &text)
Definition: webclient.cpp:1245
size_t content_length() const override
Definition: webclient.cpp:1198
void clear_error()
Definition: webclient.cpp:217
InetClient::Error const & error() const override
Definition: webclient.cpp:212
static int get_port(InetClient::URL const *url, char const *scheme, char const *protocol)
Definition: webclient.cpp:222
static void make_application_www_form_urlencoded(char const *begin, char const *end, InetClient::Post *out)
Definition: webclient.cpp:1255
void on_end_header(const std::vector< char > *vec, WebClientHandler *handler)
Definition: webclient.cpp:384
int post(InetClient::Request const &req, InetClient::Post const *postdata) override
Definition: webclient.h:120
static std::string checkip()
Definition: webclient.cpp:1405
static std::string header_value(std::vector< std::string > const *header, std::string const &name)
Definition: webclient.cpp:1160
~WebClient()
Definition: webclient.cpp:138
Private * m
Definition: webclient.h:82
void operator=(WebClient const &)=delete
std::string content_type() const
Definition: webclient.cpp:1183
static void parse_header(std::vector< std::string > const *header, InetClient::Response *res)
Definition: webclient.cpp:1097
void reset() override
Definition: webclient.cpp:186
void receive_(const RequestOption &opt, std::function< int(char *, int)> const &, ResponseHeader *rh, std::vector< char > *out)
Definition: webclient.cpp:538
std::string make_http_request(InetClient::Request const &url, InetClient::Post const *postdata, const WebProxy *proxy, bool https)
Definition: webclient.cpp:298
int get(InetClient::Request const &req) override
Definition: webclient.h:115
InetClient::Response const & response() const override
Definition: webclient.cpp:1250
Definition: webclient.h:140
void notify_broken_pipe()
Definition: webclient.cpp:1389
WebContext(WebContext const &r)=delete
~WebContext()
Definition: webclient.cpp:1330
bool load_cacert(char const *path)
Definition: webclient.cpp:1379
WebProxy const * http_proxy() const
Definition: webclient.cpp:1360
void set_keep_alive_enabled(bool f)
Definition: webclient.cpp:1343
WebContext(WebClient::HttpVersion httpver)
Definition: webclient.cpp:1318
void set_https_proxy(std::string const &proxy)
Definition: webclient.cpp:1354
Private * m
Definition: webclient.h:144
void set_http_proxy(std::string const &proxy)
Definition: webclient.cpp:1348
void set_http_version(WebClient::HttpVersion httpver)
Definition: webclient.cpp:1338
void operator=(WebContext const &r)=delete
WebProxy const * https_proxy() const
Definition: webclient.cpp:1368
Definition: webclient.h:31
bool empty() const
Definition: webclient.h:34
std::string server
Definition: webclient.h:33
Definition: inetclient.h:52
Definition: inetclient.h:100
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:115
Definition: webclient.h:77
bool keep_alive
Definition: webclient.h:79
WebClientHandler * handler
Definition: webclient.h:78
Definition: webclient.cpp:106