-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 { /** * Retrieve the REMOTE_HOST meta-variable (see RFC3875) * @return the fully qualified domain name of the client if * available. REMOTE_ADDR otherwise. * @see remote_addr() */ const string& remote_host() const; /** * Retrieve the REMOTE_IDENT meta-variable (see RFC3875) * @return remote user identity (see RFC1413). */ const string& remote_ident() const; /** * Retrieve the REMOTE_USER meta-variable (see RFC3875) * @return the authenticated user name. */ const string& remote_user() const; /** * Retrieve the REQUEST_METHOD meta-variable (see RFC3875) * @return the http request method. */ const string& request_method() const; /** * Retrieve the SCRIPT_NAME meta-variable (see RFC3875) * @return the uri path identifying the script. */ const string& script_name() const; /** * Retrieve the SERVER_NAME meta-variable (see RFC3875) * @return the server name of the script. */ const string& server_name() const; /** * Retrieve the SERVER_PORT meta-variable (see RFC3875) * @return the port on which request was received. */ unsigned int server_port() const; /** * Retrieve the SERVER_PROTOCOL meta-variable (see RFC3875) * @return the protocol used for the request. */ const string& server_protocol() const; /** * Retrieve the SERVER_SOFTWARE meta-variable (see RFC3875) * @return the name and version of server software. */ const string& server_software() const; - private: /** * Parse the query string, putting the parameters into the map * specified. * @param q the query string. * @param p destination parameters map. */ static void parse_query(string& q,params_t& p); }; } #endif /* __KINGATE_CGI_GATEWAY_H */ /* * vim:set ft=cpp: */ 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 { void unset_comment(); /** * rid cookie of domain. * @see set_domain() * @see get_domain() * @see has_domain() */ void unset_domain(); /** * rid cookie of max-age. * @see set_max_age() * @see get_max_age() * @see has_max_age() */ void unset_max_age(); /** * rid cookie of path. * @see set_path() * @see get_path() * @see has_path() */ void unset_path(); /** * rid cookie of expiration time. * @see set_expires() * @see get_expires() * @see has_expires() */ void unset_expires(); /** * render the 'Set-Cookie' HTTP header according to RFC2109. * Absolutely useless, only works with lynx. * @return the rendered header content. */ string set_cookie_header_rfc2109() const; /** * render the 'Set-Cookie' header according to the early vague * netscape specs and common practice. * @return the rendered header content. */ string set_cookie_header() const; }; /** * Cookies container class. */ - class cookies_t : public map<string,cookie> { + class cookies_t : public multimap<string,cookie> { public: cookies_t() { } /** * @param s 'Cookie:' HTTP header contents to parse. */ cookies_t(const string& s) { parse_cookies(s); } /** * @param c cookie to set. */ - void set_cookie(const cookie& c) { (*this)[c.get_name()]=c; } + void set_cookie(const cookie& c); /** * @param n cookie name to remove. */ void unset_cookie(const key_type& n) { erase(n); } /** * @param n cookie name. * @return true if exists. */ bool has_cookie(const key_type& n) const; /** * Return the named cookie if one exists. * @param n cookie name. * @return const reference to cookie object. */ const cookie& get_cookie(const key_type& n) const; /** * Return the named cookie if one exists. * @param n cookie name. * @return reference to cookie object. */ cookie& get_cookie(const key_type& n); /** * @param s HTTP 'Cookie' header content. */ void parse_cookies(const string& s); }; } #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 { } bool cookie::has_expires() const { return find("expires")!=end(); } void cookie::unset_comment() { erase("comment"); } void cookie::unset_domain() { erase("domain"); } void cookie::unset_max_age() { erase("max-age"); } void cookie::unset_path() { erase("path"); } void cookie::unset_expires() { erase("expires"); } string cookie::set_cookie_header_rfc2109() const { string rv = name + "=" + http_quoted_string(value); for(const_iterator i=begin();i!=end();++i) { if(i->first=="secure") { rv += "; secure"; }else{ rv += "; "+i->first+"="+http_quote(i->second); } } rv += "; Version=1"; return rv; } string cookie::set_cookie_header() const { string rv = name + "=" + value; for(const_iterator i=begin();i!=end();++i) { if(i->first=="secure") { rv += "; secure"; }else{ rv += "; "+i->first+"="+i->second; } } return rv; } + void cookies_t::set_cookie(const cookie& c) { + insert(value_type(c.get_name(),c)); + } + bool cookies_t::has_cookie(const key_type& n) const { return find(n)!=end(); } const cookie& cookies_t::get_cookie(const key_type& n) const { const_iterator i=find(n); if(i==end()) throw exception_notfound(CODEPOINT,"No cookie with such name found"); return i->second; } cookie& cookies_t::get_cookie(const key_type& n) { iterator i=find(n); if(i==end()) throw exception_notfound(CODEPOINT,"No cookie with such name found"); return i->second; } void cookies_t::parse_cookies(const string& s) { string str = s; while(!str.empty()) { string::size_type sc = str.find(';'); string s; if(sc==string::npos) { s = str; str.erase(); }else{ s = str.substr(0,sc); str.erase(0,sc+1); } string::size_type nsp=s.find_first_not_of(" \t"); if((nsp!=string::npos) && nsp) s.erase(0,nsp); string::size_type eq=s.find('='); if(eq==string::npos) continue; string n = s.substr(0,eq); s.erase(0,eq+1); nsp = n.find_last_not_of(" \t"); n.erase(nsp+1); nsp = s.find_first_not_of(" \t"); string v; if(nsp!=string::npos) v = s.substr(nsp); else v = s; nsp = v.find_last_not_of(" \t"); if(nsp==string::npos) v.erase(); else v.erase(nsp+1); - cookie& c = (*this)[n]; - c.set_name(n); c.set_value(v); + set_cookie(cookie(n,v)); } } } |