private void ParseQuery(StringBuilder actualUrl, int index) { int lastDelimiter = index; index++; string currentKey = null; for (; index < actualUrl.Length; index++) { switch (actualUrl[index]) { case '&': if (currentKey == null) { lastDelimiter = index; break; } _query.AddValue(currentKey, actualUrl.ToString(lastDelimiter + 1, index - lastDelimiter - 1)); lastDelimiter = index; currentKey = null; break; case '=': currentKey = actualUrl.ToString(lastDelimiter + 1, index - lastDelimiter - 1); lastDelimiter = index; break; case '%': index = DecodeEscape(actualUrl, index); break; case '#': _query.AddValue(currentKey, actualUrl.ToString(lastDelimiter + 1, index - lastDelimiter - 1)); ParseFragment(actualUrl, index); return; } } if (currentKey != null) { _query.AddValue(currentKey, actualUrl.ToString(lastDelimiter + 1, index - lastDelimiter - 1)); } else { _query.AddValue(actualUrl.ToString(lastDelimiter + 1, index - lastDelimiter - 1), String.Empty); } }
private void ParseParameters(StringBuilder actualUrl, int index) { int lastDelimiter = index; index++; string currentKey = null; string value = null; for (; index < actualUrl.Length; index++) { switch (actualUrl[index]) { case ';': value = actualUrl.ToString(lastDelimiter + 1, index - lastDelimiter - 1); lastDelimiter = index; if ((String.IsNullOrEmpty(currentKey)) || (String.IsNullOrEmpty(value))) { currentKey = null; break; } _parameters.AddValue(currentKey, value); currentKey = null; break; case '=': currentKey = actualUrl.ToString(lastDelimiter + 1, index - lastDelimiter - 1); lastDelimiter = index; break; case '%': index = DecodeEscape(actualUrl, index); break; } } if ((!String.IsNullOrEmpty(currentKey)) && (!String.IsNullOrEmpty(value = actualUrl.ToString(lastDelimiter + 1, index - lastDelimiter - 1)))) { _parameters.AddValue(currentKey, value); } }