private static bool ParsePort (ParserState state)
{
string part = state.remaining;
if (part.Length == 0 || part [0] != ':')
return part.Length > 0;
StringBuilder sb = new StringBuilder ();
int index;
for (index = 1; index < part.Length; index++ ) {
char ch = part [index];
if (!char.IsDigit (ch)) {
if (ch == '/' || ch == '#' || ch == '?')
break;
state.error = "Invalid URI: Invalid port specified.";
return false;
}
sb.Append (ch);
}
if (index <= part.Length)
state.remaining = part.Substring (index);
if (sb.Length == 0)
return state.remaining.Length > 0;
int port;
if (!Int32.TryParse (sb.ToString (), NumberStyles.None, CultureInfo.InvariantCulture, out port) ||
port < 0 || port > UInt16.MaxValue) {
state.error = "Invalid URI: Invalid port number";
return false;
}
state.elements.port = port;
return state.remaining.Length > 0;
}