fix duplicate connections on the dashboard

This commit is contained in:
LukePulverenti
2013-03-16 12:41:49 -04:00
parent 110ee00517
commit bae89ee824
13 changed files with 79 additions and 88 deletions

View File

@@ -252,30 +252,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
_logger.Info("HttpClientManager.GetTempFile url: {0}, temp file: {1}", options.Url, tempFile);
FileStream tempFileStream;
if (resumeCount > 0 && File.Exists(tempFile))
{
tempFileStream = new FileStream(tempFile, FileMode.Open, FileAccess.Write, FileShare.Read,
StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous);
var startPosition = tempFileStream.Length;
tempFileStream.Seek(startPosition, SeekOrigin.Current);
message.Headers.Range = new RangeHeaderValue(startPosition, null);
_logger.Info("Resuming from position {1} for {0}", options.Url, startPosition);
}
else
{
tempFileStream = new FileStream(tempFile, FileMode.Create, FileAccess.Write, FileShare.Read,
StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous);
}
var serverSupportsRangeRequests = false;
Exception downloadException = null;
try
{
options.CancellationToken.ThrowIfCancellationRequested();
@@ -286,15 +262,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
options.CancellationToken.ThrowIfCancellationRequested();
var rangeValue = string.Join(" ", response.Headers.AcceptRanges.ToArray());
serverSupportsRangeRequests = rangeValue.IndexOf("bytes", StringComparison.OrdinalIgnoreCase) != -1 || rangeValue.IndexOf("*", StringComparison.OrdinalIgnoreCase) != -1;
if (!serverSupportsRangeRequests && resumeCount > 0)
{
_logger.Info("Server does not support range requests for {0}", options.Url);
tempFileStream.Position = 0;
}
IEnumerable<string> lengthValues;
if (!response.Headers.TryGetValues("content-length", out lengthValues) &&
@@ -303,7 +270,10 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
// We're not able to track progress
using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
{
await stream.CopyToAsync(tempFileStream, StreamDefaults.DefaultCopyToBufferSize, options.CancellationToken).ConfigureAwait(false);
using (var fs = new FileStream(tempFile, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous))
{
await stream.CopyToAsync(fs, StreamDefaults.DefaultCopyToBufferSize, options.CancellationToken).ConfigureAwait(false);
}
}
}
else
@@ -312,7 +282,10 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
using (var stream = ProgressStream.CreateReadProgressStream(await response.Content.ReadAsStreamAsync().ConfigureAwait(false), options.Progress.Report, length))
{
await stream.CopyToAsync(tempFileStream, StreamDefaults.DefaultCopyToBufferSize, options.CancellationToken).ConfigureAwait(false);
using (var fs = new FileStream(tempFile, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous))
{
await stream.CopyToAsync(fs, StreamDefaults.DefaultCopyToBufferSize, options.CancellationToken).ConfigureAwait(false);
}
}
}
@@ -323,23 +296,16 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
}
catch (Exception ex)
{
downloadException = ex;
HandleTempFileException(ex, options, tempFile);
}
finally
{
tempFileStream.Dispose();
if (options.ResourcePool != null)
{
options.ResourcePool.Release();
}
}
if (downloadException != null)
{
await HandleTempFileException(downloadException, options, tempFile, serverSupportsRangeRequests, resumeCount).ConfigureAwait(false);
}
return tempFile;
}
@@ -349,11 +315,9 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
/// <param name="ex">The ex.</param>
/// <param name="options">The options.</param>
/// <param name="tempFile">The temp file.</param>
/// <param name="serverSupportsRangeRequests">if set to <c>true</c> [server supports range requests].</param>
/// <param name="resumeCount">The resume count.</param>
/// <returns>Task.</returns>
/// <exception cref="HttpException"></exception>
private Task HandleTempFileException(Exception ex, HttpRequestOptions options, string tempFile, bool serverSupportsRangeRequests, int resumeCount)
private void HandleTempFileException(Exception ex, HttpRequestOptions options, string tempFile)
{
var operationCanceledException = ex as OperationCanceledException;
@@ -375,14 +339,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
// Cleanup
if (File.Exists(tempFile))
{
// Try to resume
if (httpRequestException != null && serverSupportsRangeRequests && resumeCount < options.MaxResumeCount && new FileInfo(tempFile).Length > 0)
{
_logger.Info("Attempting to resume download from {0}", options.Url);
return GetTempFile(options, tempFile, resumeCount + 1);
}
File.Delete(tempFile);
}