Rework updating process a bit
Test / Run tests (push) Successful in 13s

This commit is contained in:
2026-08-12 15:01:59 +02:00
parent 4e82f164c9
commit 2dee3a9ae9
8 changed files with 72 additions and 96 deletions
+28 -25
View File
@@ -4,37 +4,42 @@ using System.Net.Http;
using System.Text.Json.Nodes;
namespace PamhagenSysCtrl.Helpers {
public sealed record UpdateInstaller(Version Version, Uri Url, long Size);
public static class UpdateService {
private static readonly HttpClient HttpClient = new() {
Timeout = Timeout.InfiniteTimeSpan,
};
public static async Task<(string Version, string Url, long Size)?> GetLatestInstallerUrl(string feedUrl) {
try {
using var client = new HttpClient() {
Timeout = TimeSpan.FromSeconds(5),
};
client.DefaultRequestHeaders.UserAgent.Clear();
client.DefaultRequestHeaders.UserAgent.ParseAdd($"PamhagenSysCtrl/{App.Version} ({Environment.MachineName}, {Environment.OSVersion})");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new("application/json"));
using var res = await client.GetAsync(feedUrl);
if (!res.IsSuccessStatusCode)
return null;
public static async Task<UpdateInstaller> GetLatestInstallerAsync(string feedUrl, CancellationToken cancellationToken = default) {
using var response = await HttpClient.GetAsync(feedUrl, cancellationToken);
response.EnsureSuccessStatusCode();
var json = JsonNode.Parse(await response.Content.ReadAsStringAsync(cancellationToken));
var latest = json!["data"]!.AsArray()[^1]!;
return new(
new Version((string)latest["version"]!),
new Uri((string)latest["url"]!),
(long)latest["size"]!
);
var json = JsonNode.Parse(await res.Content.ReadAsStringAsync());
var latest = json!["data"]!.AsArray()[^1]!;
return ((string)latest["version"]!, (string)latest["url"]!, (long)latest["size"]!);
} catch {
return null;
}
}
public static async Task<string> DownloadInstallerAsync(UpdateInstaller installer, string targetDirectory, IProgress<double>? progress = null, CancellationToken cancellationToken = default) {
Directory.CreateDirectory(targetDirectory);
var fileName = Path.Combine(targetDirectory, $"PamhagenSysCtrl-{installer.Version}.msi");
public static async Task DownloadInstaller(string url, string filename, IProgress<double>? progress = null, CancellationToken cancellationToken = default) {
try {
using var response = await HttpClient.GetAsync(installer.Url, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
using var client = new HttpClient() {
Timeout = TimeSpan.FromSeconds(5),
};
client.DefaultRequestHeaders.UserAgent.Clear();
client.DefaultRequestHeaders.UserAgent.ParseAdd($"PamhagenSysCtrl/{App.Version} ({Environment.MachineName}, {Environment.OSVersion})");
client.DefaultRequestHeaders.Accept.Clear();
using var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
response.EnsureSuccessStatusCode();
var contentLength = response.Content.Headers.ContentLength;
await using (var destination = new FileStream(fileName, FileMode.Create)) {
await using (var destination = new FileStream(filename, FileMode.Create)) {
await using var source = await response.Content.ReadAsStreamAsync(cancellationToken);
var buffer = new byte[81920];
long downloaded = 0;
@@ -49,9 +54,8 @@ namespace PamhagenSysCtrl.Helpers {
}
progress?.Report(1);
return fileName;
} catch {
File.Delete(fileName);
File.Delete(filename);
throw;
}
}
@@ -69,6 +73,5 @@ namespace PamhagenSysCtrl.Helpers {
throw new InvalidOperationException("Der Installer konnte nicht gestartet werden.");
}
}
}
}