#include <algorithm>
-#include <msp/strings/formatter.h>
+#include <msp/strings/format.h>
#include <msp/strings/regex.h>
#include <msp/strings/utils.h>
#include "utils.h"
string urlencode(const string &str, EncodeLevel level)
{
string result;
- for(string::const_iterator i=str.begin(); i!=str.end(); ++i)
+ for(char c: str)
{
- if(is_reserved(*i, level))
- result += format("%%%02X", *i);
+ if(is_reserved(c, level))
+ result += format("%%%02X", c);
else
- result += *i;
+ result += c;
}
return result;
}
string urlencode_plus(const string &str, EncodeLevel level)
{
string result;
- for(string::const_iterator i=str.begin(); i!=str.end(); ++i)
+ for(char c: str)
{
- if(*i==' ')
+ if(c==' ')
result += '+';
- else if(is_reserved(*i, level))
- result += format("%%%02X", *i);
+ else if(is_reserved(c, level))
+ result += format("%%%02X", c);
else
- result += *i;
+ 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])?)?(/[^?#]*)?(\\?([^#]+))?(#(.*))?");
+ 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;
Query parse_query(const std::string &str)
{
- vector<string> parts = split(str, '&');
Query query;
- for(vector<string>::const_iterator i=parts.begin(); i!=parts.end(); ++i)
+ for(const string &p: split(str, '&'))
{
- unsigned equals = i->find('=');
- string &value = query[urldecode(i->substr(0, equals))];
+ string::size_type equals = p.find('=');
+ string &value = query[urldecode(p.substr(0, equals))];
if(equals!=string::npos)
- value = urldecode(i->substr(equals+1));
+ value = urldecode(p.substr(equals+1));
}
return query;
}
string build_query(const Query &query)
{
string str;
- for(Query::const_iterator i=query.begin(); i!=query.end(); ++i)
+ for(const auto &kvp: query)
{
- if(i!=query.begin())
+ if(!str.empty())
str += '&';
- str += urlencode_plus(i->first);
+ str += urlencode_plus(kvp.first);
str += '=';
- str += urlencode_plus(i->second);
+ str += urlencode_plus(kvp.second);
}
return str;
}