private static void GetIp(string url, out IPAddress ip, out int port) { ip = null; var address = ServerAddress.FromUrl(url); switch (address.Host) { case "localhost": ip = IPAddress.Loopback; break; case "*": ip = IPAddress.Any; break; default: break; } ip = ip ?? IPAddress.Parse(address.Host); port = address.Port; }
public static ServerAddress FromUrl(string url) { url = url ?? string.Empty; int schemeDelimiterStart = url.IndexOf("://", StringComparison.Ordinal); if (schemeDelimiterStart < 0) { throw new FormatException($"Invalid URL: {url}"); } int schemeDelimiterEnd = schemeDelimiterStart + "://".Length; int pathDelimiterStart = url.IndexOf("/", schemeDelimiterEnd, StringComparison.Ordinal); int pathDelimiterEnd = pathDelimiterStart; if (pathDelimiterStart < 0) { pathDelimiterStart = pathDelimiterEnd = url.Length; } var serverAddress = new ServerAddress(); serverAddress.Scheme = url.Substring(0, schemeDelimiterStart); var hasSpecifiedPort = false; int portDelimiterStart = url.LastIndexOf(":", pathDelimiterStart - 1, pathDelimiterStart - schemeDelimiterEnd, StringComparison.Ordinal); if (portDelimiterStart >= 0) { int portDelimiterEnd = portDelimiterStart + ":".Length; string portString = url.Substring(portDelimiterEnd, pathDelimiterStart - portDelimiterEnd); int portNumber; if (int.TryParse(portString, NumberStyles.Integer, CultureInfo.InvariantCulture, out portNumber)) { hasSpecifiedPort = true; serverAddress.Host = url.Substring(schemeDelimiterEnd, portDelimiterStart - schemeDelimiterEnd); serverAddress.Port = portNumber; } } if (!hasSpecifiedPort) { if (string.Equals(serverAddress.Scheme, "http", StringComparison.OrdinalIgnoreCase)) { serverAddress.Port = 80; } else if (string.Equals(serverAddress.Scheme, "https", StringComparison.OrdinalIgnoreCase)) { serverAddress.Port = 443; } } if (!hasSpecifiedPort) { serverAddress.Host = url.Substring(schemeDelimiterEnd, pathDelimiterStart - schemeDelimiterEnd); } if (string.IsNullOrEmpty(serverAddress.Host)) { throw new FormatException($"Invalid URL: {url}"); } // Path should not end with a / since it will be used as PathBase later if (url[url.Length - 1] == '/') { serverAddress.PathBase = url.Substring(pathDelimiterEnd, url.Length - pathDelimiterEnd - 1); } else { serverAddress.PathBase = url.Substring(pathDelimiterEnd); } return(serverAddress); }