internal UriTemplateMatch CreateTemplateMatch()
{
var result = new UriTemplateMatch();
var bv = result.BoundVariables;
foreach (var kv in BoundVars)
bv.Add(kv.Key, kv.Value);
var rs = result.RelativePathSegments;
int pos = RawUrl.IndexOf('?');
var maxLen = pos != -1 ? pos : RawUrl.Length;
var nextSeg = RawUrl.IndexOf('/', 1) + 1;
while (nextSeg != 0)
{
var lastSeg = nextSeg;
nextSeg = RawUrl.IndexOf('/', nextSeg) + 1;
if (nextSeg != 0)
rs.Add(RawUrl.Substring(lastSeg, nextSeg - lastSeg - 1));
else
rs.Add(RawUrl.Substring(lastSeg, maxLen - lastSeg));
}
var qp = result.QueryParameters;
if (QueryParams != null)
{
foreach (var kv in QueryParams)
qp.Add(kv.Key, kv.Value);
return result;
}
if (pos != -1)
{
var query = RawUrl;
pos++;
while (pos < query.Length)
{
int start = pos;
while (pos < query.Length && query[pos] != '=') pos++;
var key = HttpUtility.UrlDecode(query.Substring(start, pos - start));
pos++;
start = pos;
while (pos < query.Length && query[pos] != '&') pos++;
var value = HttpUtility.UrlDecode(query.Substring(start, pos - start));
pos++;
qp.Add(key, value);
}
}
return result;
}