author | Michael Krelin <hacker@klever.net> | 2005-05-09 11:00:28 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2005-05-09 11:00:28 (UTC) |
commit | 43d47575878e4eaf3c8da84bf609fcd0bde595fb (patch) (unidiff) | |
tree | f7ec4d1f0d0a01b43feb5c9b4f414e870036522c /include/kingate | |
parent | d9578a5ae0ac4e44ff5e3c13d3f39f400f51bcf2 (diff) | |
download | kingate-43d47575878e4eaf3c8da84bf609fcd0bde595fb.zip kingate-43d47575878e4eaf3c8da84bf609fcd0bde595fb.tar.gz kingate-43d47575878e4eaf3c8da84bf609fcd0bde595fb.tar.bz2 |
1. http headers container added
2. preliminary cookies support
3. absolutely useless http_quoted_string and http_quote utility functions added
-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 |
4 files changed, 412 insertions, 0 deletions
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 | |||
@@ -1,236 +1,241 @@ | |||
1 | #ifndef __KINGATE_CGI_GATEWAY_H | 1 | #ifndef __KINGATE_CGI_GATEWAY_H |
2 | #define __KINGATE_CGI_GATEWAY_H | 2 | #define __KINGATE_CGI_GATEWAY_H |
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 |
9 | #define __deprecated __attribute__((deprecated)) | 10 | #define __deprecated __attribute__((deprecated)) |
10 | #else | 11 | #else |
11 | #define __deprecated | 12 | #define __deprecated |
12 | #endif | 13 | #endif |
13 | #endif | 14 | #endif |
14 | 15 | ||
15 | /** | 16 | /** |
16 | * @file | 17 | * @file |
17 | * @brief the cgi_gateway -- main interface to CGI. | 18 | * @brief the cgi_gateway -- main interface to CGI. |
18 | */ | 19 | */ |
19 | 20 | ||
20 | namespace kingate { | 21 | namespace kingate { |
21 | using namespace std; | 22 | using namespace std; |
22 | 23 | ||
23 | /** | 24 | /** |
24 | * The main class interfacing with the CGI environment. | 25 | * The main class interfacing with the CGI environment. |
25 | */ | 26 | */ |
26 | class cgi_gateway { | 27 | class cgi_gateway { |
27 | public: | 28 | public: |
28 | /** | 29 | /** |
29 | * The interface to CGI environment (e.g. fastcgi). | 30 | * The interface to CGI environment (e.g. fastcgi). |
30 | */ | 31 | */ |
31 | cgi_interface& iface; | 32 | cgi_interface& iface; |
32 | /** | 33 | /** |
33 | * The type describing map holding parameters parsed from query string or input. | 34 | * The type describing map holding parameters parsed from query string or input. |
34 | */ | 35 | */ |
35 | typedef multimap<string,string> params_t; | 36 | typedef multimap<string,string> params_t; |
36 | /** | 37 | /** |
37 | * The GET-passed parameters. | 38 | * The GET-passed parameters. |
38 | */ | 39 | */ |
39 | params_t get; | 40 | params_t get; |
40 | /** | 41 | /** |
41 | * The POST-passed parameters. | 42 | * The POST-passed parameters. |
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; |
48 | 53 | ||
49 | /** | 54 | /** |
50 | * @param ci the interface to use. | 55 | * @param ci the interface to use. |
51 | */ | 56 | */ |
52 | cgi_gateway(cgi_interface& ci); | 57 | cgi_gateway(cgi_interface& ci); |
53 | 58 | ||
54 | /** | 59 | /** |
55 | * Check whether there is an 'environment' meta-variable with specific name | 60 | * Check whether there is an 'environment' meta-variable with specific name |
56 | * passed to CGI. | 61 | * passed to CGI. |
57 | * @param n variable name. | 62 | * @param n variable name. |
58 | * @return true if yes. | 63 | * @return true if yes. |
59 | * @see cgi_interface::has_meta() | 64 | * @see cgi_interface::has_meta() |
60 | * @see get_meta() | 65 | * @see get_meta() |
61 | */ | 66 | */ |
62 | bool has_meta(const string& n) const { return iface.has_meta(n); } | 67 | bool has_meta(const string& n) const { return iface.has_meta(n); } |
63 | /** | 68 | /** |
64 | * Retrieve the 'environment' meta-variable value. | 69 | * Retrieve the 'environment' meta-variable value. |
65 | * @param n variable name. | 70 | * @param n variable name. |
66 | * @return variable contents. | 71 | * @return variable contents. |
67 | * @see exception_notfound | 72 | * @see exception_notfound |
68 | * @see cgi_interface::get_meta() | 73 | * @see cgi_interface::get_meta() |
69 | */ | 74 | */ |
70 | const string& get_meta(const string& n) const { return iface.get_meta(n); } | 75 | const string& get_meta(const string& n) const { return iface.get_meta(n); } |
71 | 76 | ||
72 | /** | 77 | /** |
73 | * fetch reference to the 'stdin' stream. | 78 | * fetch reference to the 'stdin' stream. |
74 | * @return the reference to the corresponding istream object. | 79 | * @return the reference to the corresponding istream object. |
75 | * @see cgi_interface::in() | 80 | * @see cgi_interface::in() |
76 | */ | 81 | */ |
77 | istream& in() { return iface.in(); } | 82 | istream& in() { return iface.in(); } |
78 | /** | 83 | /** |
79 | * fetch reference to the 'stdout' stream. | 84 | * fetch reference to the 'stdout' stream. |
80 | * @return the reference to the corresponding ostream object. | 85 | * @return the reference to the corresponding ostream object. |
81 | * @see cgi_interface::out() | 86 | * @see cgi_interface::out() |
82 | */ | 87 | */ |
83 | ostream& out() { return iface.out(); } | 88 | ostream& out() { return iface.out(); } |
84 | /** | 89 | /** |
85 | * fetch reference to the 'stderr' stream. | 90 | * fetch reference to the 'stderr' stream. |
86 | * @return the reference to the corresponding ostream object. | 91 | * @return the reference to the corresponding ostream object. |
87 | * @see cgi_interface::err() | 92 | * @see cgi_interface::err() |
88 | */ | 93 | */ |
89 | ostream& err() { return iface.err(); } | 94 | ostream& err() { return iface.err(); } |
90 | /** | 95 | /** |
91 | * cast to the ostream -- fetches the reference to the 'stdout' | 96 | * cast to the ostream -- fetches the reference to the 'stdout' |
92 | * stream. | 97 | * stream. |
93 | * @see out() | 98 | * @see out() |
94 | */ | 99 | */ |
95 | operator ostream& (void) { return out(); } | 100 | operator ostream& (void) { return out(); } |
96 | 101 | ||
97 | /** | 102 | /** |
98 | * Check to see whether the parameter was passed via GET. | 103 | * Check to see whether the parameter was passed via GET. |
99 | * @param n the parameter name. | 104 | * @param n the parameter name. |
100 | * @return true if yes. | 105 | * @return true if yes. |
101 | */ | 106 | */ |
102 | bool has_GET(const string& n) const; | 107 | bool has_GET(const string& n) const; |
103 | /** | 108 | /** |
104 | * Retrieve the parameter passed via GET. | 109 | * Retrieve the parameter passed via GET. |
105 | * @param n the parameter name. | 110 | * @param n the parameter name. |
106 | * @return the parameter contents. | 111 | * @return the parameter contents. |
107 | * @see exception_notfound | 112 | * @see exception_notfound |
108 | */ | 113 | */ |
109 | const string& get_GET(const string& n) const; | 114 | const string& get_GET(const string& n) const; |
110 | /** | 115 | /** |
111 | * Check to see whether the parameter was passed via POST. | 116 | * Check to see whether the parameter was passed via POST. |
112 | * @param n the parameter name. | 117 | * @param n the parameter name. |
113 | * @return true if yes. | 118 | * @return true if yes. |
114 | */ | 119 | */ |
115 | bool has_POST(const string& n) const; | 120 | bool has_POST(const string& n) const; |
116 | /** | 121 | /** |
117 | * Retrieve the POST-parameter. | 122 | * Retrieve the POST-parameter. |
118 | * @param n the parameter name. | 123 | * @param n the parameter name. |
119 | * @return the parameter contents. | 124 | * @return the parameter contents. |
120 | * @see exception_notfound | 125 | * @see exception_notfound |
121 | */ | 126 | */ |
122 | const string& get_POST(const string& n) const; | 127 | const string& get_POST(const string& n) const; |
123 | /** | 128 | /** |
124 | * Check to see whether the parameter was passed either via POST or | 129 | * Check to see whether the parameter was passed either via POST or |
125 | * GET. | 130 | * GET. |
126 | * @param n the parameter name. | 131 | * @param n the parameter name. |
127 | * @return true if yes. | 132 | * @return true if yes. |
128 | */ | 133 | */ |
129 | bool has_param(const string& n) const; | 134 | bool has_param(const string& n) const; |
130 | /** | 135 | /** |
131 | * Retrieve the parameter passed either via POST or GET | 136 | * Retrieve the parameter passed either via POST or GET |
132 | * (GET-parameter takes precedence). | 137 | * (GET-parameter takes precedence). |
133 | * @param n the parameter name. | 138 | * @param n the parameter name. |
134 | * @return true if yes. | 139 | * @return true if yes. |
135 | * @see exception_notfound. | 140 | * @see exception_notfound. |
136 | */ | 141 | */ |
137 | const string& get_param(const string& n) const; | 142 | const string& get_param(const string& n) const; |
138 | 143 | ||
139 | /** | 144 | /** |
140 | * Retrieve the POST content-type (as passed via CONTENT_TYPE | 145 | * Retrieve the POST content-type (as passed via CONTENT_TYPE |
141 | * environment variable). | 146 | * environment variable). |
142 | * @return the content type. | 147 | * @return the content type. |
143 | */ | 148 | */ |
144 | const string& __deprecated get_content_type() const; | 149 | const string& __deprecated get_content_type() const; |
145 | /** | 150 | /** |
146 | * Retrieve the POST content length (as passed via the | 151 | * Retrieve the POST content length (as passed via the |
147 | * CONTENT_LENGTH environment variable). | 152 | * CONTENT_LENGTH environment variable). |
148 | * @return the content length. | 153 | * @return the content length. |
149 | */ | 154 | */ |
150 | unsigned long __deprecated get_content_length() const; | 155 | unsigned long __deprecated get_content_length() const; |
151 | 156 | ||
152 | /** | 157 | /** |
153 | * Check to see whether the content from stdin stream was parsed. | 158 | * Check to see whether the content from stdin stream was parsed. |
154 | * @return true if yes. | 159 | * @return true if yes. |
155 | */ | 160 | */ |
156 | bool is_content_parsed() const { return b_parsed_content; } | 161 | bool is_content_parsed() const { return b_parsed_content; } |
157 | 162 | ||
158 | /** | 163 | /** |
159 | * Retrieve the HTTP header value from the HTTP_ meta-variable. | 164 | * Retrieve the HTTP header value from the HTTP_ meta-variable. |
160 | * (see RFC3875) | 165 | * (see RFC3875) |
161 | * @param hn header field name. | 166 | * @param hn header field name. |
162 | * @return the HTTP header value. | 167 | * @return the HTTP header value. |
163 | */ | 168 | */ |
164 | const string& http_request_header(const string& hn) const; | 169 | const string& http_request_header(const string& hn) const; |
165 | 170 | ||
166 | /** | 171 | /** |
167 | * Retrieve the AUTH_TYPE meta-variable (see RFC3875) | 172 | * Retrieve the AUTH_TYPE meta-variable (see RFC3875) |
168 | * @return authentication type. | 173 | * @return authentication type. |
169 | */ | 174 | */ |
170 | const string& auth_type() const; | 175 | const string& auth_type() const; |
171 | /** | 176 | /** |
172 | * Retrieve the CONTENT_LENGTH meta-variable (see RFC3875) | 177 | * Retrieve the CONTENT_LENGTH meta-variable (see RFC3875) |
173 | * @return size of the request message body. | 178 | * @return size of the request message body. |
174 | */ | 179 | */ |
175 | unsigned long cgi_gateway::content_length() const; | 180 | unsigned long cgi_gateway::content_length() const; |
176 | /** | 181 | /** |
177 | * Retrieve the CONTENT_TYPE meta-variable (see RFC3875) | 182 | * Retrieve the CONTENT_TYPE meta-variable (see RFC3875) |
178 | * @return media type of the request message body. | 183 | * @return media type of the request message body. |
179 | */ | 184 | */ |
180 | const string& content_type() const; | 185 | const string& content_type() const; |
181 | /** | 186 | /** |
182 | * Retrieve the GATEWAY_INTERFACE meta-variable (see RFC3875) | 187 | * Retrieve the GATEWAY_INTERFACE meta-variable (see RFC3875) |
183 | * @return the gateway interface dialect. | 188 | * @return the gateway interface dialect. |
184 | */ | 189 | */ |
185 | const string& gateway_interface() const; | 190 | const string& gateway_interface() const; |
186 | /** | 191 | /** |
187 | * Retrieve the PATH_INFO meta-variable (see RFC3875) | 192 | * Retrieve the PATH_INFO meta-variable (see RFC3875) |
188 | * @return path to be interpreted by the script. | 193 | * @return path to be interpreted by the script. |
189 | */ | 194 | */ |
190 | const string& path_info() const; | 195 | const string& path_info() const; |
191 | /** | 196 | /** |
192 | * Retrieve the PATH_TRANSLATED meta-variable (see RFC3875) | 197 | * Retrieve the PATH_TRANSLATED meta-variable (see RFC3875) |
193 | * @return the translated path to the document. | 198 | * @return the translated path to the document. |
194 | */ | 199 | */ |
195 | const string& path_translated() const; | 200 | const string& path_translated() const; |
196 | /** | 201 | /** |
197 | * Retrieve the QUERY_STRING meta-variable (see RFC3875) | 202 | * Retrieve the QUERY_STRING meta-variable (see RFC3875) |
198 | * @return the query string. | 203 | * @return the query string. |
199 | */ | 204 | */ |
200 | const string& query_string() const; | 205 | const string& query_string() const; |
201 | /** | 206 | /** |
202 | * Retrieve the REMOTE_ADDR meta-variable (see RFC3875) | 207 | * Retrieve the REMOTE_ADDR meta-variable (see RFC3875) |
203 | * @return the network address of the remote host. | 208 | * @return the network address of the remote host. |
204 | */ | 209 | */ |
205 | const string& remote_addr() const; | 210 | const string& remote_addr() const; |
206 | /** | 211 | /** |
207 | * Retrieve the REMOTE_HOST meta-variable (see RFC3875) | 212 | * Retrieve the REMOTE_HOST meta-variable (see RFC3875) |
208 | * @return the fully qualified domain name of the client if | 213 | * @return the fully qualified domain name of the client if |
209 | * available. REMOTE_ADDR otherwise. | 214 | * available. REMOTE_ADDR otherwise. |
210 | * @see remote_addr() | 215 | * @see remote_addr() |
211 | */ | 216 | */ |
212 | const string& remote_host() const; | 217 | const string& remote_host() const; |
213 | /** | 218 | /** |
214 | * Retrieve the REMOTE_IDENT meta-variable (see RFC3875) | 219 | * Retrieve the REMOTE_IDENT meta-variable (see RFC3875) |
215 | * @return remote user identity (see RFC1413). | 220 | * @return remote user identity (see RFC1413). |
216 | */ | 221 | */ |
217 | const string& remote_ident() const; | 222 | const string& remote_ident() const; |
218 | /** | 223 | /** |
219 | * Retrieve the REMOTE_USER meta-variable (see RFC3875) | 224 | * Retrieve the REMOTE_USER meta-variable (see RFC3875) |
220 | * @return the authenticated user name. | 225 | * @return the authenticated user name. |
221 | */ | 226 | */ |
222 | const string& remote_user() const; | 227 | const string& remote_user() const; |
223 | /** | 228 | /** |
224 | * Retrieve the REQUEST_METHOD meta-variable (see RFC3875) | 229 | * Retrieve the REQUEST_METHOD meta-variable (see RFC3875) |
225 | * @return the http request method. | 230 | * @return the http request method. |
226 | */ | 231 | */ |
227 | const string& request_method() const; | 232 | const string& request_method() const; |
228 | /** | 233 | /** |
229 | * Retrieve the SCRIPT_NAME meta-variable (see RFC3875) | 234 | * Retrieve the SCRIPT_NAME meta-variable (see RFC3875) |
230 | * @return the uri path identifying the script. | 235 | * @return the uri path identifying the script. |
231 | */ | 236 | */ |
232 | const string& script_name() const; | 237 | const string& script_name() const; |
233 | /** | 238 | /** |
234 | * Retrieve the SERVER_NAME meta-variable (see RFC3875) | 239 | * Retrieve the SERVER_NAME meta-variable (see RFC3875) |
235 | * @return the server name of the script. | 240 | * @return the server name of the script. |
236 | */ | 241 | */ |
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 | |||
@@ -1,49 +1,62 @@ | |||
1 | #ifndef __KINGATE_UTIL_H | 1 | #ifndef __KINGATE_UTIL_H |
2 | #define __KINGATE_UTIL_H | 2 | #define __KINGATE_UTIL_H |
3 | 3 | ||
4 | #include <string> | 4 | #include <string> |
5 | 5 | ||
6 | #ifndef __deprecated | 6 | #ifndef __deprecated |
7 | #if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3 | 7 | #if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3 |
8 | #define __deprecated __attribute__((deprecated)) | 8 | #define __deprecated __attribute__((deprecated)) |
9 | #else | 9 | #else |
10 | #define __deprecated | 10 | #define __deprecated |
11 | #endif | 11 | #endif |
12 | #endif | 12 | #endif |
13 | 13 | ||
14 | namespace kingate { | 14 | namespace kingate { |
15 | using namespace std; | 15 | using namespace std; |
16 | 16 | ||
17 | /** | 17 | /** |
18 | * Encode string for passing via URL. | 18 | * Encode string for passing via URL. |
19 | * @param str string unencoded. | 19 | * @param str string unencoded. |
20 | * @return the encoded string. | 20 | * @return the encoded string. |
21 | */ | 21 | */ |
22 | string url_encode(const string& str); | 22 | string url_encode(const string& str); |
23 | /** | 23 | /** |
24 | * Remove URL-encoding from the string. | 24 | * Remove URL-encoding from the string. |
25 | * @param str the URL-encoded string. | 25 | * @param str the URL-encoded string. |
26 | * @return the decoded string. | 26 | * @return the decoded string. |
27 | */ | 27 | */ |
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 | */ |
34 | inline string __deprecated url_escape(const string& str) { | 47 | inline string __deprecated url_escape(const string& str) { |
35 | return url_encode(str); | 48 | return url_encode(str); |
36 | } | 49 | } |
37 | /** | 50 | /** |
38 | * deprecated alias to url_decode. | 51 | * deprecated alias to url_decode. |
39 | * @see url_decode | 52 | * @see url_decode |
40 | */ | 53 | */ |
41 | inline string __deprecated url_unescape(const string& str) { | 54 | inline string __deprecated url_unescape(const string& str) { |
42 | return url_decode(str); | 55 | return url_decode(str); |
43 | } | 56 | } |
44 | } | 57 | } |
45 | 58 | ||
46 | #endif /* __KINGATE_UTIL_H */ | 59 | #endif /* __KINGATE_UTIL_H */ |
47 | /* | 60 | /* |
48 | * vim:set ft=cpp: | 61 | * vim:set ft=cpp: |
49 | */ | 62 | */ |