summaryrefslogtreecommitdiffabout
path: root/include/kingate/cgi_gateway.h
Side-by-side diff
Diffstat (limited to 'include/kingate/cgi_gateway.h') (more/less context) (ignore whitespace changes)
-rw-r--r--include/kingate/cgi_gateway.h164
1 files changed, 164 insertions, 0 deletions
diff --git a/include/kingate/cgi_gateway.h b/include/kingate/cgi_gateway.h
new file mode 100644
index 0000000..f683580
--- a/dev/null
+++ b/include/kingate/cgi_gateway.h
@@ -0,0 +1,164 @@
+#ifndef __KINGATE_CGI_GATEWAY_H
+#define __KINGATE_CGI_GATEWAY_H
+
+#include <map>
+#include "kingate/cgi_interface.h"
+
+/**
+ * @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;
+ /**
+ * 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()
+ */
+ 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
+ */
+ 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
+ */
+ 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.
+ */
+ 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& get_content_type() const;
+ /**
+ * Retrieve the POST content length (as passed via the
+ * CONTENT_LENGTH environment variable).
+ * @return the content length.
+ */
+ unsigned long 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; }
+ 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:
+ */