diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/HttpServ.cc | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/lib/HttpServ.cc b/lib/HttpServ.cc index bc836c4..d00890e 100644 --- a/lib/HttpServ.cc +++ b/lib/HttpServ.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* $Id: HttpServ.cc,v 1.51 2007-06-17 15:21:50 pixel Exp $ */ +/* $Id: HttpServ.cc,v 1.52 2007-06-18 09:25:47 pixel Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -45,6 +45,7 @@ class ProcessRequest : public Task { virtual int Do() throw (GeneralException); private: String GetMime(const String &); + String UnMangle(const String &, int p = 0); bool ParseUri(String &, String &, String &, Handle *); void ParseVars(Handle *, int); void ShowError(Handle *); @@ -397,6 +398,7 @@ bool ProcessRequest::ParseUri(String & file, String & domain, String & gvars, Ha Uri = ""; } } + Uri = UnMangle(Uri); posslash = Uri.strrchr('/'); file = Uri.to_charp(posslash + 1); if (posslash > 0) { @@ -480,6 +482,47 @@ String ProcessRequest::GetMime(const String & f) { return "text/plain"; } +String ProcessRequest::UnMangle(const String & s, int p) { + String r; + char c1, c2, c[2] = "x"; + + if (s.strlen() <= p) + return ""; + + switch (s[p]) { + case '%': + c1 = s[p + 1]; + c2 = s[p + 2]; + + if ((((c1 >= '0') && (c1 <= '9')) || ((c1 >= 'A') && (c1 <= 'F')) || ((c1 >= 'a') && (c1 <= 'f'))) && + (((c2 >= '0') && (c2 <= '9')) || ((c2 >= 'A') && (c2 <= 'F')) || ((c2 >= 'a') && (c2 <= 'f')))) { + if ((c1 >= '0') && (c1 <= '9')) c1 -= '0'; + if ((c2 >= '0') && (c2 <= '9')) c2 -= '0'; + if ((c1 >= 'A') && (c1 <= 'F')) c1 -= 'A' - 10; + if ((c2 >= 'A') && (c2 <= 'F')) c2 -= 'A' - 10; + if ((c1 >= 'a') && (c1 <= 'f')) c1 -= 'a' - 10; + if ((c2 >= 'a') && (c2 <= 'f')) c2 -= 'a' - 10; + c[0] = c1 * 16 + c2; + r = c; + p += 3; + } else { + r = "%"; + p++; + } + break; + case '+': + r = " "; + p++; + break; + default: + r = s[p]; + p++; + break; + } + + return r + UnMangle(s, p); +} + HttpServ::HttpServ(Action * ap, int port, const String & nname) throw (GeneralException) : root("/bin/start") { bool r = true; |