1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
#ifndef HTTP_PROTOCOL_HH
#define HTTP_PROTOCOL_HH
#include <memory>
#include <stdint.h>
#include <string>
#include <string_view>
#include "buffer.hh"
// glibc defines these even tho it shouldn't if you ask posix
#ifdef major
# undef major
#endif
#ifdef minor
# undef minor
#endif
struct Version {
uint16_t major;
uint16_t minor;
Version()
: major(0), minor(0) {
}
Version(uint16_t major, uint16_t minor)
: major(major), minor(minor) {
}
};
class HeaderIterator {
public:
virtual ~HeaderIterator() = default;
virtual bool valid() const = 0;
virtual std::string_view name() const = 0;
virtual std::string value() const = 0;
virtual void next() = 0;
protected:
HeaderIterator() = default;
HeaderIterator(HeaderIterator const&) = delete;
HeaderIterator& operator=(HeaderIterator const&) = delete;
};
class HeaderTokenIterator {
public:
virtual ~HeaderTokenIterator() = default;
virtual bool valid() const = 0;
virtual std::string token() const = 0;
virtual void next() = 0;
protected:
HeaderTokenIterator() = default;
HeaderTokenIterator(HeaderTokenIterator const&) = delete;
HeaderTokenIterator& operator=(HeaderTokenIterator const&) = delete;
};
class HttpPackage {
public:
virtual ~HttpPackage() = default;
virtual bool good() const = 0;
virtual std::string_view proto() const = 0;
virtual Version proto_version() const = 0;
virtual std::unique_ptr<HeaderIterator> header() const = 0;
virtual std::unique_ptr<HeaderIterator> header(
std::string_view name) const = 0;
std::string first_header(std::string_view name) const;
virtual std::unique_ptr<HeaderTokenIterator> header_tokens(
std::string_view name) const = 0;
virtual size_t size() const = 0;
protected:
HttpPackage() = default;
HttpPackage(HttpPackage const&) = delete;
HttpPackage& operator=(HttpPackage const&) = delete;
};
class HttpResponse : public virtual HttpPackage {
public:
virtual ~HttpResponse() = default;
static std::unique_ptr<HttpResponse> parse(RoBuffer* buffer);
virtual uint16_t status_code() const = 0;
virtual std::string_view status_message() const = 0;
protected:
HttpResponse() = default;
HttpResponse(HttpResponse const&) = delete;
HttpResponse& operator=(HttpResponse const&) = delete;
};
class HttpRequest : public virtual HttpPackage {
public:
virtual ~HttpRequest() = default;
static std::unique_ptr<HttpRequest> parse(RoBuffer* buffer);
virtual std::string_view method() const = 0;
virtual std::string_view url() const = 0;
protected:
HttpRequest() = default;
HttpRequest(HttpRequest const&) = delete;
HttpRequest& operator=(HttpRequest const&) = delete;
};
class HttpResponseBuilder {
public:
virtual ~HttpResponseBuilder() = default;
static std::unique_ptr<HttpResponseBuilder> create(
std::string proto, Version version,
uint16_t status_code, std::string status_message);
virtual void add_header(std::string name, std::string value) = 0;
virtual bool build(Buffer* dst) const = 0;
virtual size_t size() const = 0;
protected:
HttpResponseBuilder() = default;
HttpResponseBuilder(HttpResponseBuilder const&) = delete;
HttpResponseBuilder& operator=(HttpResponseBuilder const&) = delete;
};
class HttpRequestBuilder {
public:
virtual ~HttpRequestBuilder() = default;
static std::unique_ptr<HttpRequestBuilder> create(
std::string method, std::string url, std::string proto, Version version);
virtual void add_header(std::string name, std::string value) = 0;
virtual bool build(Buffer* dst) const = 0;
virtual size_t size() const = 0;
protected:
HttpRequestBuilder() = default;
HttpRequestBuilder(HttpRequestBuilder const&) = delete;
HttpRequestBuilder& operator=(HttpRequestBuilder const&) = delete;
};
class CgiResponseBuilder {
public:
virtual ~CgiResponseBuilder() = default;
static std::unique_ptr<CgiResponseBuilder> create(uint16_t status_code);
virtual void add_header(std::string name, std::string value) = 0;
virtual bool build(Buffer* dst) const = 0;
virtual size_t size() const = 0;
protected:
CgiResponseBuilder() = default;
CgiResponseBuilder(CgiResponseBuilder const&) = delete;
CgiResponseBuilder& operator=(CgiResponseBuilder const&) = delete;
};
std::string_view http_standard_message(uint16_t code);
std::string http_date(time_t in);
#endif // HTTP_PROTOCOL_HH
|