-rw-r--r-- | src/cgi_gateway.cc | 175 |
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,88 +1,241 @@ +#include <errno.h> +#include <ctype.h> #include "kingate/cgi_gateway.h" #include "kingate/util.h" #include "kingate/exception.h" namespace kingate { + static string empty_string; + cgi_gateway::cgi_gateway(cgi_interface& ci) : iface(ci), b_parsed_content(false) { // 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) { char * tmp = new char[cl]; iface.in().read(tmp,cl); string qs(tmp,cl); delete tmp; parse_query(qs,post); } b_parsed_content = true; } } bool cgi_gateway::has_GET(const string& n) const { return get.find(n) != get.end(); } - 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); if(i==get.end()) throw exception_notfound(CODEPOINT,"no such parameter"); return i->second; } bool cgi_gateway::has_POST(const string& n) const { return post.find(n) != post.end(); } - 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); if(i==post.end()) throw exception_notfound(CODEPOINT,"no such parameter"); return i->second; } bool cgi_gateway::has_param(const string& n) const { return has_GET(n) || has_POST(n); } - 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); if(i!=get.end()) return i->second; i = post.find(n); if(i!=post.end()) return i->second; throw exception_notfound(CODEPOINT,"no such parameter"); } + /* + * 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"); } unsigned long cgi_gateway::get_content_length() const { if(!has_meta("CONTENT_LENGTH")) return 0; string cl = get_meta("CONTENT_LENGTH"); return strtol(cl.c_str(),NULL,10); } + /* + * + */ + + 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"); + } + } void cgi_gateway::parse_query(string& q,params_t& p) { while(!q.empty()) { string::size_type amp = q.find('&'); string pp = (amp==string::npos)?q:q.substr(0,amp); if(amp==string::npos) q.clear(); else q.erase(0,amp+1); string::size_type eq = pp.find('='); 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)))); } } } } |