diff --git a/MediaBrowser.Model/Dlna/DefaultLocalPlayer.cs b/MediaBrowser.Model/Dlna/DefaultLocalPlayer.cs index fc15a55a09..4092046e2c 100644 --- a/MediaBrowser.Model/Dlna/DefaultLocalPlayer.cs +++ b/MediaBrowser.Model/Dlna/DefaultLocalPlayer.cs @@ -1,4 +1,7 @@ -using System.IO; +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; namespace MediaBrowser.Model.Dlna { @@ -16,7 +19,82 @@ namespace MediaBrowser.Model.Dlna public virtual bool CanAccessUrl(string url, bool requiresCustomRequestHeaders) { - return false; + if (requiresCustomRequestHeaders) + { + return false; + } + + return CanAccessUrl(url); + } + + private readonly Dictionary _results = new Dictionary(StringComparer.OrdinalIgnoreCase); + private readonly object _resultLock = new object(); + + private bool CanAccessUrl(string url) + { + var key = GetHostFromUrl(url); + lock (_resultLock) + { + TestResult result; + if (_results.TryGetValue(url, out result)) + { + var timespan = DateTime.UtcNow - result.Date; + if (timespan <= TimeSpan.FromMinutes(3)) + { + return result.Success; + } + } + } + + var canAccess = CanAccessUrlInternal(url); + lock (_resultLock) + { + _results[key] = new TestResult + { + Success = canAccess, + Date = DateTime.UtcNow + }; + } + return canAccess; + } + + private bool CanAccessUrlInternal(string url) + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); + request.Timeout = 5000; + request.Method = "HEAD"; + try + { + using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) + { + return response.StatusCode == HttpStatusCode.OK; + } + } + catch (WebException) + { + return false; + } + } + + protected void ClearUrlTestResultCache() + { + lock (_resultLock) + { + _results.Clear(); + } + } + + private string GetHostFromUrl(string url) + { + var start = url.IndexOf("://", StringComparison.OrdinalIgnoreCase) + 3; + var len = url.IndexOf('/', start) - start; + return url.Substring(start, len); + } + + private class TestResult + { + public bool Success; + public DateTime Date; } } } diff --git a/MediaBrowser.Server.Implementations/Library/UserManager.cs b/MediaBrowser.Server.Implementations/Library/UserManager.cs index c50a71556a..6e6e23a5ae 100644 --- a/MediaBrowser.Server.Implementations/Library/UserManager.cs +++ b/MediaBrowser.Server.Implementations/Library/UserManager.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Common.Events; +using System.Net.NetworkInformation; +using MediaBrowser.Common.Events; using MediaBrowser.Common.Extensions; using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index 6b4ad7db78..429975c901 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.587 + 3.0.588 MediaBrowser.Common.Internal Luke ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption. Copyright © Media Browser 2013 - + diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index 0ea9e9aa97..c43cec3a99 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.587 + 3.0.588 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Model.Signed.nuspec b/Nuget/MediaBrowser.Model.Signed.nuspec index d77f0fc063..0683c07db4 100644 --- a/Nuget/MediaBrowser.Model.Signed.nuspec +++ b/Nuget/MediaBrowser.Model.Signed.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Model.Signed - 3.0.587 + 3.0.588 MediaBrowser.Model - Signed Edition Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 9a1a7d0684..56fc086a88 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.587 + 3.0.588 Media Browser.Server.Core Media Browser Team ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains core components required to build plugins for Media Browser Server. Copyright © Media Browser 2013 - +