|
@@ -164,22 +164,9 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- //request.ServicePoint.BindIPEndPointDelegate = BindIPEndPointCallback;
|
|
|
-
|
|
|
return request;
|
|
|
}
|
|
|
|
|
|
- private static IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount)
|
|
|
- {
|
|
|
- // Prefer local ipv4
|
|
|
- if (remoteEndPoint.AddressFamily == AddressFamily.InterNetworkV6)
|
|
|
- {
|
|
|
- return new IPEndPoint(IPAddress.IPv6Any, 0);
|
|
|
- }
|
|
|
-
|
|
|
- return new IPEndPoint(IPAddress.Any, 0);
|
|
|
- }
|
|
|
-
|
|
|
private void AddRequestHeaders(HttpWebRequest request, HttpRequestOptions options)
|
|
|
{
|
|
|
foreach (var header in options.RequestHeaders.ToList())
|
|
@@ -199,20 +186,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// The _semaphoreLocks
|
|
|
- /// </summary>
|
|
|
- private readonly ConcurrentDictionary<string, SemaphoreSlim> _semaphoreLocks = new ConcurrentDictionary<string, SemaphoreSlim>(StringComparer.OrdinalIgnoreCase);
|
|
|
- /// <summary>
|
|
|
- /// Gets the lock.
|
|
|
- /// </summary>
|
|
|
- /// <param name="url">The filename.</param>
|
|
|
- /// <returns>System.Object.</returns>
|
|
|
- private SemaphoreSlim GetLock(string url)
|
|
|
- {
|
|
|
- return _semaphoreLocks.GetOrAdd(url, key => new SemaphoreSlim(1, 1));
|
|
|
- }
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// Gets the response internal.
|
|
|
/// </summary>
|
|
@@ -283,7 +256,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
|
|
|
var url = options.Url;
|
|
|
var urlHash = url.ToLower().GetMD5().ToString("N");
|
|
|
-
|
|
|
+
|
|
|
var responseCachePath = Path.Combine(_appPaths.CachePath, "httpclient", urlHash);
|
|
|
|
|
|
response = await GetCachedResponse(responseCachePath, options.CacheLength, url).ConfigureAwait(false);
|
|
@@ -292,31 +265,14 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
- var semaphore = GetLock(url);
|
|
|
-
|
|
|
- await semaphore.WaitAsync(options.CancellationToken).ConfigureAwait(false);
|
|
|
+ response = await SendAsyncInternal(options, httpMethod).ConfigureAwait(false);
|
|
|
|
|
|
- try
|
|
|
+ if (response.StatusCode == HttpStatusCode.OK)
|
|
|
{
|
|
|
- response = await GetCachedResponse(responseCachePath, options.CacheLength, url).ConfigureAwait(false);
|
|
|
- if (response != null)
|
|
|
- {
|
|
|
- return response;
|
|
|
- }
|
|
|
-
|
|
|
- response = await SendAsyncInternal(options, httpMethod).ConfigureAwait(false);
|
|
|
-
|
|
|
- if (response.StatusCode == HttpStatusCode.OK)
|
|
|
- {
|
|
|
- await CacheResponse(response, responseCachePath).ConfigureAwait(false);
|
|
|
- }
|
|
|
-
|
|
|
- return response;
|
|
|
- }
|
|
|
- finally
|
|
|
- {
|
|
|
- semaphore.Release();
|
|
|
+ await CacheResponse(response, responseCachePath).ConfigureAwait(false);
|
|
|
}
|
|
|
+
|
|
|
+ return response;
|
|
|
}
|
|
|
|
|
|
private async Task<HttpResponseInfo> GetCachedResponse(string responseCachePath, TimeSpan cacheLength, string url)
|
|
@@ -361,13 +317,12 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
|
|
|
using (var responseStream = response.Content)
|
|
|
{
|
|
|
- using (var fileStream = _fileSystem.GetFileStream(responseCachePath, FileMode.Create, FileAccess.Write, FileShare.Read, true))
|
|
|
- {
|
|
|
- var memoryStream = new MemoryStream();
|
|
|
-
|
|
|
- await responseStream.CopyToAsync(memoryStream).ConfigureAwait(false);
|
|
|
+ var memoryStream = new MemoryStream();
|
|
|
+ await responseStream.CopyToAsync(memoryStream).ConfigureAwait(false);
|
|
|
+ memoryStream.Position = 0;
|
|
|
|
|
|
- memoryStream.Position = 0;
|
|
|
+ using (var fileStream = _fileSystem.GetFileStream(responseCachePath, FileMode.Create, FileAccess.Write, FileShare.None, true))
|
|
|
+ {
|
|
|
await memoryStream.CopyToAsync(fileStream).ConfigureAwait(false);
|
|
|
|
|
|
memoryStream.Position = 0;
|