aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Model
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Model')
-rw-r--r--MediaBrowser.Model/Dlna/DefaultLocalPlayer.cs82
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;
}
}
}