summaryrefslogtreecommitdiffabout
path: root/src/cgi_gateway.cc
Side-by-side diff
Diffstat (limited to 'src/cgi_gateway.cc') (more/less context) (ignore whitespace changes)
-rw-r--r--src/cgi_gateway.cc175
1 files changed, 164 insertions, 11 deletions
diff --git a/src/cgi_gateway.cc b/src/cgi_gateway.cc
index eae7a03..30410f2 100644
--- a/src/cgi_gateway.cc
+++ b/src/cgi_gateway.cc
@@ -1 +1,3 @@
+#include <errno.h>
+#include <ctype.h>
#include "kingate/cgi_gateway.h"
@@ -6,2 +8,4 @@ namespace kingate {
+ static string empty_string;
+
cgi_gateway::cgi_gateway(cgi_interface& ci)
@@ -9,9 +13,9 @@ namespace kingate {
// Fetch GET content
- if(iface.has_meta("QUERY_STRING")) {
- string qs = iface.get_meta("QUERY_STRING");
+ try {
+ string qs = get_meta("QUERY_STRING");
parse_query(qs,get);
- }
+ }catch(exception_notfound& enf) { }
// Fetch POST content
- if(!strcasecmp(get_content_type().c_str(),"application/x-www-form-urlencoded")) {
- unsigned long cl = get_content_length();
+ if(!strcasecmp(content_type().c_str(),"application/x-www-form-urlencoded")) {
+ unsigned long cl = content_length();
if(cl) {
@@ -30,3 +34,3 @@ namespace kingate {
}
- string cgi_gateway::get_GET(const string& n) const {
+ const string& cgi_gateway::get_GET(const string& n) const {
params_t::const_iterator i = get.find(n);
@@ -39,3 +43,3 @@ namespace kingate {
}
- string cgi_gateway::get_POST(const string& n) const {
+ const string& cgi_gateway::get_POST(const string& n) const {
params_t::const_iterator i = post.find(n);
@@ -48,3 +52,3 @@ namespace kingate {
}
- string cgi_gateway::get_param(const string& n) const {
+ const string& cgi_gateway::get_param(const string& n) const {
params_t::const_iterator i = get.find(n);
@@ -58,5 +62,8 @@ namespace kingate {
+ /*
+ * deprecated stuff.
+ */
const string& cgi_gateway::get_content_type() const {
if(!has_meta("CONTENT_TYPE"))
- return ""; // XXX:
+ return empty_string;
return get_meta("CONTENT_TYPE");
@@ -69,2 +76,148 @@ namespace kingate {
}
+ /*
+ *
+ */
+
+ const string& cgi_gateway::http_request_header(const string& hn) const {
+ string mvn = "HTTP_";
+ for(const char* p=hn.c_str();*p;p++) {
+ if(*p=='-')
+ mvn += '_';
+ else
+ mvn += toupper(*p);
+ }
+ return get_meta(mvn);
+ }
+
+ const string& cgi_gateway::auth_type() const {
+ try {
+ return get_meta("AUTH_TYPE");
+ }catch(exception_notfound& enf) {
+ return empty_string;
+ }
+ }
+ unsigned long cgi_gateway::content_length() const {
+ try {
+ const string& cl = get_meta("CONTENT_LENGTH");
+ errno = 0;
+ const char *clp = cl.c_str();
+ unsigned long rv = strtol(clp,(char**)&clp,10);
+ if(errno || *clp)
+ throw server_error(CODEPOINT,"Invalid CONTENT_LENGTH value passed from server");
+ return rv;
+ }catch(exception_notfound& enf) {
+ return 0;
+ }
+ }
+ const string& cgi_gateway::content_type() const {
+ try {
+ return get_meta("CONTENT_TYPE");
+ }catch(exception_notfound& enf) {
+ return empty_string;
+ }
+ }
+ const string& cgi_gateway::gateway_interface() const {
+ try {
+ return get_meta("GATEWAY_INTERFACE");
+ }catch(exception_notfound& enf) {
+ return empty_string;
+ }
+ }
+ const string& cgi_gateway::path_info() const {
+ try {
+ return get_meta("PATH_INFO");
+ }catch(exception_notfound& enf) {
+ return empty_string;
+ }
+ }
+ const string& cgi_gateway::path_translated() const {
+ try {
+ return get_meta("PATH_TRANSLATED");
+ }catch(exception_notfound& enf) {
+ return empty_string;
+ }
+ }
+ const string& cgi_gateway::query_string() const {
+ try {
+ return get_meta("QUERY_STRING");
+ }catch(exception_notfound& enf) {
+ return empty_string;
+ }
+ }
+ const string& cgi_gateway::remote_addr() const {
+ try {
+ return get_meta("REMOTE_ADDR");
+ }catch(exception_notfound& enf) {
+ return empty_string;
+ }
+ }
+ const string& cgi_gateway::remote_host() const {
+ try {
+ return get_meta("REMOTE_HOST");
+ }catch(exception_notfound& enf) {
+ return remote_addr();
+ }
+ }
+ const string& cgi_gateway::remote_ident() const {
+ try {
+ return get_meta("REMOTE_IDENT");
+ }catch(exception_notfound& enf) {
+ return empty_string;
+ }
+ }
+ const string& cgi_gateway::remote_user() const {
+ try {
+ return get_meta("REMOTE_USER");
+ }catch(exception_notfound& enf) {
+ return empty_string;
+ }
+ }
+ const string& cgi_gateway::request_method() const {
+ try {
+ return get_meta("REQUEST_METHOD");
+ }catch(exception_notfound& enf) {
+ throw server_error(CODEPOINT,"No REQUEST_METHOD passed from server");
+ }
+ }
+ const string& cgi_gateway::script_name() const {
+ try {
+ return get_meta("SCRIPT_NAME");
+ }catch(exception_notfound& enf) {
+ throw server_error(CODEPOINT,"No SCRIPT_NAME passed from server");
+ }
+ }
+ const string& cgi_gateway::server_name() const {
+ try {
+ return get_meta("SERVER_NAME");
+ }catch(exception_notfound& enf) {
+ throw server_error(CODEPOINT,"No SERVER_NAME passed from server");
+ }
+ }
+ unsigned int cgi_gateway::server_port() const {
+ try {
+ const string& sp = get_meta("SERVER_PORT");
+ errno = 0;
+ const char *spp = sp.c_str();
+ unsigned int rv = strtol(spp,(char**)&spp,10);
+ if(errno || *spp)
+ throw server_error(CODEPOINT,"Invalid SERVER_PORT value passed from server");
+ return rv;
+ }catch(exception_notfound& enf) {
+ throw server_error(CODEPOINT,"No SERVER_PORT passed from server");
+ }
+ }
+ const string& cgi_gateway::server_protocol() const {
+ try {
+ return get_meta("SERVER_PROTOCOL");
+ }catch(exception_notfound& enf) {
+ throw server_error(CODEPOINT,"No SERVER_PROTOCOL passed from server");
+ }
+ }
+ const string& cgi_gateway::server_software() const {
+ try {
+ return get_meta("SERVER_SOFTWARE");
+ }catch(exception_notfound& enf) {
+ throw server_error(CODEPOINT,"No SERVER_SOFTWARE passed from server");
+ }
+ }
@@ -80,5 +233,5 @@ namespace kingate {
if(eq == string::npos) {
- p.insert(params_t::value_type("",url_unescape(pp)));
+ p.insert(params_t::value_type("",url_decode(pp)));
}else{
- p.insert(params_t::value_type(url_unescape(pp.substr(0,eq)),url_unescape(pp.substr(eq+1))));
+ p.insert(params_t::value_type(url_decode(pp.substr(0,eq)),url_decode(pp.substr(eq+1))));
}