-rw-r--r-- | include/opkele/util.h | 10 | ||||
-rw-r--r-- | lib/util.cc | 28 |
2 files changed, 37 insertions, 1 deletions
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 @@ -32,5 +32,5 @@ namespace opkele { /** - * 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 @@ -40,4 +40,12 @@ namespace opkele { /** + * 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 diff --git a/lib/util.cc b/lib/util.cc index a6e08e2..3e7f3aa 100644 --- a/lib/util.cc +++ b/lib/util.cc @@ -193,4 +193,32 @@ namespace opkele { } + string url_decode(const string& str) { + string rv; + back_insert_iterator<string> 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\"'"; |