|
@@ -27,7 +27,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
/// <summary>
|
|
|
/// When one request to a host times out, we'll ban all other requests for this period of time, to prevent scans from stalling
|
|
|
/// </summary>
|
|
|
- private int TimeoutSeconds = 30;
|
|
|
+ private const int TimeoutSeconds = 30;
|
|
|
|
|
|
/// <summary>
|
|
|
/// The _logger
|
|
@@ -42,16 +42,14 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
private readonly IFileSystem _fileSystem;
|
|
|
|
|
|
/// <summary>
|
|
|
- /// Initializes a new instance of the <see cref="HttpClientManager"/> class.
|
|
|
+ /// Initializes a new instance of the <see cref="HttpClientManager" /> class.
|
|
|
/// </summary>
|
|
|
/// <param name="appPaths">The app paths.</param>
|
|
|
/// <param name="logger">The logger.</param>
|
|
|
- /// <param name="getHttpClientHandler">The get HTTP client handler.</param>
|
|
|
- /// <exception cref="System.ArgumentNullException">
|
|
|
- /// appPaths
|
|
|
+ /// <param name="fileSystem">The file system.</param>
|
|
|
+ /// <exception cref="System.ArgumentNullException">appPaths
|
|
|
/// or
|
|
|
- /// logger
|
|
|
- /// </exception>
|
|
|
+ /// logger</exception>
|
|
|
public HttpClientManager(IApplicationPaths appPaths, ILogger logger, IFileSystem fileSystem)
|
|
|
{
|
|
|
if (appPaths == null)
|
|
@@ -143,7 +141,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
/// Gets the response internal.
|
|
|
/// </summary>
|
|
|
/// <param name="options">The options.</param>
|
|
|
- /// <param name="httpMethod">The HTTP method.</param>
|
|
|
/// <returns>Task{HttpResponseInfo}.</returns>
|
|
|
/// <exception cref="HttpException">
|
|
|
/// </exception>
|
|
@@ -490,27 +487,19 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
}
|
|
|
catch (OperationCanceledException ex)
|
|
|
{
|
|
|
- var exception = GetCancellationException(options.Url, options.CancellationToken, ex);
|
|
|
-
|
|
|
- throw exception;
|
|
|
+ throw GetTempFileException(ex, options, tempFile);
|
|
|
}
|
|
|
catch (HttpRequestException ex)
|
|
|
{
|
|
|
- _logger.ErrorException("Error getting response from " + options.Url, ex);
|
|
|
-
|
|
|
- throw new HttpException(ex.Message, ex);
|
|
|
+ throw GetTempFileException(ex, options, tempFile);
|
|
|
}
|
|
|
catch (WebException ex)
|
|
|
{
|
|
|
- _logger.ErrorException("Error getting response from " + options.Url, ex);
|
|
|
-
|
|
|
- throw new HttpException(ex.Message, ex);
|
|
|
+ throw GetTempFileException(ex, options, tempFile);
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
- _logger.ErrorException("Error getting response from " + options.Url, ex);
|
|
|
-
|
|
|
- throw;
|
|
|
+ throw GetTempFileException(ex, options, tempFile);
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
@@ -521,65 +510,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// Gets the message.
|
|
|
- /// </summary>
|
|
|
- /// <param name="options">The options.</param>
|
|
|
- /// <returns>HttpResponseMessage.</returns>
|
|
|
- private HttpRequestMessage GetHttpRequestMessage(HttpRequestOptions options)
|
|
|
- {
|
|
|
- var message = new HttpRequestMessage(HttpMethod.Get, options.Url);
|
|
|
-
|
|
|
- foreach (var pair in options.RequestHeaders.ToList())
|
|
|
- {
|
|
|
- if (!message.Headers.TryAddWithoutValidation(pair.Key, pair.Value))
|
|
|
- {
|
|
|
- _logger.Error("Unable to add request header {0} with value {1}", pair.Key, pair.Value);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return message;
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// Gets the length of the content.
|
|
|
- /// </summary>
|
|
|
- /// <param name="response">The response.</param>
|
|
|
- /// <returns>System.Nullable{System.Int64}.</returns>
|
|
|
- private long? GetContentLength(HttpResponseMessage response)
|
|
|
- {
|
|
|
- IEnumerable<string> lengthValues = null;
|
|
|
-
|
|
|
- // Seeing some InvalidOperationException here under mono
|
|
|
- try
|
|
|
- {
|
|
|
- response.Headers.TryGetValues("content-length", out lengthValues);
|
|
|
- }
|
|
|
- catch (InvalidOperationException ex)
|
|
|
- {
|
|
|
- _logger.ErrorException("Error accessing response.Headers.TryGetValues Content-Length", ex);
|
|
|
- }
|
|
|
-
|
|
|
- if (lengthValues == null)
|
|
|
- {
|
|
|
- try
|
|
|
- {
|
|
|
- response.Content.Headers.TryGetValues("content-length", out lengthValues);
|
|
|
- }
|
|
|
- catch (InvalidOperationException ex)
|
|
|
- {
|
|
|
- _logger.ErrorException("Error accessing response.Content.Headers.TryGetValues Content-Length", ex);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (lengthValues == null)
|
|
|
- {
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- return long.Parse(string.Join(string.Empty, lengthValues.ToArray()), UsCulture);
|
|
|
- }
|
|
|
-
|
|
|
private long? GetContentLength(HttpWebResponse response)
|
|
|
{
|
|
|
var length = response.ContentLength;
|
|
@@ -616,16 +546,23 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
|
|
|
_logger.ErrorException("Error getting response from " + options.Url, ex);
|
|
|
|
|
|
- var httpRequestException = ex as HttpRequestException;
|
|
|
-
|
|
|
// Cleanup
|
|
|
DeleteTempFile(tempFile);
|
|
|
|
|
|
+ var httpRequestException = ex as HttpRequestException;
|
|
|
+
|
|
|
if (httpRequestException != null)
|
|
|
{
|
|
|
return new HttpException(ex.Message, ex);
|
|
|
}
|
|
|
|
|
|
+ var webException = ex as WebException;
|
|
|
+
|
|
|
+ if (webException != null)
|
|
|
+ {
|
|
|
+ return new HttpException(ex.Message, ex);
|
|
|
+ }
|
|
|
+
|
|
|
return ex;
|
|
|
}
|
|
|
|
|
@@ -711,19 +648,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
return exception;
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// Ensures the success status code.
|
|
|
- /// </summary>
|
|
|
- /// <param name="response">The response.</param>
|
|
|
- /// <exception cref="MediaBrowser.Model.Net.HttpException"></exception>
|
|
|
- private void EnsureSuccessStatusCode(HttpResponseMessage response)
|
|
|
- {
|
|
|
- if (!response.IsSuccessStatusCode)
|
|
|
- {
|
|
|
- throw new HttpException(response.ReasonPhrase) { StatusCode = response.StatusCode };
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
private void EnsureSuccessStatusCode(HttpWebResponse response)
|
|
|
{
|
|
|
var statusCode = response.StatusCode;
|