summaryrefslogtreecommitdiff
path: root/icespider/fcgi/cgiRequestBase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'icespider/fcgi/cgiRequestBase.cpp')
-rw-r--r--icespider/fcgi/cgiRequestBase.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/icespider/fcgi/cgiRequestBase.cpp b/icespider/fcgi/cgiRequestBase.cpp
new file mode 100644
index 0000000..97a71fc
--- /dev/null
+++ b/icespider/fcgi/cgiRequestBase.cpp
@@ -0,0 +1,99 @@
+#include "cgiRequestBase.h"
+#include <boost/algorithm/string/case_conv.hpp>
+#include <boost/algorithm/string/split.hpp>
+#include <util.h>
+
+namespace ba = boost::algorithm;
+
+namespace IceSpider {
+ CgiRequestBase::CgiRequestBase(IceSpider::Core * c, char ** env) :
+ IceSpider::IHttpRequest(c)
+ {
+ for(char * const * e = env; *e; ++e) {
+ addenv(*e);
+ }
+ }
+
+ void
+ CgiRequestBase::addenv(char * e)
+ {
+ if (auto eq = strchr(e, '=')) {
+ *eq++ = '\0';
+ envmap.insert({ e, Env(eq, strchr(eq, '\0')) });
+ }
+ }
+
+ void
+ CgiRequestBase::initialize()
+ {
+ auto qs = envmap.find("QUERY_STRING");
+ if (qs != envmap.end()) {
+ auto start = std::get<0>(qs->second);
+ auto end = std::get<1>(qs->second);
+ while (start < end) {
+ auto amp = orelse(strchr(start, '&'), end);
+ auto eq = orelse(strchr(start, '='), end);
+ if (eq < amp) {
+ *eq = '\0';
+ *amp = '\0';
+ qsmap.insert({ eq, Env( eq + 1, amp ) });
+ }
+ else {
+ *eq = '\0';
+ *amp = '\0';
+ qsmap.insert({ eq, Env( eq + 1, eq + 1 ) });
+ }
+ start = amp + 1;
+ }
+ }
+ }
+
+ IceUtil::Optional<std::string>
+ CgiRequestBase::optionalLookup(const std::string & key, const VarMap & vm)
+ {
+ auto i = vm.find(key.c_str());
+ if (i == vm.end()) {
+ return IceUtil::Optional<std::string>();
+ }
+ return std::string(std::get<0>(i->second), std::get<1>(i->second));
+ }
+
+ std::string
+ CgiRequestBase::getRequestPath() const
+ {
+ return optionalLookup("REDIRECT_URL", envmap) /
+ [this]() { return optionalLookup("SCRIPT_NAME", envmap); } /
+ [this]() -> std::string { throw std::runtime_error("Couldn't determine request path"); };
+ }
+
+ UserIceSpider::HttpMethod
+ CgiRequestBase::getRequestMethod() const
+ {
+ return UserIceSpider::HttpMethod::GET;
+ }
+
+ IceUtil::Optional<std::string>
+ CgiRequestBase::getURLParam(const std::string & key) const
+ {
+ return optionalLookup(key, pathmap);
+ }
+
+ IceUtil::Optional<std::string>
+ CgiRequestBase::getQueryStringParam(const std::string & key) const
+ {
+ return optionalLookup(key, qsmap);
+ }
+
+ IceUtil::Optional<std::string>
+ CgiRequestBase::getHeaderParam(const std::string & key) const
+ {
+ return optionalLookup(("HTTP_" + boost::algorithm::to_upper_copy(key)).c_str(), envmap);
+ }
+
+ bool
+ CgiRequestBase::cmp_str::operator()(char const * a, char const * b) const
+ {
+ return std::strcmp(a, b) < 0;
+ }
+}
+