From 7a6a8aa4571a982b296ab867aeb00efe9c6030da Mon Sep 17 00:00:00 2001 From: Christoph Wille Date: Tue, 6 Jun 2023 08:12:23 +0200 Subject: [PATCH] Turn DownloadAndGetAppCastData into an async method and use GetAwaiter().GetResult() in the original. Other things of note: libraries should always go for ConfigureAwait(false) and never use .Result unless you are sure the result is already there. --- .../WebRequestAppCastDataDownloader.cs | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/NetSparkle/Downloaders/WebRequestAppCastDataDownloader.cs b/src/NetSparkle/Downloaders/WebRequestAppCastDataDownloader.cs index 2e999fa8..698a2bf9 100644 --- a/src/NetSparkle/Downloaders/WebRequestAppCastDataDownloader.cs +++ b/src/NetSparkle/Downloaders/WebRequestAppCastDataDownloader.cs @@ -46,16 +46,23 @@ public WebRequestAppCastDataDownloader() /// public string DownloadAndGetAppCastData(string url) + { + return DownloadAndGetAppCastDataAsync(url).GetAwaiter().GetResult(); + } + + /// + public async Task DownloadAndGetAppCastDataAsync(string url) { _appcastUrl = url; // configure ssl cert link ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate; - // use HttpClient synchronously: https://stackoverflow.com/a/53529122/3938401 + var handler = new HttpClientHandler(); if (RedirectHandler != null) { handler.AllowAutoRedirect = false; } + if (TrustEverySSLConnection) { #if NETCORE @@ -75,16 +82,16 @@ public string DownloadAndGetAppCastData(string url) { HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url); request.Content = new StringContent(ExtraJsonData, Encoding.UTF8, "application/json"); - var postTask = Task.Run(() => httpClient.SendAsync(request)); - postTask.Wait(); - if (postTask.Result.IsSuccessStatusCode) + HttpResponseMessage response = await httpClient.SendAsync(request).ConfigureAwait(false); + + if (response.IsSuccessStatusCode) { - var postTaskStream = Task.Run(() => postTask.Result.Content.ReadAsStreamAsync()); - postTask.Wait(); + Stream responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false); + ServicePointManager.ServerCertificateValidationCallback -= ValidateRemoteCertificate; - using (StreamReader reader = new StreamReader(postTaskStream.Result, GetAppCastEncoding())) + using (StreamReader reader = new StreamReader(responseStream, GetAppCastEncoding())) { - return reader.ReadToEnd(); + return await reader.ReadToEndAsync().ConfigureAwait(false); } } } @@ -92,32 +99,29 @@ public string DownloadAndGetAppCastData(string url) { if (RedirectHandler != null) { - var task = Task.Run(() => httpClient.GetAsync(url)); - task.Wait(); - var response = task.Result; + HttpResponseMessage response = await httpClient.GetAsync(url).ConfigureAwait(false); + if ((int)response.StatusCode >= 300 && (int)response.StatusCode <= 399) { var redirectURI = response.Headers.Location; if (RedirectHandler.Invoke(url, redirectURI.ToString(), response)) { - return DownloadAndGetAppCastData(redirectURI.ToString()); + return await DownloadAndGetAppCastDataAsync(redirectURI.ToString()).ConfigureAwait(false); } } else if (response.IsSuccessStatusCode) { - var readTask = Task.Run(() => response.Content.ReadAsStringAsync()); - readTask.Wait(); - return readTask.Result; + return await response.Content.ReadAsStringAsync().ConfigureAwait(false); } } - else + else { - var task = Task.Run(() => httpClient.GetStreamAsync(url)); - var responseStream = task.Result; + Stream responseStream = await httpClient.GetStreamAsync(url).ConfigureAwait(false); + ServicePointManager.ServerCertificateValidationCallback -= ValidateRemoteCertificate; using (StreamReader reader = new StreamReader(responseStream, GetAppCastEncoding())) { - return reader.ReadToEnd(); + return await reader.ReadToEndAsync().ConfigureAwait(false); } } }