diff --git a/MapControl/Shared/ImageLoader.cs b/MapControl/Shared/ImageLoader.cs index 9522e11a..f2f5408e 100644 --- a/MapControl/Shared/ImageLoader.cs +++ b/MapControl/Shared/ImageLoader.cs @@ -18,12 +18,12 @@ namespace MapControl public static partial class ImageLoader { private static ILogger logger; - private static ILogger Logger => logger ??= ImageLoader.LoggerFactory?.CreateLogger(typeof(ImageLoader)); + private static ILogger Logger => logger ??= LoggerFactory?.CreateLogger(typeof(ImageLoader)); public static ILoggerFactory LoggerFactory { get; set; } /// - /// The System.Net.Http.HttpClient instance used to download images via a http or https Uri. + /// The System.Net.Http.HttpClient instance used to download images. /// public static HttpClient HttpClient { get; set; } @@ -54,7 +54,7 @@ namespace MapControl } else if (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps) { - (var buffer, var _) = await GetHttpResponseAsync(uri, progress); + var buffer = await GetHttpContent(uri, progress); if (buffer != null) { @@ -80,34 +80,19 @@ namespace MapControl return image; } - internal static async Task<(byte[], TimeSpan?)> GetHttpResponseAsync(Uri uri, IProgress progress = null) + public static async Task GetHttpResponseAsync(Uri uri, HttpCompletionOption completionOption = HttpCompletionOption.ResponseContentRead) { - byte[] buffer = null; - TimeSpan? maxAge = null; - try { - var completionOptions = progress != null ? HttpCompletionOption.ResponseHeadersRead : HttpCompletionOption.ResponseContentRead; + var response = await HttpClient.GetAsync(uri, completionOption).ConfigureAwait(false); - using var responseMessage = await HttpClient.GetAsync(uri, completionOptions).ConfigureAwait(false); - - if (responseMessage.IsSuccessStatusCode) + if (response.IsSuccessStatusCode) { - if (progress != null && responseMessage.Content.Headers.ContentLength.HasValue) - { - buffer = await ReadAsByteArray(responseMessage.Content, progress).ConfigureAwait(false); - } - else - { - buffer = await responseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false); - } + return response; + } - maxAge = responseMessage.Headers.CacheControl?.MaxAge; - } - else - { - Logger?.LogWarning("{status} ({reason}) from {uri}", (int)responseMessage.StatusCode, responseMessage.ReasonPhrase, uri); - } + Logger?.LogWarning("{status} ({reason}) from {uri}", (int)response.StatusCode, response.ReasonPhrase, uri); + response.Dispose(); } catch (TaskCanceledException) { @@ -118,12 +103,29 @@ namespace MapControl Logger?.LogError(ex, "Failed loading {uri}", uri); } - return (buffer, maxAge); + return null; } - private static async Task ReadAsByteArray(HttpContent content, IProgress progress) + private static async Task GetHttpContent(Uri uri, IProgress progress) { - var length = (int)content.Headers.ContentLength.Value; + var completionOption = progress != null ? HttpCompletionOption.ResponseHeadersRead : HttpCompletionOption.ResponseContentRead; + + using var response = await GetHttpResponseAsync(uri, completionOption).ConfigureAwait(false); + + if (response == null) + { + return null; + } + + var content = response.Content; + var contentLength = content.Headers.ContentLength; + + if (progress == null || !contentLength.HasValue) + { + return await content.ReadAsByteArrayAsync().ConfigureAwait(false); + } + + var length = (int)contentLength.Value; var buffer = new byte[length]; using (var stream = await content.ReadAsStreamAsync().ConfigureAwait(false)) diff --git a/MapControl/Shared/TileImageLoader.cs b/MapControl/Shared/TileImageLoader.cs index d2147c39..c2cda1e7 100644 --- a/MapControl/Shared/TileImageLoader.cs +++ b/MapControl/Shared/TileImageLoader.cs @@ -201,12 +201,15 @@ namespace MapControl if (buffer == null) { - (buffer, var maxAge) = await ImageLoader.GetHttpResponseAsync(uri).ConfigureAwait(false); + using var response = await ImageLoader.GetHttpResponseAsync(uri).ConfigureAwait(false); - if (buffer != null) + if (response != null) { + buffer = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false); + try { + var maxAge = response.Headers.CacheControl?.MaxAge; var options = new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = diff --git a/MapControl/WinUI/ImageLoader.WinUI.cs b/MapControl/WinUI/ImageLoader.WinUI.cs index c62ff7a9..6397715a 100644 --- a/MapControl/WinUI/ImageLoader.WinUI.cs +++ b/MapControl/WinUI/ImageLoader.WinUI.cs @@ -78,7 +78,7 @@ namespace MapControl try { - (var buffer, var _) = await GetHttpResponseAsync(uri, progress); + var buffer = await GetHttpContent(uri, progress); if (buffer != null) {