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) (side-by-side diff) | |
tree | f7ec4d1f0d0a01b43feb5c9b4f414e870036522c /include | |
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/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 @@ -1,7 +1,9 @@ nobase_include_HEADERS = \ kingate/cgi_gateway.h \ kingate/cgi_interface.h \ kingate/fastcgi.h \ kingate/exception.h \ kingate/util.h \ - kingate/plaincgi.h + kingate/plaincgi.h \ + kingate/cookies.h \ + 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 @@ -1,269 +1,274 @@ #ifndef __KINGATE_CGI_GATEWAY_H #define __KINGATE_CGI_GATEWAY_H #include <map> #include "kingate/cgi_interface.h" +#include "kingate/cookies.h" #ifndef __deprecated #if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3 #define __deprecated __attribute__((deprecated)) #else #define __deprecated #endif #endif /** * @file * @brief the cgi_gateway -- main interface to CGI. */ namespace kingate { using namespace std; /** * The main class interfacing with the CGI environment. */ class cgi_gateway { public: /** * The interface to CGI environment (e.g. fastcgi). */ cgi_interface& iface; /** * The type describing map holding parameters parsed from query string or input. */ typedef multimap<string,string> params_t; /** * The GET-passed parameters. */ params_t get; /** * The POST-passed parameters. */ params_t post; /** + * Cookies passed. + */ + cookies_t cookies; + /** * Was the stdin content parsed? */ bool b_parsed_content; /** * @param ci the interface to use. */ cgi_gateway(cgi_interface& ci); /** * Check whether there is an 'environment' meta-variable with specific name * passed to CGI. * @param n variable name. * @return true if yes. * @see cgi_interface::has_meta() * @see get_meta() */ bool has_meta(const string& n) const { return iface.has_meta(n); } /** * Retrieve the 'environment' meta-variable value. * @param n variable name. * @return variable contents. * @see exception_notfound * @see cgi_interface::get_meta() */ const string& get_meta(const string& n) const { return iface.get_meta(n); } /** * fetch reference to the 'stdin' stream. * @return the reference to the corresponding istream object. * @see cgi_interface::in() */ istream& in() { return iface.in(); } /** * fetch reference to the 'stdout' stream. * @return the reference to the corresponding ostream object. * @see cgi_interface::out() */ ostream& out() { return iface.out(); } /** * fetch reference to the 'stderr' stream. * @return the reference to the corresponding ostream object. * @see cgi_interface::err() */ ostream& err() { return iface.err(); } /** * cast to the ostream -- fetches the reference to the 'stdout' * stream. * @see out() */ operator ostream& (void) { return out(); } /** * Check to see whether the parameter was passed via GET. * @param n the parameter name. * @return true if yes. */ bool has_GET(const string& n) const; /** * Retrieve the parameter passed via GET. * @param n the parameter name. * @return the parameter contents. * @see exception_notfound */ const string& get_GET(const string& n) const; /** * Check to see whether the parameter was passed via POST. * @param n the parameter name. * @return true if yes. */ bool has_POST(const string& n) const; /** * Retrieve the POST-parameter. * @param n the parameter name. * @return the parameter contents. * @see exception_notfound */ const string& get_POST(const string& n) const; /** * Check to see whether the parameter was passed either via POST or * GET. * @param n the parameter name. * @return true if yes. */ bool has_param(const string& n) const; /** * Retrieve the parameter passed either via POST or GET * (GET-parameter takes precedence). * @param n the parameter name. * @return true if yes. * @see exception_notfound. */ const string& get_param(const string& n) const; /** * Retrieve the POST content-type (as passed via CONTENT_TYPE * environment variable). * @return the content type. */ const string& __deprecated get_content_type() const; /** * Retrieve the POST content length (as passed via the * CONTENT_LENGTH environment variable). * @return the content length. */ unsigned long __deprecated get_content_length() const; /** * Check to see whether the content from stdin stream was parsed. * @return true if yes. */ bool is_content_parsed() const { return b_parsed_content; } /** * Retrieve the HTTP header value from the HTTP_ meta-variable. * (see RFC3875) * @param hn header field name. * @return the HTTP header value. */ const string& http_request_header(const string& hn) const; /** * Retrieve the AUTH_TYPE meta-variable (see RFC3875) * @return authentication type. */ const string& auth_type() const; /** * Retrieve the CONTENT_LENGTH meta-variable (see RFC3875) * @return size of the request message body. */ unsigned long cgi_gateway::content_length() const; /** * Retrieve the CONTENT_TYPE meta-variable (see RFC3875) * @return media type of the request message body. */ const string& content_type() const; /** * Retrieve the GATEWAY_INTERFACE meta-variable (see RFC3875) * @return the gateway interface dialect. */ const string& gateway_interface() const; /** * Retrieve the PATH_INFO meta-variable (see RFC3875) * @return path to be interpreted by the script. */ const string& path_info() const; /** * Retrieve the PATH_TRANSLATED meta-variable (see RFC3875) * @return the translated path to the document. */ const string& path_translated() const; /** * Retrieve the QUERY_STRING meta-variable (see RFC3875) * @return the query string. */ const string& query_string() const; /** * Retrieve the REMOTE_ADDR meta-variable (see RFC3875) * @return the network address of the remote host. */ const string& remote_addr() const; /** * 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 new file mode 100644 index 0000000..83ef0c6 --- a/dev/null +++ b/include/kingate/cookies.h @@ -0,0 +1,300 @@ +#ifndef __KINGATE_COOKIES_H +#define __KINGATE_COOKIES_H + +#include <string> +#include <map> +#include <ostream> + +/** + * @file + * @brief cookies-related classes. + */ + +namespace kingate { + using namespace std; + + /** + * Class, holding the cookie with parameters. + */ + class cookie : public map<string,string> { + public: + /** + * Cookie name. + */ + string name; + /** + * Cookie value. + */ + string value; + + cookie() { } + /** + * @param n cookie name. + * @param v cookie value. + */ + cookie(const string& n,const string& v) + : name(n), value(v) { } + + /** + * set cookie parameter. + * @param p parameter name. + * @param v parameter value. + * @see _get_string() + */ + void _set_string(const string& p,const string& v); + + /** + * @param n cookie name. + * @see get_name() + */ + void set_name(const string& n) { name = n; } + /** + * @param v cookie value. + * @see set_value() + */ + void set_value(const string& v) { value = v; } + /** + * @param c coomment. + * @see get_comment() + * @see has_comment() + * @see unset_comment() + */ + void set_comment(const string& c); + /** + * @param d domain. + * @see get_domain() + * @see has_domain() + * @see unset_domain() + */ + void set_domain(const string& d); + /** + * @param ma max-age. + * @see get_max_age() + * @see has_max_age() + * @see unset_max_age() + */ + void set_max_age(const string& ma); + /** + * @param p path. + * @see get_path() + * @see has_path() + * @see unset_path() + */ + void set_path(const string& p); + /** + * set cookie security. + * @param s true if secure. + * @see get_secure() + * @see is_secure() + */ + void set_secure(bool s); + + /** + * @param e expiration time. + * @see get_expires() + * @see has_expires() + * @see unset_expires() + */ + void set_expires(const string& e); + + /** + * get cookie parameter. + * @param p parameter name. + * @return parameter value. + * @see _set_string() + */ + const string& _get_string(const string& p) const; + + /** + * @return cookie name. + * @see set_name() + */ + const string& get_name() const { return name; } + /** + * @return cookie value. + * @see set_value() + */ + const string& get_value() const { return value; } + /** + * @return cookie comment. + * @see set_comment() + * @see has_comment() + * @see unset_comment() + */ + const string& get_comment() const; + /** + * @return cookie domain. + * @see set_domain() + * @see has_domain() + * @see unset_domain() + */ + const string& get_domain() const; + /** + * @return cookie max-age. + * @see set_max_age() + * @see has_max_age() + * @see unset_max_age() + */ + const string& get_max_age() const; + /** + * @return cookie path. + * @see set_path() + * @see has_path() + * @see unset_path() + */ + const string& get_path() const; + /** + * @return cookie security. + * @see is_secure() + * @see set_secure() + */ + bool get_secure() const; + /** + * @return cookie security. + * @see get_secure() + * @see set_secure() + */ + bool is_secure() const { return get_secure(); } + + /** + * @return cookie expiration time. + * @see set_expires() + * @see has_expires() + * @see unset_expires() + */ + const string& get_expires() const; + + /** + * @return true if cookie has comment. + * @see set_comment() + * @see get_comment() + * @see unset_comment() + */ + bool has_comment() const; + /** + * @return true if cookie has domain. + * @see set_domain() + * @see get_domain() + * @see unset_domain() + */ + bool has_domain() const; + /** + * @return true if cookie has max-age. + * @see set_max_age() + * @see get_max_age() + * @see unset_max_age() + */ + bool has_max_age() const; + /** + * @return true if cookie has path. + * @see set_path() + * @see get_path() + * @see unset_path() + */ + bool has_path() const; + + /** + * @return true if cookie has expiration time. + * @see set_expires() + * @see get_expires() + * @see unset_expires() + */ + bool has_expires() const; + + /** + * rid cookie of comment. + * @see set_comment() + * @see get_comment() + * @see has_comment() + */ + 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> { + 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; } + /** + * @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/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 @@ +#ifndef __KINGATE_HEADERS_H +#define __KINGATE_HEADERS_H + +#include <string> +#include <map> +#include <ostream> + +/** + * @file + * @brief the headers -- HTTP headers container class. + */ + +namespace kingate { + using namespace std; + + /** + * The container class for HTTP headers. + */ + class headers : public multimap<string,string> { + public: + + /** + * Reference header if one exists. + * @param k the header. + * @return reference to the content. + */ + const mapped_type& operator[](const key_type& k) const { + return get_header(k); + } + /** + * Reference header, creating one if needed. + * @param k the header. + * @return reference to the content. + */ + mapped_type& operator[](const key_type& k) { + return get_header(k); + } + + /** + * Set HTTP header. Remove all existent occurences of headers with + * this name. + * @param h header name. + * @param c header content. + */ + void set_header(const key_type& h,const mapped_type& c); + /** + * Add HTTP header. + * @param h header name. + * @param c header content. + */ + void add_header(const key_type& h,const mapped_type& c); + /** + * Remove named header. + * @param h header name. + */ + void unset_header(const key_type& h); + /** + * Return const reference to the existing header. + * @param h header name. + * @return reference to header content. + */ + const mapped_type& get_header(const key_type& h) const; + /** + * Return reference to the header, creating one if needed. + * @param h header name. + * @return reference to the content. + */ + mapped_type& get_header(const key_type& h); + /** + * Return the range of headers with a certain name. + * @param h header name. + * @return pair of const iterators with the beginning and the end + * of range. + */ + pair<const_iterator,const_iterator> get_headers(const key_type& h) const; + /** + * Return the range of headers with a certain name. + * @param h header name. + * @return pair of iterators with the beginning and the end + * of range. + */ + pair<iterator,iterator> get_headers(const key_type& h); + /** + * Inquire whether the named header exists. + * @param h header name. + * @return true if exists. + */ + bool has_header(const key_type& h) const; + + }; + +} + +#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 @@ #ifndef __KINGATE_UTIL_H #define __KINGATE_UTIL_H #include <string> #ifndef __deprecated #if ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 ) || __GNUC__ > 3 #define __deprecated __attribute__((deprecated)) #else #define __deprecated #endif #endif namespace kingate { using namespace std; /** * Encode string for passing via URL. * @param str string unencoded. * @return the encoded string. */ string url_encode(const string& str); /** * Remove URL-encoding from the string. * @param str the URL-encoded string. * @return the decoded string. */ string url_decode(const string& str); /** + * Quote string for use in HTTP header. + * @param str the string to quote. + * @return the quoted string. + */ + string http_quoted_string(const string& str); + /** + * Quote string for use in HTTP header if necessary. + * @param str the string to quote. + * @return the quoted string or token left as is. + */ + string http_quote(const string& str); + + /** * deprecated alias to url_encode. * @see url_encode */ inline string __deprecated url_escape(const string& str) { return url_encode(str); } /** * deprecated alias to url_decode. * @see url_decode */ inline string __deprecated url_unescape(const string& str) { return url_decode(str); } } #endif /* __KINGATE_UTIL_H */ /* * vim:set ft=cpp: */ |