summaryrefslogtreecommitdiffabout
path: root/include
authorMichael Krelin <hacker@klever.net>2005-05-09 11:00:28 (UTC)
committer Michael Krelin <hacker@klever.net>2005-05-09 11:00:28 (UTC)
commit43d47575878e4eaf3c8da84bf609fcd0bde595fb (patch) (side-by-side diff)
treef7ec4d1f0d0a01b43feb5c9b4f414e870036522c /include
parentd9578a5ae0ac4e44ff5e3c13d3f39f400f51bcf2 (diff)
downloadkingate-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
Diffstat (limited to 'include') (more/less context) (ignore whitespace changes)
-rw-r--r--include/Makefile.am4
-rw-r--r--include/kingate/cgi_gateway.h5
-rw-r--r--include/kingate/cookies.h300
-rw-r--r--include/kingate/headers.h94
-rw-r--r--include/kingate/util.h13
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,236 +1,241 @@
#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.
*/
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:
*/