private Map parseQuery(string q)
{
if (q == null) return null;
Map map = new Map(Sys.StrType, Sys.StrType);
try
{
int start = 0, eq = 0, len = q.Length, prev = 0;
bool escaped = false;
for (int i=0; i<len; ++i)
{
int ch = q[i];
if (prev != '\\')
{
if (ch == '=') eq = i;
if (ch != '&' && ch != ';') { prev = ch; continue; }
}
else
{
escaped = true;
prev = (ch != '\\') ? ch : 0;
continue;
}
if (start < i)
{
addQueryParam(map, q, start, eq, i, escaped);
escaped = false;
}
start = eq = i+1;
}
if (start < len)
addQueryParam(map, q, start, eq, len, escaped);
}
catch (Exception e)
{
// don't let internal error bring down whole uri
Err.dumpStack(e);
}
return map;
}