diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-08-19 18:28:35 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-08-19 18:28:35 -0400 |
| commit | fda7ff5bf2795cb03ee2a5355c8003da31bf24f9 (patch) | |
| tree | 52e7989d001e42b2c14fd50532b9c964f91242af /MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs | |
| parent | b48d15296c1708545f358dc0ccbc48fea9b2cf00 (diff) | |
chromecast updates
Diffstat (limited to 'MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs')
| -rw-r--r-- | MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs | 61 |
1 files changed, 52 insertions, 9 deletions
diff --git a/MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs b/MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs index 96eb5e2f1..8159be634 100644 --- a/MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs +++ b/MediaBrowser.Common.Implementations/Networking/BaseNetworkManager.cs @@ -1,4 +1,5 @@ -using System; +using MediaBrowser.Model.Logging; +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -10,6 +11,13 @@ namespace MediaBrowser.Common.Implementations.Networking { public abstract class BaseNetworkManager { + protected ILogger Logger { get; private set; } + + protected BaseNetworkManager(ILogger logger) + { + Logger = logger; + } + /// <summary> /// Gets the machine's local ip address /// </summary> @@ -28,17 +36,16 @@ namespace MediaBrowser.Common.Implementations.Networking public bool IsInLocalNetwork(string endpoint) { + return IsInLocalNetworkInternal(endpoint, true); + } + + public bool IsInLocalNetworkInternal(string endpoint, bool resolveHost) + { if (string.IsNullOrWhiteSpace(endpoint)) { throw new ArgumentNullException("endpoint"); } - IPAddress address; - if (!IPAddress.TryParse(endpoint, out address)) - { - return true; - } - const int lengthMatch = 4; if (endpoint.Length >= lengthMatch) @@ -55,7 +62,7 @@ namespace MediaBrowser.Common.Implementations.Networking // Private address space: // http://en.wikipedia.org/wiki/Private_network - return + var isPrivate = // If url was requested with computer name, we may see this endpoint.IndexOf("::", StringComparison.OrdinalIgnoreCase) != -1 || @@ -64,6 +71,42 @@ namespace MediaBrowser.Common.Implementations.Networking endpoint.StartsWith("192.", StringComparison.OrdinalIgnoreCase) || endpoint.StartsWith("172.", StringComparison.OrdinalIgnoreCase) || endpoint.StartsWith("169.", StringComparison.OrdinalIgnoreCase); + + if (isPrivate) + { + return true; + } + + IPAddress address; + if (resolveHost && !IPAddress.TryParse(endpoint, out address)) + { + var host = new Uri(endpoint).DnsSafeHost; + + Logger.Debug("Resolving host {0}", host); + + try + { + address = GetIpAddresses(host).FirstOrDefault(); + + if (address != null) + { + Logger.Debug("{0} resolved to {1}", host, address); + + return IsInLocalNetworkInternal(address.ToString(), false); + } + } + catch (Exception ex) + { + Logger.ErrorException("Error resovling hostname {0}", ex, host); + } + } + + return false; + } + + public IEnumerable<IPAddress> GetIpAddresses(string hostName) + { + return Dns.GetHostAddresses(hostName); } private IEnumerable<IPAddress> GetIPsDefault() @@ -103,7 +146,7 @@ namespace MediaBrowser.Common.Implementations.Networking .Select(i => i.ToString()) .Reverse(); } - + /// <summary> /// Gets a random port number that is currently available /// </summary> |
