From 5fd5ecad8c2bd1e8846c11fa9b281f0f4ab8a4a7 Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Sun, 02 Mar 2008 23:52:14 +0000 Subject: aded util::url_decode() Signed-off-by: Michael Krelin --- diff --git a/include/opkele/util.h b/include/opkele/util.h index fd974a1..0130bff 100644 --- a/include/opkele/util.h +++ b/include/opkele/util.h @@ -31,7 +31,7 @@ namespace opkele { time_t w3c_to_time(const string& w); /** - * Encode string to the representation suitable for using in URL. + * Encode string to the representation suitable for using in URL * @param str string to encode * @return encoded string * @throw failed_conversion in case of failure @@ -39,6 +39,14 @@ namespace opkele { string url_encode(const string& str); /** + * Decode url-encoded string back to normal + * @param str url-encoded string + * @return decoded string + * @throw failed_conversion in case of failure + */ + string url_decode(const string& str); + + /** * Make string suitable for using as x(ht)ml attribute. * @param str string to escape * @return escaped string diff --git a/lib/util.cc b/lib/util.cc index a6e08e2..3e7f3aa 100644 --- a/lib/util.cc +++ b/lib/util.cc @@ -192,6 +192,34 @@ namespace opkele { return rv; } + string url_decode(const string& str) { + string rv; + back_insert_iterator ii(rv); + for(string::const_iterator i=str.begin(),ie=str.end(); + i!=ie;++i) { + switch(*i) { + case '+': + *(ii++) = ' '; break; + case '%': + ++i; + static char tmp[3] = {0,0,0}; + if(i==ie) + throw failed_conversion(OPKELE_CP_ "trailing percent in the url-encoded string"); + tmp[0] == *(i++); + if(i==ie) + throw failed_conversion(OPKELE_CP_ "not enough hexadecimals after the percent sign in url-encoded string"); + tmp[1] == *i; + if(!(isxdigit(tmp[0]) && isxdigit(tmp[1]))) + throw failed_conversion(OPKELE_CP_ "non-hex follows percent in url-encoded string"); + *(ii++) = strtol(tmp,0,16); + break; + default: + *(ii++) = *i; break; + } + } + return rv; + } + string attr_escape(const string& str) { static const char *unsafechars = "<>&\n\"'"; string rv; -- cgit v0.9.0.2