|
|
|
@ -161,91 +161,93 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager
|
|
|
|
|
|
|
|
|
|
options.CancellationToken.ThrowIfCancellationRequested();
|
|
|
|
|
|
|
|
|
|
var message = GetHttpRequestMessage(options);
|
|
|
|
|
|
|
|
|
|
//if (options.EnableResponseCache && cachedInfo != null)
|
|
|
|
|
//{
|
|
|
|
|
// if (!string.IsNullOrEmpty(cachedInfo.Etag))
|
|
|
|
|
// {
|
|
|
|
|
// message.Headers.Add("If-None-Match", cachedInfo.Etag);
|
|
|
|
|
// }
|
|
|
|
|
// else if (cachedInfo.LastModified.HasValue)
|
|
|
|
|
// {
|
|
|
|
|
// message.Headers.IfModifiedSince = new DateTimeOffset(cachedInfo.LastModified.Value);
|
|
|
|
|
// }
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
if (options.ResourcePool != null)
|
|
|
|
|
using (var message = GetHttpRequestMessage(options))
|
|
|
|
|
{
|
|
|
|
|
await options.ResourcePool.WaitAsync(options.CancellationToken).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_logger.Info("HttpClientManager.Get url: {0}", options.Url);
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
options.CancellationToken.ThrowIfCancellationRequested();
|
|
|
|
|
|
|
|
|
|
var response = await GetHttpClient(GetHostFromUrl(options.Url), options.EnableHttpCompression).SendAsync(message, HttpCompletionOption.ResponseContentRead, options.CancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
if (options.EnableResponseCache)
|
|
|
|
|
if (options.EnableResponseCache && cachedInfo != null)
|
|
|
|
|
{
|
|
|
|
|
if (response.StatusCode != HttpStatusCode.NotModified)
|
|
|
|
|
if (!string.IsNullOrEmpty(cachedInfo.Etag))
|
|
|
|
|
{
|
|
|
|
|
EnsureSuccessStatusCode(response);
|
|
|
|
|
message.Headers.Add("If-None-Match", cachedInfo.Etag);
|
|
|
|
|
}
|
|
|
|
|
else if (cachedInfo.LastModified.HasValue)
|
|
|
|
|
{
|
|
|
|
|
message.Headers.IfModifiedSince = new DateTimeOffset(cachedInfo.LastModified.Value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (options.ResourcePool != null)
|
|
|
|
|
{
|
|
|
|
|
await options.ResourcePool.WaitAsync(options.CancellationToken).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_logger.Info("HttpClientManager.Get url: {0}", options.Url);
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
options.CancellationToken.ThrowIfCancellationRequested();
|
|
|
|
|
|
|
|
|
|
cachedInfo = UpdateInfoCache(cachedInfo, options.Url, cachedInfoPath, response);
|
|
|
|
|
var response = await GetHttpClient(GetHostFromUrl(options.Url), options.EnableHttpCompression).SendAsync(message, HttpCompletionOption.ResponseContentRead, options.CancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
if (response.StatusCode == HttpStatusCode.NotModified)
|
|
|
|
|
if (options.EnableResponseCache)
|
|
|
|
|
{
|
|
|
|
|
_logger.Debug("Server indicates not modified for {0}. Returning cached result.", options.Url);
|
|
|
|
|
if (response.StatusCode != HttpStatusCode.NotModified)
|
|
|
|
|
{
|
|
|
|
|
EnsureSuccessStatusCode(response);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return GetCachedResponse(cachedReponsePath);
|
|
|
|
|
}
|
|
|
|
|
options.CancellationToken.ThrowIfCancellationRequested();
|
|
|
|
|
|
|
|
|
|
cachedInfo = UpdateInfoCache(cachedInfo, options.Url, cachedInfoPath, response);
|
|
|
|
|
|
|
|
|
|
if (response.StatusCode == HttpStatusCode.NotModified)
|
|
|
|
|
{
|
|
|
|
|
_logger.Debug("Server indicates not modified for {0}. Returning cached result.", options.Url);
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(cachedInfo.Etag) || cachedInfo.LastModified.HasValue ||
|
|
|
|
|
(cachedInfo.Expires.HasValue && cachedInfo.Expires.Value > DateTime.UtcNow))
|
|
|
|
|
return GetCachedResponse(cachedReponsePath);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(cachedInfo.Etag) || cachedInfo.LastModified.HasValue ||
|
|
|
|
|
(cachedInfo.Expires.HasValue && cachedInfo.Expires.Value > DateTime.UtcNow))
|
|
|
|
|
{
|
|
|
|
|
await UpdateResponseCache(response, cachedReponsePath).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
return GetCachedResponse(cachedReponsePath);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
await UpdateResponseCache(response, cachedReponsePath).ConfigureAwait(false);
|
|
|
|
|
EnsureSuccessStatusCode(response);
|
|
|
|
|
|
|
|
|
|
return GetCachedResponse(cachedReponsePath);
|
|
|
|
|
options.CancellationToken.ThrowIfCancellationRequested();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return await response.Content.ReadAsStreamAsync().ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
catch (OperationCanceledException ex)
|
|
|
|
|
{
|
|
|
|
|
EnsureSuccessStatusCode(response);
|
|
|
|
|
|
|
|
|
|
options.CancellationToken.ThrowIfCancellationRequested();
|
|
|
|
|
throw GetCancellationException(options.Url, options.CancellationToken, ex);
|
|
|
|
|
}
|
|
|
|
|
catch (HttpRequestException ex)
|
|
|
|
|
{
|
|
|
|
|
_logger.ErrorException("Error getting response from " + options.Url, ex);
|
|
|
|
|
|
|
|
|
|
return await response.Content.ReadAsStreamAsync().ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
catch (OperationCanceledException ex)
|
|
|
|
|
{
|
|
|
|
|
throw GetCancellationException(options.Url, options.CancellationToken, ex);
|
|
|
|
|
}
|
|
|
|
|
catch (HttpRequestException ex)
|
|
|
|
|
{
|
|
|
|
|
_logger.ErrorException("Error getting response from " + options.Url, ex);
|
|
|
|
|
|
|
|
|
|
throw new HttpException(ex.Message, ex);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
_logger.ErrorException("Error getting response from " + options.Url, ex);
|
|
|
|
|
throw new HttpException(ex.Message, ex);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
_logger.ErrorException("Error getting response from " + options.Url, ex);
|
|
|
|
|
|
|
|
|
|
throw;
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
if (options.ResourcePool != null)
|
|
|
|
|
throw;
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
options.ResourcePool.Release();
|
|
|
|
|
if (options.ResourcePool != null)
|
|
|
|
|
{
|
|
|
|
|
options.ResourcePool.Release();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|