-rw-r--r-- | include/kingate/cgi_gateway.h | 1 | ||||
-rw-r--r-- | include/kingate/cookies.h | 4 | ||||
-rw-r--r-- | src/cookies.cc | 7 |
3 files changed, 7 insertions, 5 deletions
diff --git a/include/kingate/cgi_gateway.h b/include/kingate/cgi_gateway.h index a26b0ae..087f7d0 100644 --- a/include/kingate/cgi_gateway.h +++ b/include/kingate/cgi_gateway.h | |||
@@ -262,64 +262,63 @@ namespace kingate { | |||
262 | /** | 262 | /** |
263 | * Retrieve the REMOTE_HOST meta-variable (see RFC3875) | 263 | * Retrieve the REMOTE_HOST meta-variable (see RFC3875) |
264 | * @return the fully qualified domain name of the client if | 264 | * @return the fully qualified domain name of the client if |
265 | * available. REMOTE_ADDR otherwise. | 265 | * available. REMOTE_ADDR otherwise. |
266 | * @see remote_addr() | 266 | * @see remote_addr() |
267 | */ | 267 | */ |
268 | const string& remote_host() const; | 268 | const string& remote_host() const; |
269 | /** | 269 | /** |
270 | * Retrieve the REMOTE_IDENT meta-variable (see RFC3875) | 270 | * Retrieve the REMOTE_IDENT meta-variable (see RFC3875) |
271 | * @return remote user identity (see RFC1413). | 271 | * @return remote user identity (see RFC1413). |
272 | */ | 272 | */ |
273 | const string& remote_ident() const; | 273 | const string& remote_ident() const; |
274 | /** | 274 | /** |
275 | * Retrieve the REMOTE_USER meta-variable (see RFC3875) | 275 | * Retrieve the REMOTE_USER meta-variable (see RFC3875) |
276 | * @return the authenticated user name. | 276 | * @return the authenticated user name. |
277 | */ | 277 | */ |
278 | const string& remote_user() const; | 278 | const string& remote_user() const; |
279 | /** | 279 | /** |
280 | * Retrieve the REQUEST_METHOD meta-variable (see RFC3875) | 280 | * Retrieve the REQUEST_METHOD meta-variable (see RFC3875) |
281 | * @return the http request method. | 281 | * @return the http request method. |
282 | */ | 282 | */ |
283 | const string& request_method() const; | 283 | const string& request_method() const; |
284 | /** | 284 | /** |
285 | * Retrieve the SCRIPT_NAME meta-variable (see RFC3875) | 285 | * Retrieve the SCRIPT_NAME meta-variable (see RFC3875) |
286 | * @return the uri path identifying the script. | 286 | * @return the uri path identifying the script. |
287 | */ | 287 | */ |
288 | const string& script_name() const; | 288 | const string& script_name() const; |
289 | /** | 289 | /** |
290 | * Retrieve the SERVER_NAME meta-variable (see RFC3875) | 290 | * Retrieve the SERVER_NAME meta-variable (see RFC3875) |
291 | * @return the server name of the script. | 291 | * @return the server name of the script. |
292 | */ | 292 | */ |
293 | const string& server_name() const; | 293 | const string& server_name() const; |
294 | /** | 294 | /** |
295 | * Retrieve the SERVER_PORT meta-variable (see RFC3875) | 295 | * Retrieve the SERVER_PORT meta-variable (see RFC3875) |
296 | * @return the port on which request was received. | 296 | * @return the port on which request was received. |
297 | */ | 297 | */ |
298 | unsigned int server_port() const; | 298 | unsigned int server_port() const; |
299 | /** | 299 | /** |
300 | * Retrieve the SERVER_PROTOCOL meta-variable (see RFC3875) | 300 | * Retrieve the SERVER_PROTOCOL meta-variable (see RFC3875) |
301 | * @return the protocol used for the request. | 301 | * @return the protocol used for the request. |
302 | */ | 302 | */ |
303 | const string& server_protocol() const; | 303 | const string& server_protocol() const; |
304 | /** | 304 | /** |
305 | * Retrieve the SERVER_SOFTWARE meta-variable (see RFC3875) | 305 | * Retrieve the SERVER_SOFTWARE meta-variable (see RFC3875) |
306 | * @return the name and version of server software. | 306 | * @return the name and version of server software. |
307 | */ | 307 | */ |
308 | const string& server_software() const; | 308 | const string& server_software() const; |
309 | 309 | ||
310 | private: | ||
311 | /** | 310 | /** |
312 | * Parse the query string, putting the parameters into the map | 311 | * Parse the query string, putting the parameters into the map |
313 | * specified. | 312 | * specified. |
314 | * @param q the query string. | 313 | * @param q the query string. |
315 | * @param p destination parameters map. | 314 | * @param p destination parameters map. |
316 | */ | 315 | */ |
317 | static void parse_query(string& q,params_t& p); | 316 | static void parse_query(string& q,params_t& p); |
318 | }; | 317 | }; |
319 | 318 | ||
320 | } | 319 | } |
321 | 320 | ||
322 | #endif /* __KINGATE_CGI_GATEWAY_H */ | 321 | #endif /* __KINGATE_CGI_GATEWAY_H */ |
323 | /* | 322 | /* |
324 | * vim:set ft=cpp: | 323 | * vim:set ft=cpp: |
325 | */ | 324 | */ |
diff --git a/include/kingate/cookies.h b/include/kingate/cookies.h index 83ef0c6..a1e813c 100644 --- a/include/kingate/cookies.h +++ b/include/kingate/cookies.h | |||
@@ -210,91 +210,91 @@ namespace kingate { | |||
210 | void unset_comment(); | 210 | void unset_comment(); |
211 | /** | 211 | /** |
212 | * rid cookie of domain. | 212 | * rid cookie of domain. |
213 | * @see set_domain() | 213 | * @see set_domain() |
214 | * @see get_domain() | 214 | * @see get_domain() |
215 | * @see has_domain() | 215 | * @see has_domain() |
216 | */ | 216 | */ |
217 | void unset_domain(); | 217 | void unset_domain(); |
218 | /** | 218 | /** |
219 | * rid cookie of max-age. | 219 | * rid cookie of max-age. |
220 | * @see set_max_age() | 220 | * @see set_max_age() |
221 | * @see get_max_age() | 221 | * @see get_max_age() |
222 | * @see has_max_age() | 222 | * @see has_max_age() |
223 | */ | 223 | */ |
224 | void unset_max_age(); | 224 | void unset_max_age(); |
225 | /** | 225 | /** |
226 | * rid cookie of path. | 226 | * rid cookie of path. |
227 | * @see set_path() | 227 | * @see set_path() |
228 | * @see get_path() | 228 | * @see get_path() |
229 | * @see has_path() | 229 | * @see has_path() |
230 | */ | 230 | */ |
231 | void unset_path(); | 231 | void unset_path(); |
232 | 232 | ||
233 | /** | 233 | /** |
234 | * rid cookie of expiration time. | 234 | * rid cookie of expiration time. |
235 | * @see set_expires() | 235 | * @see set_expires() |
236 | * @see get_expires() | 236 | * @see get_expires() |
237 | * @see has_expires() | 237 | * @see has_expires() |
238 | */ | 238 | */ |
239 | void unset_expires(); | 239 | void unset_expires(); |
240 | 240 | ||
241 | /** | 241 | /** |
242 | * render the 'Set-Cookie' HTTP header according to RFC2109. | 242 | * render the 'Set-Cookie' HTTP header according to RFC2109. |
243 | * Absolutely useless, only works with lynx. | 243 | * Absolutely useless, only works with lynx. |
244 | * @return the rendered header content. | 244 | * @return the rendered header content. |
245 | */ | 245 | */ |
246 | string set_cookie_header_rfc2109() const; | 246 | string set_cookie_header_rfc2109() const; |
247 | /** | 247 | /** |
248 | * render the 'Set-Cookie' header according to the early vague | 248 | * render the 'Set-Cookie' header according to the early vague |
249 | * netscape specs and common practice. | 249 | * netscape specs and common practice. |
250 | * @return the rendered header content. | 250 | * @return the rendered header content. |
251 | */ | 251 | */ |
252 | string set_cookie_header() const; | 252 | string set_cookie_header() const; |
253 | }; | 253 | }; |
254 | 254 | ||
255 | /** | 255 | /** |
256 | * Cookies container class. | 256 | * Cookies container class. |
257 | */ | 257 | */ |
258 | class cookies_t : public map<string,cookie> { | 258 | class cookies_t : public multimap<string,cookie> { |
259 | public: | 259 | public: |
260 | 260 | ||
261 | cookies_t() { } | 261 | cookies_t() { } |
262 | /** | 262 | /** |
263 | * @param s 'Cookie:' HTTP header contents to parse. | 263 | * @param s 'Cookie:' HTTP header contents to parse. |
264 | */ | 264 | */ |
265 | cookies_t(const string& s) { parse_cookies(s); } | 265 | cookies_t(const string& s) { parse_cookies(s); } |
266 | 266 | ||
267 | /** | 267 | /** |
268 | * @param c cookie to set. | 268 | * @param c cookie to set. |
269 | */ | 269 | */ |
270 | void set_cookie(const cookie& c) { (*this)[c.get_name()]=c; } | 270 | void set_cookie(const cookie& c); |
271 | /** | 271 | /** |
272 | * @param n cookie name to remove. | 272 | * @param n cookie name to remove. |
273 | */ | 273 | */ |
274 | void unset_cookie(const key_type& n) { erase(n); } | 274 | void unset_cookie(const key_type& n) { erase(n); } |
275 | /** | 275 | /** |
276 | * @param n cookie name. | 276 | * @param n cookie name. |
277 | * @return true if exists. | 277 | * @return true if exists. |
278 | */ | 278 | */ |
279 | bool has_cookie(const key_type& n) const; | 279 | bool has_cookie(const key_type& n) const; |
280 | /** | 280 | /** |
281 | * Return the named cookie if one exists. | 281 | * Return the named cookie if one exists. |
282 | * @param n cookie name. | 282 | * @param n cookie name. |
283 | * @return const reference to cookie object. | 283 | * @return const reference to cookie object. |
284 | */ | 284 | */ |
285 | const cookie& get_cookie(const key_type& n) const; | 285 | const cookie& get_cookie(const key_type& n) const; |
286 | /** | 286 | /** |
287 | * Return the named cookie if one exists. | 287 | * Return the named cookie if one exists. |
288 | * @param n cookie name. | 288 | * @param n cookie name. |
289 | * @return reference to cookie object. | 289 | * @return reference to cookie object. |
290 | */ | 290 | */ |
291 | cookie& get_cookie(const key_type& n); | 291 | cookie& get_cookie(const key_type& n); |
292 | 292 | ||
293 | /** | 293 | /** |
294 | * @param s HTTP 'Cookie' header content. | 294 | * @param s HTTP 'Cookie' header content. |
295 | */ | 295 | */ |
296 | void parse_cookies(const string& s); | 296 | void parse_cookies(const string& s); |
297 | }; | 297 | }; |
298 | } | 298 | } |
299 | 299 | ||
300 | #endif /* __KINGATE_COOKIES_H */ | 300 | #endif /* __KINGATE_COOKIES_H */ |
diff --git a/src/cookies.cc b/src/cookies.cc index 40a0c8b..1ee4f7c 100644 --- a/src/cookies.cc +++ b/src/cookies.cc | |||
@@ -138,105 +138,108 @@ namespace kingate { | |||
138 | } | 138 | } |
139 | 139 | ||
140 | bool cookie::has_expires() const { | 140 | bool cookie::has_expires() const { |
141 | return find("expires")!=end(); | 141 | return find("expires")!=end(); |
142 | } | 142 | } |
143 | 143 | ||
144 | void cookie::unset_comment() { | 144 | void cookie::unset_comment() { |
145 | erase("comment"); | 145 | erase("comment"); |
146 | } | 146 | } |
147 | void cookie::unset_domain() { | 147 | void cookie::unset_domain() { |
148 | erase("domain"); | 148 | erase("domain"); |
149 | } | 149 | } |
150 | void cookie::unset_max_age() { | 150 | void cookie::unset_max_age() { |
151 | erase("max-age"); | 151 | erase("max-age"); |
152 | } | 152 | } |
153 | void cookie::unset_path() { | 153 | void cookie::unset_path() { |
154 | erase("path"); | 154 | erase("path"); |
155 | } | 155 | } |
156 | 156 | ||
157 | void cookie::unset_expires() { | 157 | void cookie::unset_expires() { |
158 | erase("expires"); | 158 | erase("expires"); |
159 | } | 159 | } |
160 | 160 | ||
161 | string cookie::set_cookie_header_rfc2109() const { | 161 | string cookie::set_cookie_header_rfc2109() const { |
162 | string rv = name + "=" + http_quoted_string(value); | 162 | string rv = name + "=" + http_quoted_string(value); |
163 | for(const_iterator i=begin();i!=end();++i) { | 163 | for(const_iterator i=begin();i!=end();++i) { |
164 | if(i->first=="secure") { | 164 | if(i->first=="secure") { |
165 | rv += "; secure"; | 165 | rv += "; secure"; |
166 | }else{ | 166 | }else{ |
167 | rv += "; "+i->first+"="+http_quote(i->second); | 167 | rv += "; "+i->first+"="+http_quote(i->second); |
168 | } | 168 | } |
169 | } | 169 | } |
170 | rv += "; Version=1"; | 170 | rv += "; Version=1"; |
171 | return rv; | 171 | return rv; |
172 | } | 172 | } |
173 | 173 | ||
174 | string cookie::set_cookie_header() const { | 174 | string cookie::set_cookie_header() const { |
175 | string rv = name + "=" + value; | 175 | string rv = name + "=" + value; |
176 | for(const_iterator i=begin();i!=end();++i) { | 176 | for(const_iterator i=begin();i!=end();++i) { |
177 | if(i->first=="secure") { | 177 | if(i->first=="secure") { |
178 | rv += "; secure"; | 178 | rv += "; secure"; |
179 | }else{ | 179 | }else{ |
180 | rv += "; "+i->first+"="+i->second; | 180 | rv += "; "+i->first+"="+i->second; |
181 | } | 181 | } |
182 | } | 182 | } |
183 | return rv; | 183 | return rv; |
184 | } | 184 | } |
185 | 185 | ||
186 | void cookies_t::set_cookie(const cookie& c) { | ||
187 | insert(value_type(c.get_name(),c)); | ||
188 | } | ||
189 | |||
186 | bool cookies_t::has_cookie(const key_type& n) const { | 190 | bool cookies_t::has_cookie(const key_type& n) const { |
187 | return find(n)!=end(); | 191 | return find(n)!=end(); |
188 | } | 192 | } |
189 | 193 | ||
190 | const cookie& cookies_t::get_cookie(const key_type& n) const { | 194 | const cookie& cookies_t::get_cookie(const key_type& n) const { |
191 | const_iterator i=find(n); | 195 | const_iterator i=find(n); |
192 | if(i==end()) | 196 | if(i==end()) |
193 | throw exception_notfound(CODEPOINT,"No cookie with such name found"); | 197 | throw exception_notfound(CODEPOINT,"No cookie with such name found"); |
194 | return i->second; | 198 | return i->second; |
195 | } | 199 | } |
196 | 200 | ||
197 | cookie& cookies_t::get_cookie(const key_type& n) { | 201 | cookie& cookies_t::get_cookie(const key_type& n) { |
198 | iterator i=find(n); | 202 | iterator i=find(n); |
199 | if(i==end()) | 203 | if(i==end()) |
200 | throw exception_notfound(CODEPOINT,"No cookie with such name found"); | 204 | throw exception_notfound(CODEPOINT,"No cookie with such name found"); |
201 | return i->second; | 205 | return i->second; |
202 | } | 206 | } |
203 | 207 | ||
204 | void cookies_t::parse_cookies(const string& s) { | 208 | void cookies_t::parse_cookies(const string& s) { |
205 | string str = s; | 209 | string str = s; |
206 | while(!str.empty()) { | 210 | while(!str.empty()) { |
207 | string::size_type sc = str.find(';'); | 211 | string::size_type sc = str.find(';'); |
208 | string s; | 212 | string s; |
209 | if(sc==string::npos) { | 213 | if(sc==string::npos) { |
210 | s = str; | 214 | s = str; |
211 | str.erase(); | 215 | str.erase(); |
212 | }else{ | 216 | }else{ |
213 | s = str.substr(0,sc); | 217 | s = str.substr(0,sc); |
214 | str.erase(0,sc+1); | 218 | str.erase(0,sc+1); |
215 | } | 219 | } |
216 | string::size_type nsp=s.find_first_not_of(" \t"); | 220 | string::size_type nsp=s.find_first_not_of(" \t"); |
217 | if((nsp!=string::npos) && nsp) | 221 | if((nsp!=string::npos) && nsp) |
218 | s.erase(0,nsp); | 222 | s.erase(0,nsp); |
219 | string::size_type eq=s.find('='); | 223 | string::size_type eq=s.find('='); |
220 | if(eq==string::npos) | 224 | if(eq==string::npos) |
221 | continue; | 225 | continue; |
222 | string n = s.substr(0,eq); | 226 | string n = s.substr(0,eq); |
223 | s.erase(0,eq+1); | 227 | s.erase(0,eq+1); |
224 | nsp = n.find_last_not_of(" \t"); | 228 | nsp = n.find_last_not_of(" \t"); |
225 | n.erase(nsp+1); | 229 | n.erase(nsp+1); |
226 | nsp = s.find_first_not_of(" \t"); | 230 | nsp = s.find_first_not_of(" \t"); |
227 | string v; | 231 | string v; |
228 | if(nsp!=string::npos) | 232 | if(nsp!=string::npos) |
229 | v = s.substr(nsp); | 233 | v = s.substr(nsp); |
230 | else | 234 | else |
231 | v = s; | 235 | v = s; |
232 | nsp = v.find_last_not_of(" \t"); | 236 | nsp = v.find_last_not_of(" \t"); |
233 | if(nsp==string::npos) | 237 | if(nsp==string::npos) |
234 | v.erase(); | 238 | v.erase(); |
235 | else | 239 | else |
236 | v.erase(nsp+1); | 240 | v.erase(nsp+1); |
237 | cookie& c = (*this)[n]; | 241 | set_cookie(cookie(n,v)); |
238 | c.set_name(n); c.set_value(v); | ||
239 | } | 242 | } |
240 | } | 243 | } |
241 | 244 | ||
242 | } | 245 | } |