Guitar
inetclient.h
Go to the documentation of this file.
1 #ifndef INETCLIENT_H
2 #define INETCLIENT_H
3 
4 #include <cassert>
5 #include <memory>
6 #include <string>
7 #include <vector>
8 
9 class InetClient {
10 public:
11  class Error {
12  public:
13  enum Code {
16  SSL,
20  };
21  private:
22  std::string msg_;
24  public:
25  Error() = default;
26  Error(std::string const &message, Code code = Unknown)
27  : msg_(message)
28  , code_(code)
29  {
30  }
31  std::string what() const
32  {
33  return msg_;
34  }
35  Code code() const
36  {
37  return code_;
38  }
39  };
40  class URL {
41  private:
42  struct Data {
43  std::string full_request;
44  std::string scheme;
45  std::string host;
46  int port = 0;
47  std::string path;
48  } data_;
49  public:
50  URL() = default;
51  URL(std::string const &addr);
52  std::string const &full_request() const { return data_.full_request; }
53  std::string const &scheme() const { return data_.scheme; }
54  std::string const &host() const { return data_.host; }
55  int port() const { return data_.port; }
56  std::string const &path() const { return data_.path; }
57  bool is_ssl() const;
58  };
59  struct Authorization {
60  enum Type {
63  } type = None;
64  std::string uid;
65  std::string pwd;
66  };
67  struct Post {
68  std::string content_type;
69  std::string boundary;
70  std::vector<char> data;
71  };
72  class Request {
73  private:
76  std::vector<std::string> headers_;
77  public:
78  Request() = default;
79  Request(std::string const &loc, std::vector<std::string> const &headers = {})
80  : url_(loc)
81  , headers_(headers)
82  {
83  }
84  InetClient::URL const &url() const
85  {
86  return url_;
87  }
89  {
90  return auth_;
91  }
92  std::vector<std::string> const &headers() const
93  {
94  return headers_;
95  }
96  void set_location(std::string const &loc)
97  {
98  url_ = InetClient::URL(loc);
99  }
100  void set_authorization(Authorization::Type type, std::string const &uid, std::string const &pwd)
101  {
102  auth_.type = type;
103  auth_.uid = uid;
104  auth_.pwd = pwd;
105  }
106  void set_basic_authorization(std::string const &uid, std::string const &pwd)
107  {
109  }
110  void add_header(std::string const &s)
111  {
112  if (s.find('\r') != std::string::npos || s.find('\n') != std::string::npos) {
113  throw Error("Invalid header: contains newline characters", Error::Security);
114  }
115  headers_.push_back(s);
116  }
117  };
118  struct Response {
119  int code = 0;
120  struct Version {
121  unsigned int hi = 0;
122  unsigned int lo = 0;
124  std::vector<std::string> header;
125  std::vector<char> content;
126  bool empty() const
127  {
128  return content.empty();
129  }
130  void clear()
131  {
132  code = 0;
133  content.clear();
134  }
135  };
136 };
137 
139 protected:
141  {
142  return this;
143  }
144 public:
145  virtual ~AbstractInetClient() = default;
147  {
148  return clientptr();
149  }
150  AbstractInetClient const *client() const
151  {
152  return const_cast<AbstractInetClient *>(this)->clientptr();
153  }
154  virtual void reset() = 0;
155  virtual void close() = 0;
156  virtual InetClient::Error const &error() const = 0;
157  virtual int get(InetClient::Request const &req) = 0;
158  virtual int post(InetClient::Request const &req, InetClient::Post const *post) = 0;
159  virtual InetClient::Response const &response() const = 0;
160  virtual size_t content_length() const = 0;
161  virtual char const *content_data() const = 0;
162 };
163 
164 #endif // INETCLIENT_H
Definition: inetclient.h:138
virtual char const * content_data() const =0
AbstractInetClient * client()
Definition: inetclient.h:146
virtual ~AbstractInetClient()=default
virtual InetClient::Error const & error() const =0
virtual void reset()=0
virtual int post(InetClient::Request const &req, InetClient::Post const *post)=0
virtual int get(InetClient::Request const &req)=0
virtual void close()=0
virtual size_t content_length() const =0
virtual AbstractInetClient * clientptr()
Definition: inetclient.h:140
AbstractInetClient const * client() const
Definition: inetclient.h:150
virtual InetClient::Response const & response() const =0
Definition: inetclient.h:11
std::string what() const
Definition: inetclient.h:31
Code code() const
Definition: inetclient.h:35
Code
Definition: inetclient.h:13
@ Unknown
Definition: inetclient.h:14
@ SSL
Definition: inetclient.h:16
@ Security
Definition: inetclient.h:19
@ Protocol
Definition: inetclient.h:18
@ Network
Definition: inetclient.h:15
@ HTTP
Definition: inetclient.h:17
Error(std::string const &message, Code code=Unknown)
Definition: inetclient.h:26
std::string msg_
Definition: inetclient.h:22
Code code_
Definition: inetclient.h:23
Definition: inetclient.h:72
InetClient::URL url_
Definition: inetclient.h:74
std::vector< std::string > const & headers() const
Definition: inetclient.h:92
InetClient::URL const & url() const
Definition: inetclient.h:84
std::vector< std::string > headers_
Definition: inetclient.h:76
Authorization auth_
Definition: inetclient.h:75
void add_header(std::string const &s)
Definition: inetclient.h:110
Request(std::string const &loc, std::vector< std::string > const &headers={})
Definition: inetclient.h:79
Authorization auth() const
Definition: inetclient.h:88
void set_location(std::string const &loc)
Definition: inetclient.h:96
void set_authorization(Authorization::Type type, std::string const &uid, std::string const &pwd)
Definition: inetclient.h:100
void set_basic_authorization(std::string const &uid, std::string const &pwd)
Definition: inetclient.h:106
Definition: inetclient.h:40
std::string const & full_request() const
Definition: inetclient.h:52
int port() const
Definition: inetclient.h:55
std::string const & scheme() const
Definition: inetclient.h:53
std::string const & path() const
Definition: inetclient.h:56
bool is_ssl() const
Definition: inetclient.cpp:85
struct InetClient::URL::Data data_
std::string const & host() const
Definition: inetclient.h:54
Definition: inetclient.h:9
Definition: inetclient.h:59
Type
Definition: inetclient.h:60
@ Basic
Definition: inetclient.h:62
@ None
Definition: inetclient.h:61
std::string pwd
Definition: inetclient.h:65
std::string uid
Definition: inetclient.h:64
enum InetClient::Authorization::Type type
Definition: inetclient.h:67
std::string content_type
Definition: inetclient.h:68
std::string boundary
Definition: inetclient.h:69
std::vector< char > data
Definition: inetclient.h:70
Definition: inetclient.h:120
unsigned int lo
Definition: inetclient.h:122
unsigned int hi
Definition: inetclient.h:121
Definition: inetclient.h:118
void clear()
Definition: inetclient.h:130
std::vector< std::string > header
Definition: inetclient.h:124
std::vector< char > content
Definition: inetclient.h:125
struct InetClient::Response::Version version
bool empty() const
Definition: inetclient.h:126
int code
Definition: inetclient.h:119
Definition: inetclient.h:42
std::string path
Definition: inetclient.h:47
std::string scheme
Definition: inetclient.h:44
std::string full_request
Definition: inetclient.h:43
std::string host
Definition: inetclient.h:45
int port
Definition: inetclient.h:46