| Index: src/shared/Utils.cpp |
| diff --git a/src/shared/Utils.cpp b/src/shared/Utils.cpp |
| index 52b5a69f7920a6b9a49a46e16b250e2accaa33f8..8edb3e786cea4147a74038f5af651c60286bc7f9 100644 |
| --- a/src/shared/Utils.cpp |
| +++ b/src/shared/Utils.cpp |
| @@ -147,3 +147,68 @@ void ReplaceString(std::wstring& input, const std::wstring placeholder, const st |
| input.replace(replaceStart, placeholder.length(), replacement); |
| } |
| } |
| + |
| +std::wstring GetSchemeAndHierarchicalPart(const std::wstring& url) |
| +{ |
| + auto schemeAndHierarchicalPartEndsAt = url.find(L'?'); |
| + if (schemeAndHierarchicalPartEndsAt == std::wstring::npos) |
| + { |
| + schemeAndHierarchicalPartEndsAt = url.find(L'#'); |
| + } |
| + return url.substr(0, schemeAndHierarchicalPartEndsAt); |
| +} |
| + |
| +std::wstring GetQueryString(const std::wstring& url) |
| +{ |
| + auto questionSignPos = url.find(L'?'); |
| + if (questionSignPos == std::wstring::npos) |
| + { |
| + return L""; |
| + } |
| + auto queryStringBeginsAt = questionSignPos + 1; |
| + auto endQueryStringPos = url.find(L'#', queryStringBeginsAt); |
| + if (endQueryStringPos == std::wstring::npos) |
| + { |
| + endQueryStringPos = url.length(); |
| + } |
| + return url.substr(queryStringBeginsAt, endQueryStringPos - queryStringBeginsAt); |
| +} |
| + |
| +void ForEachToken(const std::wstring& value, wchar_t delimiter, |
| + const std::function<bool(std::wstring::const_iterator begin, std::wstring::const_iterator end)>& tokenHandler) |
|
Eric
2015/02/13 16:33:43
You might change "tokenHandler" to "fn" here. Or a
|
| +{ |
| + if (value.empty()) |
| + { |
| + return; |
| + } |
| + std::wstring::size_type delimiterPos = value.find(delimiter); |
| + std::wstring::size_type prevDelimiterPos = 0; |
| + while(delimiterPos != std::wstring::npos) |
| + { |
| + if (!tokenHandler(value.begin() + prevDelimiterPos, value.begin() + delimiterPos)) |
| + { |
| + return; |
| + } |
| + prevDelimiterPos = delimiterPos; |
| + ++prevDelimiterPos; // skip the delimiter |
| + delimiterPos = value.find(delimiter, prevDelimiterPos); |
| + } |
| + tokenHandler(value.begin() + prevDelimiterPos, value.end()); |
| +} |
| + |
| +void ForEachQueryStringParameter(const std::wstring& queryString, |
| + const std::function<bool(const std::wstring& name, const std::wstring& value)>& parameterHandler) |
|
Eric
2015/02/13 16:33:43
See comment above.
|
| +{ |
| + if (queryString.empty()) |
| + { |
| + return; |
| + } |
| + ForEachToken(queryString, L'&', |
| + [¶meterHandler](std::wstring::const_iterator begin, |
| + std::wstring::const_iterator end)->bool |
| + { |
| + auto assignSignIt = std::find(begin, end, L'='); |
| + auto valueBeginsAt = assignSignIt != end ? assignSignIt + 1 : assignSignIt; |
| + return parameterHandler(std::wstring(begin, assignSignIt), std::wstring(valueBeginsAt, end)); |
| + }); |
| +} |