diff --git a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs index dd02bdc09..87922f60a 100644 --- a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs +++ b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs @@ -107,14 +107,13 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager /// /// Performs a GET request and returns the resulting stream /// - /// The URL. - /// The resource pool. - /// The cancellation token. + /// The options. /// Task{Stream}. + /// /// - public async Task Get(string url, SemaphoreSlim resourcePool, CancellationToken cancellationToken) + public async Task Get(HttpRequestOptions options) { - ValidateParams(url, cancellationToken); + ValidateParams(options.Url, options.CancellationToken); //var urlHash = url.GetMD5().ToString(); //var infoPath = _cacheRepository.GetResourcePath(urlHash + ".js"); @@ -136,9 +135,9 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager // return GetCachedResponse(responsePath); //} - cancellationToken.ThrowIfCancellationRequested(); + options.CancellationToken.ThrowIfCancellationRequested(); - var message = new HttpRequestMessage(HttpMethod.Get, url); + var message = GetHttpRequestMessage(options); //if (cachedInfo != null) //{ @@ -152,22 +151,22 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager // } //} - if (resourcePool != null) + if (options.ResourcePool != null) { - await resourcePool.WaitAsync(cancellationToken).ConfigureAwait(false); + await options.ResourcePool.WaitAsync(options.CancellationToken).ConfigureAwait(false); } - _logger.Info("HttpClientManager.Get url: {0}", url); + _logger.Info("HttpClientManager.Get url: {0}", options.Url); try { - cancellationToken.ThrowIfCancellationRequested(); + options.CancellationToken.ThrowIfCancellationRequested(); - var response = await GetHttpClient(GetHostFromUrl(url)).SendAsync(message, HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + var response = await GetHttpClient(GetHostFromUrl(options.Url)).SendAsync(message, HttpCompletionOption.ResponseHeadersRead, options.CancellationToken).ConfigureAwait(false); EnsureSuccessStatusCode(response); - cancellationToken.ThrowIfCancellationRequested(); + options.CancellationToken.ThrowIfCancellationRequested(); //cachedInfo = UpdateInfoCache(cachedInfo, url, infoPath, response); @@ -187,29 +186,58 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager } catch (OperationCanceledException ex) { - throw GetCancellationException(url, cancellationToken, ex); + throw GetCancellationException(options.Url, options.CancellationToken, ex); } catch (HttpRequestException ex) { - _logger.ErrorException("Error getting response from " + url, 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 " + url, ex); + _logger.ErrorException("Error getting response from " + options.Url, ex); throw; } finally { - if (resourcePool != null) + if (options.ResourcePool != null) { - resourcePool.Release(); + options.ResourcePool.Release(); } } } + /// + /// Performs a GET request and returns the resulting stream + /// + /// The URL. + /// The resource pool. + /// The cancellation token. + /// Task{Stream}. + public Task Get(string url, SemaphoreSlim resourcePool, CancellationToken cancellationToken) + { + return Get(new HttpRequestOptions + { + Url = url, + ResourcePool = resourcePool, + CancellationToken = cancellationToken, + }); + } + + /// + /// Gets the specified URL. + /// + /// The URL. + /// The cancellation token. + /// Task{Stream}. + public Task Get(string url, CancellationToken cancellationToken) + { + return Get(url, null, cancellationToken); + } + + /// /// Gets the cached response. /// @@ -393,13 +421,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager options.CancellationToken.ThrowIfCancellationRequested(); - var message = new HttpRequestMessage(HttpMethod.Get, options.Url); - - if (!string.IsNullOrEmpty(options.UserAgent)) - { - message.Headers.Add("User-Agent", options.UserAgent); - } - if (options.ResourcePool != null) { await options.ResourcePool.WaitAsync(options.CancellationToken).ConfigureAwait(false); @@ -413,7 +434,7 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager { options.CancellationToken.ThrowIfCancellationRequested(); - using (var response = await GetHttpClient(GetHostFromUrl(options.Url)).SendAsync(message, HttpCompletionOption.ResponseHeadersRead, options.CancellationToken).ConfigureAwait(false)) + using (var response = await GetHttpClient(GetHostFromUrl(options.Url)).SendAsync(GetHttpRequestMessage(options), HttpCompletionOption.ResponseHeadersRead, options.CancellationToken).ConfigureAwait(false)) { EnsureSuccessStatusCode(response); @@ -463,6 +484,28 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager return tempFile; } + /// + /// Gets the message. + /// + /// The options. + /// HttpResponseMessage. + private HttpRequestMessage GetHttpRequestMessage(HttpRequestOptions options) + { + var message = new HttpRequestMessage(HttpMethod.Get, options.Url); + + if (!string.IsNullOrEmpty(options.UserAgent)) + { + message.Headers.Add("User-Agent", options.UserAgent); + } + + if (!string.IsNullOrEmpty(options.AcceptHeader)) + { + message.Headers.Add("Accept", options.AcceptHeader); + } + + return message; + } + /// /// Gets the length of the content. /// @@ -616,17 +659,6 @@ namespace MediaBrowser.Common.Implementations.HttpClientManager } } - /// - /// Gets the specified URL. - /// - /// The URL. - /// The cancellation token. - /// Task{Stream}. - public Task Get(string url, CancellationToken cancellationToken) - { - return Get(url, null, cancellationToken); - } - /// /// Posts the specified URL. /// diff --git a/MediaBrowser.Common/Net/HttpRequestOptions.cs b/MediaBrowser.Common/Net/HttpRequestOptions.cs index 98d02a9f9..77cb8b3df 100644 --- a/MediaBrowser.Common/Net/HttpRequestOptions.cs +++ b/MediaBrowser.Common/Net/HttpRequestOptions.cs @@ -14,6 +14,12 @@ namespace MediaBrowser.Common.Net /// The URL. public string Url { get; set; } + /// + /// Gets or sets the accept header. + /// + /// The accept header. + public string AcceptHeader { get; set; } + /// /// Gets or sets the cancellation token. /// diff --git a/MediaBrowser.Common/Net/IHttpClient.cs b/MediaBrowser.Common/Net/IHttpClient.cs index 87f9b5d71..2998d1af9 100644 --- a/MediaBrowser.Common/Net/IHttpClient.cs +++ b/MediaBrowser.Common/Net/IHttpClient.cs @@ -28,7 +28,14 @@ namespace MediaBrowser.Common.Net /// The cancellation token. /// Task{Stream}. Task Get(string url, CancellationToken cancellationToken); - + + /// + /// Gets the specified options. + /// + /// The options. + /// Task{Stream}. + Task Get(HttpRequestOptions options); + /// /// Performs a POST request ///