From 26c0b263664541a4b2d606fb0a347bfdef49db7c Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 14 Mar 2015 02:10:22 -0400 Subject: updated nuget --- MediaBrowser.Model/Dlna/DefaultLocalPlayer.cs | 82 ++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 2 deletions(-) (limited to 'MediaBrowser.Model') 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 _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; } } } -- cgit v1.2.3