diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-05-27 14:34:03 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-05-27 14:34:03 -0400 |
| commit | 085e597a2e0be1aa7341946201de774684031dd4 (patch) | |
| tree | ad3e6ccd9d850e83b51e0dd1998bdca742be17d0 /MediaBrowser.Server.Implementations | |
| parent | d4e3c6aa52fe0bac50cb742d7fb082a61a66eb33 (diff) | |
improve accuracy of local ip address discovery
Diffstat (limited to 'MediaBrowser.Server.Implementations')
| -rw-r--r-- | MediaBrowser.Server.Implementations/HttpServer/HttpServer.cs | 29 | ||||
| -rw-r--r-- | MediaBrowser.Server.Implementations/Udp/UdpServer.cs | 60 |
2 files changed, 79 insertions, 10 deletions
diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpServer.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpServer.cs index 01b867bdb7..893715b733 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpServer.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpServer.cs @@ -14,6 +14,7 @@ using ServiceStack.WebHost.Endpoints; using ServiceStack.WebHost.Endpoints.Extensions; using ServiceStack.WebHost.Endpoints.Support; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Globalization; using System.IO; @@ -76,6 +77,17 @@ namespace MediaBrowser.Server.Implementations.HttpServer /// </summary> private readonly ContainerAdapter _containerAdapter; + private readonly ConcurrentDictionary<string, string> _localEndPoints = new ConcurrentDictionary<string, string>(StringComparer.OrdinalIgnoreCase); + + /// <summary> + /// Gets the local end points. + /// </summary> + /// <value>The local end points.</value> + public IEnumerable<string> LocalEndPoints + { + get { return _localEndPoints.Keys.ToList(); } + } + /// <summary> /// Initializes a new instance of the <see cref="HttpServer" /> class. /// </summary> @@ -340,15 +352,24 @@ namespace MediaBrowser.Server.Implementations.HttpServer /// <param name="ctx">The CTX.</param> private void LogHttpRequest(HttpListenerContext ctx) { - var log = new StringBuilder(); + var endpoint = ctx.Request.LocalEndPoint; - log.AppendLine("Url: " + ctx.Request.Url); - log.AppendLine("Headers: " + string.Join(",", ctx.Request.Headers.AllKeys.Select(k => k + "=" + ctx.Request.Headers[k]))); + if (endpoint != null) + { + var address = endpoint.ToString(); - var type = ctx.Request.IsWebSocketRequest ? "Web Socket" : "HTTP " + ctx.Request.HttpMethod; + _localEndPoints.AddOrUpdate(address, address, (key, existing) => address); + } if (EnableHttpRequestLogging) { + var log = new StringBuilder(); + + log.AppendLine("Url: " + ctx.Request.Url); + log.AppendLine("Headers: " + string.Join(",", ctx.Request.Headers.AllKeys.Select(k => k + "=" + ctx.Request.Headers[k]))); + + var type = ctx.Request.IsWebSocketRequest ? "Web Socket" : "HTTP " + ctx.Request.HttpMethod; + _logger.LogMultiline(type + " request received from " + ctx.Request.RemoteEndPoint, LogSeverity.Debug, log); } } diff --git a/MediaBrowser.Server.Implementations/Udp/UdpServer.cs b/MediaBrowser.Server.Implementations/Udp/UdpServer.cs index 17f5b7b15c..af32f08de1 100644 --- a/MediaBrowser.Server.Implementations/Udp/UdpServer.cs +++ b/MediaBrowser.Server.Implementations/Udp/UdpServer.cs @@ -1,13 +1,14 @@ -using System.Linq; -using MediaBrowser.Common.Implementations.NetworkManagement; +using MediaBrowser.Common.Implementations.NetworkManagement; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; using MediaBrowser.Model.Logging; using System; +using System.Linq; using System.Net; using System.Net.Sockets; using System.Reactive.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.Udp @@ -22,8 +23,18 @@ namespace MediaBrowser.Server.Implementations.Udp /// </summary> private readonly ILogger _logger; + /// <summary> + /// The _network manager + /// </summary> private readonly INetworkManager _networkManager; + /// <summary> + /// The _HTTP server + /// </summary> + private readonly IHttpServer _httpServer; + /// <summary> + /// The _server configuration manager + /// </summary> private readonly IServerConfigurationManager _serverConfigurationManager; /// <summary> @@ -32,11 +43,15 @@ namespace MediaBrowser.Server.Implementations.Udp /// <param name="logger">The logger.</param> /// <param name="networkManager">The network manager.</param> /// <param name="serverConfigurationManager">The server configuration manager.</param> - public UdpServer(ILogger logger, INetworkManager networkManager, IServerConfigurationManager serverConfigurationManager) + /// <param name="httpServer">The HTTP server.</param> + public UdpServer(ILogger logger, INetworkManager networkManager, IServerConfigurationManager serverConfigurationManager, IHttpServer httpServer) { _logger = logger; _networkManager = networkManager; _serverConfigurationManager = serverConfigurationManager; + _httpServer = httpServer; + + new Timer(state => _logger.Info("Internal address {0}", GetLocalIpAddress()), null, 0, 1000); } /// <summary> @@ -54,14 +69,42 @@ namespace MediaBrowser.Server.Implementations.Udp { _logger.Info("Received UDP server request from " + e.RemoteEndPoint); - // Send a response back with our ip address and port - var response = String.Format("MediaBrowser{0}|{1}:{2}", context, _networkManager.GetLocalIpAddress(), _serverConfigurationManager.Configuration.HttpServerPortNumber); + var localAddress = GetLocalIpAddress(); + + if (!string.IsNullOrEmpty(localAddress)) + { + // Send a response back with our ip address and port + var response = String.Format("MediaBrowser{0}|{1}:{2}", context, GetLocalIpAddress(), _serverConfigurationManager.Configuration.HttpServerPortNumber); - await SendAsync(Encoding.UTF8.GetBytes(response), e.RemoteEndPoint); + await SendAsync(Encoding.UTF8.GetBytes(response), e.RemoteEndPoint); + } + else + { + _logger.Warn("Unable to respond to udp request because the local ip address could not be determined."); + } } } /// <summary> + /// Gets the local ip address. + /// </summary> + /// <returns>System.String.</returns> + private string GetLocalIpAddress() + { + var localAddresses = _networkManager.GetLocalIpAddresses().ToList(); + + // Cross-check the local ip addresses with addresses that have been received on with the http server + var matchedAddress = _httpServer.LocalEndPoints + .ToList() + .Select(i => i.Split(':').FirstOrDefault()) + .Where(i => !string.IsNullOrEmpty(i)) + .FirstOrDefault(i => localAddresses.Contains(i, StringComparer.OrdinalIgnoreCase)); + + // Return the first matched address, if found, or the first known local address + return matchedAddress ?? localAddresses.FirstOrDefault(); + } + + /// <summary> /// The _udp client /// </summary> private UdpClient _udpClient; @@ -203,6 +246,11 @@ namespace MediaBrowser.Server.Implementations.Udp /// <param name="bytes">The bytes.</param> /// <param name="remoteEndPoint">The remote end point.</param> /// <returns>Task.</returns> + /// <exception cref="System.ArgumentNullException"> + /// bytes + /// or + /// remoteEndPoint + /// </exception> public async Task SendAsync(byte[] bytes, string remoteEndPoint) { if (bytes == null) |
