diff options
Diffstat (limited to 'MediaBrowser.Model')
| -rw-r--r-- | MediaBrowser.Model/Dlna/DefaultLocalPlayer.cs | 82 |
1 files changed, 80 insertions, 2 deletions
diff --git a/MediaBrowser.Model/Dlna/DefaultLocalPlayer.cs b/MediaBrowser.Model/Dlna/DefaultLocalPlayer.cs index fc15a55a0..4092046e2 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<string, TestResult> _results = new Dictionary<string, TestResult>(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; } } } |
