diff --git a/MapControl/Shared/ImageLoader.cs b/MapControl/Shared/ImageLoader.cs index cf8c6351..78b9e2ed 100644 --- a/MapControl/Shared/ImageLoader.cs +++ b/MapControl/Shared/ImageLoader.cs @@ -23,7 +23,7 @@ namespace MapControl /// /// The System.Net.Http.HttpClient instance used to download images via a http or https Uri. /// - public static HttpClient HttpClient { get; set; } = new HttpClient(); + public static HttpClient HttpClient { get; set; } = new HttpClient { Timeout = TimeSpan.FromSeconds(10) }; public static async Task LoadImageAsync(Uri uri) @@ -64,11 +64,25 @@ namespace MapControl try { - using (var responseMessage = await HttpClient.GetAsync(uri).ConfigureAwait(continueOnCapturedContext)) + using (var responseMessage = await HttpClient + .GetAsync(uri, HttpCompletionOption.ResponseHeadersRead) + .ConfigureAwait(continueOnCapturedContext)) { if (responseMessage.IsSuccessStatusCode) { - response = await HttpResponse.Create(responseMessage, continueOnCapturedContext); + IEnumerable tileInfo; + + if (responseMessage.Headers.TryGetValues("X-VE-Tile-Info", out tileInfo) && + tileInfo.Contains("no-tile")) + { + response = new HttpResponse(null, null); // no tile image + } + else + { + response = new HttpResponse( + await responseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(continueOnCapturedContext), + responseMessage.Headers.CacheControl?.MaxAge); + } } else { @@ -86,21 +100,13 @@ namespace MapControl internal class HttpResponse { - public byte[] Buffer { get; private set; } - public TimeSpan? MaxAge { get; private set; } + public byte[] Buffer { get; } + public TimeSpan? MaxAge { get; } - internal static async Task Create(HttpResponseMessage message, bool continueOnCapturedContext) + public HttpResponse(byte[] buffer, TimeSpan? maxAge) { - var response = new HttpResponse(); - IEnumerable tileInfo; - - if (!message.Headers.TryGetValues("X-VE-Tile-Info", out tileInfo) || !tileInfo.Contains("no-tile")) - { - response.Buffer = await message.Content.ReadAsByteArrayAsync().ConfigureAwait(continueOnCapturedContext); - response.MaxAge = message.Headers.CacheControl?.MaxAge; - } - - return response; + Buffer = buffer; + MaxAge = maxAge; } } }