X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Futils.cpp;fp=source%2Futils.cpp;h=0000000000000000000000000000000000000000;hb=cf8d2e48581eeb8f1b83e8c48321a0bc2ffa6d83;hp=5a5dc0487c0f1bf4dbd9132143e14567d7c30574;hpb=d683ca0964182e9579838fec8d7d100eeabddee0;p=libs%2Fnet.git diff --git a/source/utils.cpp b/source/utils.cpp deleted file mode 100644 index 5a5dc04..0000000 --- a/source/utils.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#include -#include -#include -#include -#include "utils.h" - -using namespace std; - -namespace { - -const char *reserved[]= -{ - " #%&+=?", - " #%&*+:;=?@[]", - " !#$%&'()*+,/:;=?@[]", -}; - -bool is_reserved(char c, unsigned level) -{ - for(const char *r=reserved[level]; *r; ++r) - if(c==*r) - return true; - return false; -} - -} - -namespace Msp { -namespace Http { - -string urlencode(const string &str, EncodeLevel level) -{ - string result; - for(string::const_iterator i=str.begin(); i!=str.end(); ++i) - { - if(is_reserved(*i, level)) - result += format("%%%02X", *i); - else - result += *i; - } - return result; -} - -string urlencode_plus(const string &str, EncodeLevel level) -{ - string result; - for(string::const_iterator i=str.begin(); i!=str.end(); ++i) - { - if(*i==' ') - result += '+'; - else if(is_reserved(*i, level)) - result += format("%%%02X", *i); - else - result += *i; - } - return result; -} - -string urldecode(const string &str) -{ - string result; - for(unsigned i=0; istr.size()) - throw invalid_argument("urldecode"); - result += lexical_cast(str.substr(i+1, 2), "x"); - i += 2; - } - else if(c=='+') - result += ' '; - else - result += c; - } - return result; -} - -Url parse_url(const string &str) -{ - static Regex r_url("(([a-z]+)://)?([a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*(:[0-9])?)?(/[^?#]*)?(\\?([^#]+))?(#(.*))?"); - if(RegMatch m = r_url.match(str)) - { - Url url; - url.scheme = m[2].str; - url.host = m[3].str; - url.path = urldecode(m[6].str); - url.query = m[8].str; - url.fragment = m[10].str; - return url; - } - else - throw invalid_argument("parse_url"); -} - -string build_url(const Url &url) -{ - if(!url.path.empty() && url.path[0]!='/') - throw invalid_argument("build_url"); - - string str; - if(!url.scheme.empty()) - str += url.scheme+"://"; - str += url.host; - str += urlencode(url.path); - if(!url.query.empty()) - { - str += '?'; - str += url.query; - } - if(!url.fragment.empty()) - { - str += '#'; - str += url.fragment; - } - return str; -} - -Query parse_query(const std::string &str) -{ - vector parts = split(str, '&'); - Query query; - for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) - { - unsigned equals = i->find('='); - string &value = query[urldecode(i->substr(0, equals))]; - if(equals!=string::npos) - value = urldecode(i->substr(equals+1)); - } - return query; -} - -string build_query(const Query &query) -{ - string str; - for(Query::const_iterator i=query.begin(); i!=query.end(); ++i) - { - if(i!=query.begin()) - str += '&'; - str += urlencode_plus(i->first); - str += '='; - str += urlencode_plus(i->second); - } - return str; -} - -} // namespace Http -} // namespace Msp