-rw-r--r-- | include/Makefile.am | 4 | ||||
-rw-r--r-- | include/kingate/cgi_gateway.h | 5 | ||||
-rw-r--r-- | include/kingate/cookies.h | 300 | ||||
-rw-r--r-- | include/kingate/headers.h | 94 | ||||
-rw-r--r-- | include/kingate/util.h | 13 |
5 files changed, 415 insertions, 1 deletions
diff --git a/include/Makefile.am b/include/Makefile.am index e0b778b..ee5cd51 100644 --- a/include/Makefile.am +++ b/include/Makefile.am | |||
@@ -4,4 +4,6 @@ nobase_include_HEADERS = \ | |||
4 | kingate/fastcgi.h \ | 4 | kingate/fastcgi.h \ |
5 | kingate/exception.h \ | 5 | kingate/exception.h \ |
6 | kingate/util.h \ | 6 | kingate/util.h \ |
7 | kingate/plaincgi.h | 7 | kingate/plaincgi.h \ |
8 | kingate/cookies.h \ | ||
9 | kingate/headers.h | ||
diff --git a/include/kingate/cgi_gateway.h b/include/kingate/cgi_gateway.h index a5c4056..f20d72b 100644 --- a/include/kingate/cgi_gateway.h +++ b/include/kingate/cgi_gateway.h | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | #include <map> | 4 | #include <map> |
5 | #include "kingate/cgi_interface.h" | 5 | #include "kingate/cgi_interface.h" |
6 | #include "kingate/cookies.h" | ||
6 | 7 | ||
7 | #ifndef __deprecated | 8 | #ifndef __deprecated |
8 | #if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3 | 9 | #if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3 |
@@ -42,6 +43,10 @@ namespace kingate { | |||
42 | */ | 43 | */ |
43 | params_t post; | 44 | params_t post; |
44 | /** | 45 | /** |
46 | * Cookies passed. | ||
47 | */ | ||
48 | cookies_t cookies; | ||
49 | /** | ||
45 | * Was the stdin content parsed? | 50 | * Was the stdin content parsed? |
46 | */ | 51 | */ |
47 | bool b_parsed_content; | 52 | bool b_parsed_content; |
diff --git a/include/kingate/cookies.h b/include/kingate/cookies.h new file mode 100644 index 0000000..83ef0c6 --- a/dev/null +++ b/include/kingate/cookies.h | |||
@@ -0,0 +1,300 @@ | |||
1 | #ifndef __KINGATE_COOKIES_H | ||
2 | #define __KINGATE_COOKIES_H | ||
3 | |||
4 | #include <string> | ||
5 | #include <map> | ||
6 | #include <ostream> | ||
7 | |||
8 | /** | ||
9 | * @file | ||
10 | * @brief cookies-related classes. | ||
11 | */ | ||
12 | |||
13 | namespace kingate { | ||
14 | using namespace std; | ||
15 | |||
16 | /** | ||
17 | * Class, holding the cookie with parameters. | ||
18 | */ | ||
19 | class cookie : public map<string,string> { | ||
20 | public: | ||
21 | /** | ||
22 | * Cookie name. | ||
23 | */ | ||
24 | string name; | ||
25 | /** | ||
26 | * Cookie value. | ||
27 | */ | ||
28 | string value; | ||
29 | |||
30 | cookie() { } | ||
31 | /** | ||
32 | * @param n cookie name. | ||
33 | * @param v cookie value. | ||
34 | */ | ||
35 | cookie(const string& n,const string& v) | ||
36 | : name(n), value(v) { } | ||
37 | |||
38 | /** | ||
39 | * set cookie parameter. | ||
40 | * @param p parameter name. | ||
41 | * @param v parameter value. | ||
42 | * @see _get_string() | ||
43 | */ | ||
44 | void _set_string(const string& p,const string& v); | ||
45 | |||
46 | /** | ||
47 | * @param n cookie name. | ||
48 | * @see get_name() | ||
49 | */ | ||
50 | void set_name(const string& n) { name = n; } | ||
51 | /** | ||
52 | * @param v cookie value. | ||
53 | * @see set_value() | ||
54 | */ | ||
55 | void set_value(const string& v) { value = v; } | ||
56 | /** | ||
57 | * @param c coomment. | ||
58 | * @see get_comment() | ||
59 | * @see has_comment() | ||
60 | * @see unset_comment() | ||
61 | */ | ||
62 | void set_comment(const string& c); | ||
63 | /** | ||
64 | * @param d domain. | ||
65 | * @see get_domain() | ||
66 | * @see has_domain() | ||
67 | * @see unset_domain() | ||
68 | */ | ||
69 | void set_domain(const string& d); | ||
70 | /** | ||
71 | * @param ma max-age. | ||
72 | * @see get_max_age() | ||
73 | * @see has_max_age() | ||
74 | * @see unset_max_age() | ||
75 | */ | ||
76 | void set_max_age(const string& ma); | ||
77 | /** | ||
78 | * @param p path. | ||
79 | * @see get_path() | ||
80 | * @see has_path() | ||
81 | * @see unset_path() | ||
82 | */ | ||
83 | void set_path(const string& p); | ||
84 | /** | ||
85 | * set cookie security. | ||
86 | * @param s true if secure. | ||
87 | * @see get_secure() | ||
88 | * @see is_secure() | ||
89 | */ | ||
90 | void set_secure(bool s); | ||
91 | |||
92 | /** | ||
93 | * @param e expiration time. | ||
94 | * @see get_expires() | ||
95 | * @see has_expires() | ||
96 | * @see unset_expires() | ||
97 | */ | ||
98 | void set_expires(const string& e); | ||
99 | |||
100 | /** | ||
101 | * get cookie parameter. | ||
102 | * @param p parameter name. | ||
103 | * @return parameter value. | ||
104 | * @see _set_string() | ||
105 | */ | ||
106 | const string& _get_string(const string& p) const; | ||
107 | |||
108 | /** | ||
109 | * @return cookie name. | ||
110 | * @see set_name() | ||
111 | */ | ||
112 | const string& get_name() const { return name; } | ||
113 | /** | ||
114 | * @return cookie value. | ||
115 | * @see set_value() | ||
116 | */ | ||
117 | const string& get_value() const { return value; } | ||
118 | /** | ||
119 | * @return cookie comment. | ||
120 | * @see set_comment() | ||
121 | * @see has_comment() | ||
122 | * @see unset_comment() | ||
123 | */ | ||
124 | const string& get_comment() const; | ||
125 | /** | ||
126 | * @return cookie domain. | ||
127 | * @see set_domain() | ||
128 | * @see has_domain() | ||
129 | * @see unset_domain() | ||
130 | */ | ||
131 | const string& get_domain() const; | ||
132 | /** | ||
133 | * @return cookie max-age. | ||
134 | * @see set_max_age() | ||
135 | * @see has_max_age() | ||
136 | * @see unset_max_age() | ||
137 | */ | ||
138 | const string& get_max_age() const; | ||
139 | /** | ||
140 | * @return cookie path. | ||
141 | * @see set_path() | ||
142 | * @see has_path() | ||
143 | * @see unset_path() | ||
144 | */ | ||
145 | const string& get_path() const; | ||
146 | /** | ||
147 | * @return cookie security. | ||
148 | * @see is_secure() | ||
149 | * @see set_secure() | ||
150 | */ | ||
151 | bool get_secure() const; | ||
152 | /** | ||
153 | * @return cookie security. | ||
154 | * @see get_secure() | ||
155 | * @see set_secure() | ||
156 | */ | ||
157 | bool is_secure() const { return get_secure(); } | ||
158 | |||
159 | /** | ||
160 | * @return cookie expiration time. | ||
161 | * @see set_expires() | ||
162 | * @see has_expires() | ||
163 | * @see unset_expires() | ||
164 | */ | ||
165 | const string& get_expires() const; | ||
166 | |||
167 | /** | ||
168 | * @return true if cookie has comment. | ||
169 | * @see set_comment() | ||
170 | * @see get_comment() | ||
171 | * @see unset_comment() | ||
172 | */ | ||
173 | bool has_comment() const; | ||
174 | /** | ||
175 | * @return true if cookie has domain. | ||
176 | * @see set_domain() | ||
177 | * @see get_domain() | ||
178 | * @see unset_domain() | ||
179 | */ | ||
180 | bool has_domain() const; | ||
181 | /** | ||
182 | * @return true if cookie has max-age. | ||
183 | * @see set_max_age() | ||
184 | * @see get_max_age() | ||
185 | * @see unset_max_age() | ||
186 | */ | ||
187 | bool has_max_age() const; | ||
188 | /** | ||
189 | * @return true if cookie has path. | ||
190 | * @see set_path() | ||
191 | * @see get_path() | ||
192 | * @see unset_path() | ||
193 | */ | ||
194 | bool has_path() const; | ||
195 | |||
196 | /** | ||
197 | * @return true if cookie has expiration time. | ||
198 | * @see set_expires() | ||
199 | * @see get_expires() | ||
200 | * @see unset_expires() | ||
201 | */ | ||
202 | bool has_expires() const; | ||
203 | |||
204 | /** | ||
205 | * rid cookie of comment. | ||
206 | * @see set_comment() | ||
207 | * @see get_comment() | ||
208 | * @see has_comment() | ||
209 | */ | ||
210 | void unset_comment(); | ||
211 | /** | ||
212 | * rid cookie of domain. | ||
213 | * @see set_domain() | ||
214 | * @see get_domain() | ||
215 | * @see has_domain() | ||
216 | */ | ||
217 | void unset_domain(); | ||
218 | /** | ||
219 | * rid cookie of max-age. | ||
220 | * @see set_max_age() | ||
221 | * @see get_max_age() | ||
222 | * @see has_max_age() | ||
223 | */ | ||
224 | void unset_max_age(); | ||
225 | /** | ||
226 | * rid cookie of path. | ||
227 | * @see set_path() | ||
228 | * @see get_path() | ||
229 | * @see has_path() | ||
230 | */ | ||
231 | void unset_path(); | ||
232 | |||
233 | /** | ||
234 | * rid cookie of expiration time. | ||
235 | * @see set_expires() | ||
236 | * @see get_expires() | ||
237 | * @see has_expires() | ||
238 | */ | ||
239 | void unset_expires(); | ||
240 | |||
241 | /** | ||
242 | * render the 'Set-Cookie' HTTP header according to RFC2109. | ||
243 | * Absolutely useless, only works with lynx. | ||
244 | * @return the rendered header content. | ||
245 | */ | ||
246 | string set_cookie_header_rfc2109() const; | ||
247 | /** | ||
248 | * render the 'Set-Cookie' header according to the early vague | ||
249 | * netscape specs and common practice. | ||
250 | * @return the rendered header content. | ||
251 | */ | ||
252 | string set_cookie_header() const; | ||
253 | }; | ||
254 | |||
255 | /** | ||
256 | * Cookies container class. | ||
257 | */ | ||
258 | class cookies_t : public map<string,cookie> { | ||
259 | public: | ||
260 | |||
261 | cookies_t() { } | ||
262 | /** | ||
263 | * @param s 'Cookie:' HTTP header contents to parse. | ||
264 | */ | ||
265 | cookies_t(const string& s) { parse_cookies(s); } | ||
266 | |||
267 | /** | ||
268 | * @param c cookie to set. | ||
269 | */ | ||
270 | void set_cookie(const cookie& c) { (*this)[c.get_name()]=c; } | ||
271 | /** | ||
272 | * @param n cookie name to remove. | ||
273 | */ | ||
274 | void unset_cookie(const key_type& n) { erase(n); } | ||
275 | /** | ||
276 | * @param n cookie name. | ||
277 | * @return true if exists. | ||
278 | */ | ||
279 | bool has_cookie(const key_type& n) const; | ||
280 | /** | ||
281 | * Return the named cookie if one exists. | ||
282 | * @param n cookie name. | ||
283 | * @return const reference to cookie object. | ||
284 | */ | ||
285 | const cookie& get_cookie(const key_type& n) const; | ||
286 | /** | ||
287 | * Return the named cookie if one exists. | ||
288 | * @param n cookie name. | ||
289 | * @return reference to cookie object. | ||
290 | */ | ||
291 | cookie& get_cookie(const key_type& n); | ||
292 | |||
293 | /** | ||
294 | * @param s HTTP 'Cookie' header content. | ||
295 | */ | ||
296 | void parse_cookies(const string& s); | ||
297 | }; | ||
298 | } | ||
299 | |||
300 | #endif /* __KINGATE_COOKIES_H */ | ||
diff --git a/include/kingate/headers.h b/include/kingate/headers.h new file mode 100644 index 0000000..fb37fec --- a/dev/null +++ b/include/kingate/headers.h | |||
@@ -0,0 +1,94 @@ | |||
1 | #ifndef __KINGATE_HEADERS_H | ||
2 | #define __KINGATE_HEADERS_H | ||
3 | |||
4 | #include <string> | ||
5 | #include <map> | ||
6 | #include <ostream> | ||
7 | |||
8 | /** | ||
9 | * @file | ||
10 | * @brief the headers -- HTTP headers container class. | ||
11 | */ | ||
12 | |||
13 | namespace kingate { | ||
14 | using namespace std; | ||
15 | |||
16 | /** | ||
17 | * The container class for HTTP headers. | ||
18 | */ | ||
19 | class headers : public multimap<string,string> { | ||
20 | public: | ||
21 | |||
22 | /** | ||
23 | * Reference header if one exists. | ||
24 | * @param k the header. | ||
25 | * @return reference to the content. | ||
26 | */ | ||
27 | const mapped_type& operator[](const key_type& k) const { | ||
28 | return get_header(k); | ||
29 | } | ||
30 | /** | ||
31 | * Reference header, creating one if needed. | ||
32 | * @param k the header. | ||
33 | * @return reference to the content. | ||
34 | */ | ||
35 | mapped_type& operator[](const key_type& k) { | ||
36 | return get_header(k); | ||
37 | } | ||
38 | |||
39 | /** | ||
40 | * Set HTTP header. Remove all existent occurences of headers with | ||
41 | * this name. | ||
42 | * @param h header name. | ||
43 | * @param c header content. | ||
44 | */ | ||
45 | void set_header(const key_type& h,const mapped_type& c); | ||
46 | /** | ||
47 | * Add HTTP header. | ||
48 | * @param h header name. | ||
49 | * @param c header content. | ||
50 | */ | ||
51 | void add_header(const key_type& h,const mapped_type& c); | ||
52 | /** | ||
53 | * Remove named header. | ||
54 | * @param h header name. | ||
55 | */ | ||
56 | void unset_header(const key_type& h); | ||
57 | /** | ||
58 | * Return const reference to the existing header. | ||
59 | * @param h header name. | ||
60 | * @return reference to header content. | ||
61 | */ | ||
62 | const mapped_type& get_header(const key_type& h) const; | ||
63 | /** | ||
64 | * Return reference to the header, creating one if needed. | ||
65 | * @param h header name. | ||
66 | * @return reference to the content. | ||
67 | */ | ||
68 | mapped_type& get_header(const key_type& h); | ||
69 | /** | ||
70 | * Return the range of headers with a certain name. | ||
71 | * @param h header name. | ||
72 | * @return pair of const iterators with the beginning and the end | ||
73 | * of range. | ||
74 | */ | ||
75 | pair<const_iterator,const_iterator> get_headers(const key_type& h) const; | ||
76 | /** | ||
77 | * Return the range of headers with a certain name. | ||
78 | * @param h header name. | ||
79 | * @return pair of iterators with the beginning and the end | ||
80 | * of range. | ||
81 | */ | ||
82 | pair<iterator,iterator> get_headers(const key_type& h); | ||
83 | /** | ||
84 | * Inquire whether the named header exists. | ||
85 | * @param h header name. | ||
86 | * @return true if exists. | ||
87 | */ | ||
88 | bool has_header(const key_type& h) const; | ||
89 | |||
90 | }; | ||
91 | |||
92 | } | ||
93 | |||
94 | #endif /* __KINGATE_HEADERS_H */ | ||
diff --git a/include/kingate/util.h b/include/kingate/util.h index 6024ccf..3fd96f6 100644 --- a/include/kingate/util.h +++ b/include/kingate/util.h | |||
@@ -28,6 +28,19 @@ namespace kingate { | |||
28 | string url_decode(const string& str); | 28 | string url_decode(const string& str); |
29 | 29 | ||
30 | /** | 30 | /** |
31 | * Quote string for use in HTTP header. | ||
32 | * @param str the string to quote. | ||
33 | * @return the quoted string. | ||
34 | */ | ||
35 | string http_quoted_string(const string& str); | ||
36 | /** | ||
37 | * Quote string for use in HTTP header if necessary. | ||
38 | * @param str the string to quote. | ||
39 | * @return the quoted string or token left as is. | ||
40 | */ | ||
41 | string http_quote(const string& str); | ||
42 | |||
43 | /** | ||
31 | * deprecated alias to url_encode. | 44 | * deprecated alias to url_encode. |
32 | * @see url_encode | 45 | * @see url_encode |
33 | */ | 46 | */ |