diff options
| -rw-r--r-- | plugins/webbox/webbox.cpp | 35 | ||||
| -rw-r--r-- | webserver.conf | 2 | 
2 files changed, 34 insertions, 3 deletions
diff --git a/plugins/webbox/webbox.cpp b/plugins/webbox/webbox.cpp index 3cfd616..7d15ee9 100644 --- a/plugins/webbox/webbox.cpp +++ b/plugins/webbox/webbox.cpp @@ -30,6 +30,7 @@ namespace {   static const std::string PROGRAMVERSION{"Webbox 2.0"};   static const std::string DOWNLOAD_FILENAME{"webbox-download.zip"}; + // TODO: separate out   class Tempfile   {    fs::path m_path; @@ -65,6 +66,36 @@ namespace {    { "500", "Internal Server Error" }   }; + std::string urlDecode(std::string s) + { +  std::string result; + +  size_t pos = 0; +  while (pos < s.size()) { +   char c {s[pos]}; +   if (c == '+') { +    result += ' '; +   } else if (c == '%' && pos + 2 < s.size()) { +    try { +     int i = stoi(s.substr(pos + 1, 2), 0, 16); +     if (i < 0 || i > 255) +      return result; + +     result += static_cast<char>(i); +    } catch (...) { +     return result; +    } + +    pos += 2; +   } else { +    result += c; +   } +   pos++; +  } + +  return result; + } +   std::unordered_map<std::string, std::string> ParseQueryString(std::string s)   {    std::unordered_map<std::string, std::string> result; @@ -75,7 +106,7 @@ namespace {     for (auto i: list) {      pos = i.find('=');      if (pos != i.npos) { -     result[i.substr(0, pos)] = i.substr(pos + 1); +     result[urlDecode(i.substr(0, pos))] = urlDecode(i.substr(pos + 1));      }     }    } @@ -145,7 +176,7 @@ public:    }    // Set parameters from FastCGI request environment -  m_pathInfo = p.m_GetRequestParam("rel_target"); +  m_pathInfo = urlDecode(p.m_GetRequestParam("rel_target"));    size_t pos {m_pathInfo.find('?')};    if (pos != m_pathInfo.npos) {     m_pathInfo = m_pathInfo.substr(0, pos); diff --git a/webserver.conf b/webserver.conf index f8238fd..46046d9 100644 --- a/webserver.conf +++ b/webserver.conf @@ -22,7 +22,7 @@     </path>     <path requested="/webbox1">      <plugin>static-files</plugin> -    <target>/home/ernie/code/webbox/html</target> +    <target>/home/ernie/code/webserver/plugins/webbox/html</target>     </path>     <path requested="/webbox1/bin">      <plugin>webbox</plugin>  | 
