| 
					
				 | 
			
			
				@@ -310,38 +310,28 @@ namespace Emby.Server.Implementations.HttpClientManager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 || !string.IsNullOrEmpty(options.RequestContent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 || httpMethod == HttpMethod.Post) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (options.RequestContentBytes != null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        httpWebRequest.Content = new ByteArrayContent(options.RequestContentBytes); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    else if (options.RequestContent != null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        httpWebRequest.Content = new StringContent(options.RequestContent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        httpWebRequest.Content = new ByteArrayContent(Array.Empty<byte>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var contentType = options.RequestContentType ?? "application/x-www-form-urlencoded"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (options.AppendCharsetToMimeType) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        contentType = contentType.TrimEnd(';') + "; charset=\"utf-8\""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    httpWebRequest.Headers.Add(HeaderNames.ContentType, contentType);*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    using (var response = await client.SendAsync(httpWebRequest).ConfigureAwait(false)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return await HandleResponseAsync(response, options).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (options.RequestContentBytes != null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    httpWebRequest.Content = new ByteArrayContent(options.RequestContentBytes); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else if (options.RequestContent != null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    httpWebRequest.Content = new StringContent(options.RequestContent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                catch (Exception ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    httpWebRequest.Content = new ByteArrayContent(Array.Empty<byte>()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var contentType = options.RequestContentType ?? "application/x-www-form-urlencoded"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (options.AppendCharsetToMimeType) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    throw new HttpException(ex.Message) { IsTimedOut = true }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    contentType = contentType.TrimEnd(';') + "; charset=\"utf-8\""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                httpWebRequest.Headers.Add(HeaderNames.ContentType, contentType);*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (options.LogRequest) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -349,54 +339,42 @@ namespace Emby.Server.Implementations.HttpClientManager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 _logger.LogDebug("HttpClientManager {0}: {1}", httpMethod.ToString(), options.Url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                options.CancellationToken.ThrowIfCancellationRequested(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            options.CancellationToken.ThrowIfCancellationRequested(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                /*if (!options.BufferContent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var response = await client.HttpClient.SendAsync(httpWebRequest).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            /*if (!options.BufferContent) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var response = await client.HttpClient.SendAsync(httpWebRequest).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    await EnsureSuccessStatusCode(client, response, options).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await EnsureSuccessStatusCode(client, response, options).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    options.CancellationToken.ThrowIfCancellationRequested(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                options.CancellationToken.ThrowIfCancellationRequested(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    return GetResponseInfo(response, await response.Content.ReadAsStreamAsync().ConfigureAwait(false), response.Content.Headers.ContentLength, response); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return GetResponseInfo(response, await response.Content.ReadAsStreamAsync().ConfigureAwait(false), response.Content.Headers.ContentLength, response); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                using (var response = await client.SendAsync(httpWebRequest).ConfigureAwait(false)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    return await HandleResponseAsync(response, options).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            catch (OperationCanceledException ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using (var response = await client.SendAsync(httpWebRequest, options.CancellationToken).ConfigureAwait(false)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                throw GetCancellationException(options, options.CancellationToken, ex); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        private async Task<HttpResponseInfo> HandleResponseAsync(HttpResponseMessage response, HttpRequestOptions options) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            await EnsureSuccessStatusCode(response, options).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            options.CancellationToken.ThrowIfCancellationRequested(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                await EnsureSuccessStatusCode(response, options).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var memoryStream = new MemoryStream(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                await stream.CopyToAsync(memoryStream, 81920, options.CancellationToken).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                memoryStream.Position = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                options.CancellationToken.ThrowIfCancellationRequested(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var responseInfo = new HttpResponseInfo(response.Headers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    Content = memoryStream, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    StatusCode = response.StatusCode, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    ContentType = response.Content.Headers.ContentType?.MediaType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    ContentLength = memoryStream.Length, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    ResponseUrl = response.Content.Headers.ContentLocation?.ToString() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var memoryStream = new MemoryStream(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    await stream.CopyToAsync(memoryStream, StreamDefaults.DefaultCopyToBufferSize, options.CancellationToken).ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    memoryStream.Position = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                return responseInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var responseInfo = new HttpResponseInfo(response.Headers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Content = memoryStream, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        StatusCode = response.StatusCode, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ContentType = response.Content.Headers.ContentType?.MediaType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ContentLength = memoryStream.Length, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ResponseUrl = response.Content.Headers.ContentLocation?.ToString() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return responseInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -603,7 +581,7 @@ namespace Emby.Server.Implementations.HttpClientManager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             var msg = await response.Content.ReadAsStringAsync().ConfigureAwait(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            _logger.LogError(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            _logger.LogError("HTTP request failed with message: {Message}", msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             throw new HttpException(response.ReasonPhrase) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 |