aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Networking/Management/NetworkManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Networking/Management/NetworkManager.cs')
-rw-r--r--MediaBrowser.Networking/Management/NetworkManager.cs112
1 files changed, 112 insertions, 0 deletions
diff --git a/MediaBrowser.Networking/Management/NetworkManager.cs b/MediaBrowser.Networking/Management/NetworkManager.cs
index fcead43d3..208c64a6e 100644
--- a/MediaBrowser.Networking/Management/NetworkManager.cs
+++ b/MediaBrowser.Networking/Management/NetworkManager.cs
@@ -260,6 +260,118 @@ namespace MediaBrowser.Networking.Management
throw new ArgumentException("Unknown share type");
}
}
+
+ /// <summary>
+ /// Parses the specified endpointstring.
+ /// </summary>
+ /// <param name="endpointstring">The endpointstring.</param>
+ /// <returns>IPEndPoint.</returns>
+ public IPEndPoint Parse(string endpointstring)
+ {
+ return Parse(endpointstring, -1);
+ }
+
+ /// <summary>
+ /// Parses the specified endpointstring.
+ /// </summary>
+ /// <param name="endpointstring">The endpointstring.</param>
+ /// <param name="defaultport">The defaultport.</param>
+ /// <returns>IPEndPoint.</returns>
+ /// <exception cref="System.ArgumentException">Endpoint descriptor may not be empty.</exception>
+ /// <exception cref="System.FormatException"></exception>
+ private static IPEndPoint Parse(string endpointstring, int defaultport)
+ {
+ if (string.IsNullOrEmpty(endpointstring)
+ || endpointstring.Trim().Length == 0)
+ {
+ throw new ArgumentException("Endpoint descriptor may not be empty.");
+ }
+
+ if (defaultport != -1 &&
+ (defaultport < IPEndPoint.MinPort
+ || defaultport > IPEndPoint.MaxPort))
+ {
+ throw new ArgumentException(string.Format("Invalid default port '{0}'", defaultport));
+ }
+
+ string[] values = endpointstring.Split(new char[] { ':' });
+ IPAddress ipaddy;
+ int port = -1;
+
+ //check if we have an IPv6 or ports
+ if (values.Length <= 2) // ipv4 or hostname
+ {
+ if (values.Length == 1)
+ //no port is specified, default
+ port = defaultport;
+ else
+ port = GetPort(values[1]);
+
+ //try to use the address as IPv4, otherwise get hostname
+ if (!IPAddress.TryParse(values[0], out ipaddy))
+ ipaddy = GetIPfromHost(values[0]);
+ }
+ else if (values.Length > 2) //ipv6
+ {
+ //could [a:b:c]:d
+ if (values[0].StartsWith("[") && values[values.Length - 2].EndsWith("]"))
+ {
+ string ipaddressstring = string.Join(":", values.Take(values.Length - 1).ToArray());
+ ipaddy = IPAddress.Parse(ipaddressstring);
+ port = GetPort(values[values.Length - 1]);
+ }
+ else //[a:b:c] or a:b:c
+ {
+ ipaddy = IPAddress.Parse(endpointstring);
+ port = defaultport;
+ }
+ }
+ else
+ {
+ throw new FormatException(string.Format("Invalid endpoint ipaddress '{0}'", endpointstring));
+ }
+
+ if (port == -1)
+ throw new ArgumentException(string.Format("No port specified: '{0}'", endpointstring));
+
+ return new IPEndPoint(ipaddy, port);
+ }
+
+ /// <summary>
+ /// Gets the port.
+ /// </summary>
+ /// <param name="p">The p.</param>
+ /// <returns>System.Int32.</returns>
+ /// <exception cref="System.FormatException"></exception>
+ private static int GetPort(string p)
+ {
+ int port;
+
+ if (!int.TryParse(p, out port)
+ || port < IPEndPoint.MinPort
+ || port > IPEndPoint.MaxPort)
+ {
+ throw new FormatException(string.Format("Invalid end point port '{0}'", p));
+ }
+
+ return port;
+ }
+
+ /// <summary>
+ /// Gets the I pfrom host.
+ /// </summary>
+ /// <param name="p">The p.</param>
+ /// <returns>IPAddress.</returns>
+ /// <exception cref="System.ArgumentException"></exception>
+ private static IPAddress GetIPfromHost(string p)
+ {
+ var hosts = Dns.GetHostAddresses(p);
+
+ if (hosts == null || hosts.Length == 0)
+ throw new ArgumentException(string.Format("Host not found: {0}", p));
+
+ return hosts[0];
+ }
}
}