in src/aws-cpp-sdk-core/source/utils/StringUtils.cpp [230:303]
Aws::String StringUtils::URLDecode(const char* safe)
{
Aws::String unescaped;
for (; *safe; safe++)
{
switch(*safe)
{
case '%':
{
int hex = 0;
auto ch = *++safe;
if (ch >= '0' && ch <= '9')
{
hex = (ch - '0') * 16;
}
else if (ch >= 'A' && ch <= 'F')
{
hex = (ch - 'A' + 10) * 16;
}
else if (ch >= 'a' && ch <= 'f')
{
hex = (ch - 'a' + 10) * 16;
}
else
{
unescaped.push_back('%');
if (ch == 0)
{
return unescaped;
}
unescaped.push_back(ch);
break;
}
ch = *++safe;
if (ch >= '0' && ch <= '9')
{
hex += (ch - '0');
}
else if (ch >= 'A' && ch <= 'F')
{
hex += (ch - 'A' + 10);
}
else if (ch >= 'a' && ch <= 'f')
{
hex += (ch - 'a' + 10);
}
else
{
unescaped.push_back('%');
unescaped.push_back(*(safe - 1));
if (ch == 0)
{
return unescaped;
}
unescaped.push_back(ch);
break;
}
unescaped.push_back(char(hex));
break;
}
case '+':
unescaped.push_back(' ');
break;
default:
unescaped.push_back(*safe);
break;
}
}
return unescaped;
}