Add support for [Measure:EscapeUrl] to perform URL encoding

This commit is contained in:
Birunthan Mohanathas 2014-01-04 19:19:10 +02:00
parent 9b5871f4dc
commit cf62c509a1
4 changed files with 37 additions and 1 deletions

View File

@ -75,4 +75,20 @@ void EscapeRegExp(std::wstring& str)
}
}
/*
** Escapes reserved URL characters.
*/
void EscapeUrl(std::wstring& str)
{
size_t pos = 0;
while ((pos = str.find_first_of(L" !*'();:@&=+$,/?#[]", pos)) != std::wstring::npos)
{
WCHAR buffer[3];
_snwprintf_s(buffer, _countof(buffer), L"%.2X", str[pos]);
str[pos] = L'%';
str.insert(pos + 1, buffer);
pos += 3;
}
}
} // namespace StringUtil

View File

@ -38,6 +38,8 @@ inline std::wstring WidenUTF8(const std::string& str) { return Widen(str.c_str()
void EscapeRegExp(std::wstring& str);
void EscapeUrl(std::wstring& str);
} // namespace StringUtil
#endif

View File

@ -46,6 +46,13 @@ public:
EscapeRegExp(str);
Assert::AreEqual(L"\\\\\\^\\$\\|\\(test\\)\\[\\{\\. ing\\+\\*\\?", str.c_str());
}
TEST_METHOD(TestEscapeUrl)
{
std::wstring str = L" !*'();:@test&=+$,/?#[ing]";
EscapeUrl(str);
Assert::AreEqual(L"%20%21%2A%27%28%29%3B%3A%40test%26%3D%2B%24%2C%2F%3F%23%5Bing%5D", str.c_str());
}
};
} // namespace StringUtil

View File

@ -237,7 +237,8 @@ bool ConfigParser::GetSectionVariable(std::wstring& strVariable, std::wstring& s
Percentual,
Max,
Min,
EscapeRegExp
EscapeRegExp,
EscapeUrl
} valueType = ValueType::Raw;
if (isKeySelector)
@ -254,6 +255,10 @@ bool ConfigParser::GetSectionVariable(std::wstring& strVariable, std::wstring& s
{
valueType = ValueType::EscapeRegExp;
}
else if (_wcsicmp(selectorSz, L"EscapeUrl") == 0)
{
valueType = ValueType::EscapeUrl;
}
else
{
return false;
@ -299,6 +304,12 @@ bool ConfigParser::GetSectionVariable(std::wstring& strVariable, std::wstring& s
StringUtil::EscapeRegExp(strValue);
return true;
}
else if (valueType == ValueType::EscapeUrl)
{
strValue = measure->GetStringValue();
StringUtil::EscapeUrl(strValue);
return true;
}
int scale = 1;