From 83d7058b32411ef9dba6dfebd275beff7caff87c Mon Sep 17 00:00:00 2001 From: Mika Kuns Date: Wed, 15 Apr 2026 09:15:56 +0200 Subject: [PATCH] fix(installer): propagate cancellation + defensive asset parsing in ReleaseClient Co-Authored-By: Claude Sonnet 4.6 --- src/ClaudeDo.Installer/Core/ReleaseClient.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ClaudeDo.Installer/Core/ReleaseClient.cs b/src/ClaudeDo.Installer/Core/ReleaseClient.cs index 4489ea5..78550dd 100644 --- a/src/ClaudeDo.Installer/Core/ReleaseClient.cs +++ b/src/ClaudeDo.Installer/Core/ReleaseClient.cs @@ -27,7 +27,7 @@ public sealed class ReleaseClient : IReleaseClient return ParseRelease(json); } catch (HttpRequestException) { return null; } - catch (TaskCanceledException) { return null; } + catch (TaskCanceledException) when (!ct.IsCancellationRequested) { return null; } } public async Task DownloadAsync(string url, string destPath, IProgress progress, CancellationToken ct) @@ -65,8 +65,11 @@ public sealed class ReleaseClient : IReleaseClient { foreach (var item in arr.EnumerateArray()) { - var aName = item.GetProperty("name").GetString() ?? ""; - var aUrl = item.GetProperty("browser_download_url").GetString() ?? ""; + if (!item.TryGetProperty("name", out var nameField)) continue; + if (!item.TryGetProperty("browser_download_url", out var urlField)) continue; + + var aName = nameField.GetString() ?? ""; + var aUrl = urlField.GetString() ?? ""; var aSize = item.TryGetProperty("size", out var s) ? s.GetInt64() : 0L; assets.Add(new ReleaseAsset(aName, aUrl, aSize)); }