From da3f84153be2a93da7ffc49af33b29b9725fac38 Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Sun, 02 Mar 2008 20:23:40 +0000 Subject: made util::url_encode refrain from encoding unreserved chars as per rfc 3986 Signed-off-by: Michael Krelin --- (limited to 'lib') diff --git a/lib/util.cc b/lib/util.cc index 29e6738..a6e08e2 100644 --- a/lib/util.cc +++ b/lib/util.cc @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -156,12 +155,40 @@ namespace opkele { * */ + static inline bool isrfc3986unreserved(int c) { + if(c<'-') return false; + if(c<='.') return true; + if(c<'0') return false; if(c<='9') return true; + if(c<'A') return false; if(c<='Z') return true; + if(c<'_') return false; + if(c=='_') return true; + if(c<'a') return false; if(c<='z') return true; + if(c=='~') return true; + return false; + } + + struct __url_encoder : public unary_function { + public: + string& rv; + + __url_encoder(string& r) : rv(r) { } + + result_type operator()(argument_type c) { + if(isrfc3986unreserved(c)) + rv += c; + else{ + char tmp[4]; + snprintf(tmp,sizeof(tmp),"%%%02X", + (c&0xff)); + rv += tmp; + } + } + }; + string url_encode(const string& str) { - char * t = curl_escape(str.c_str(),str.length()); - if(!t) - throw failed_conversion(OPKELE_CP_ "failed to curl_escape()"); - string rv(t); - curl_free(t); + string rv; + for_each(str.begin(),str.end(), + __url_encoder(rv)); return rv; } -- cgit v0.9.0.2