@ -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 ;
}
}
}