diff --git a/Server.Installer/Services/ServerInstaller.cs b/Server.Installer/Services/ServerInstaller.cs index 5540530a..67fecf16 100644 --- a/Server.Installer/Services/ServerInstaller.cs +++ b/Server.Installer/Services/ServerInstaller.cs @@ -11,6 +11,7 @@ using System.Net.Http; using System.Reflection; using System.Text; using System.Threading.Tasks; +using Remotely.Shared.Extensions; namespace Server.Installer.Services { @@ -36,23 +37,40 @@ namespace Server.Installer.Services { ConsoleHelper.WriteLine("Downloading pre-built server package."); - int progress = 0; - var releaseFile = cliParams.WebServer == WebServerType.IisWindows ? "https://github.com/lucent-sea/Remotely/releases/latest/download/Remotely_Server_Win-x64.zip" : "https://github.com/lucent-sea/Remotely/releases/latest/download/Remotely_Server_Linux-x64.zip"; - using var webClient = new WebClient(); - webClient.DownloadProgressChanged += (sender, args) => + using var httpClient = new HttpClient(); + + var headMessage = new HttpRequestMessage(HttpMethod.Head, releaseFile); + var response = await httpClient.SendAsync(headMessage); + var contentLength = (double?)response.Content.Headers.ContentLength; + + using var webStream = await httpClient.GetStreamAsync(releaseFile); + using var fileStream = new FileStream(zipPath, FileMode.Create); + + var progress = 0; + + await webStream.CopyToAsync(fileStream, (int bytesRead) => { - var newProgress = args.ProgressPercentage / 5 * 5; - if (newProgress != progress) + if (contentLength is null || + contentLength <= 0) { - progress = newProgress; + return; + + } + + var newProgress = bytesRead / contentLength * 100; + + if (newProgress == 100 || + newProgress - progress > 5) + { + progress = (int)newProgress; ConsoleHelper.WriteLine($"Progress: {progress}%"); } - }; - await webClient.DownloadFileTaskAsync(releaseFile, zipPath); + }); + } else { diff --git a/Shared/Extensions/StreamExtensions.cs b/Shared/Extensions/StreamExtensions.cs new file mode 100644 index 00000000..b0cf3487 --- /dev/null +++ b/Shared/Extensions/StreamExtensions.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Remotely.Shared.Extensions +{ + public static class StreamExtensions + { + public static async Task CopyToAsync(this Stream source, Stream destination, Action bytesReadCallback) + { + var buffer = new byte[64_000]; + var totalRead = 0; + + int bytesRead; + + while ((bytesRead = await source.ReadAsync(buffer)) != 0) + { + await destination.WriteAsync(buffer.AsMemory(0, bytesRead)); + totalRead += bytesRead; + bytesReadCallback.Invoke(totalRead); + } + } + } +}