From 9c8864ecb7a2b63a30c40e1c537d6a8b867d48da Mon Sep 17 00:00:00 2001 From: Wannes Gennar Date: Fri, 18 Jul 2025 11:25:37 +0200 Subject: [PATCH 1/4] improve stacktrace for API errors --- .../Services/ArrowHeadApiService.cs | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs b/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs index d74a857..92fc6a3 100644 --- a/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs +++ b/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs @@ -22,6 +22,10 @@ HttpClient http { var request = BuildRequest("/api/WarSeason/current/WarID"); using var response = await http.SendAsync(request, cancellationToken); + + // Throw on error responses so we don't have to look down the entire serialisation tree. + response.EnsureSuccessStatusCode(); + await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); var memory = await CollectStream(stream, cancellationToken); var warId = JsonSerializer.Deserialize( @@ -39,6 +43,10 @@ public async Task> GetWarInfo(string season, CancellationToken canc { var request = BuildRequest($"/api/WarSeason/{season}/WarInfo"); using var response = await http.SendAsync(request, cancellationToken); + + // Throw on error responses so we don't have to look down the entire serialisation tree. + response.EnsureSuccessStatusCode(); + await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); return await CollectStream(stream, cancellationToken); @@ -51,6 +59,10 @@ public async Task> GetWarStatus(string season, string language, Can { var request = BuildRequest($"/api/WarSeason/{season}/Status", language); using var response = await http.SendAsync(request, cancellationToken); + + // Throw on error responses so we don't have to look down the entire serialisation tree. + response.EnsureSuccessStatusCode(); + await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); return await CollectStream(stream, cancellationToken); @@ -63,8 +75,11 @@ public async Task> LoadFeed(string season, string language, Cancell { var request = BuildRequest($"/api/NewsFeed/{season}?maxEntries=1024", language); using var response = await http.SendAsync(request, cancellationToken); - await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); + + // Throw on error responses so we don't have to look down the entire serialisation tree. + response.EnsureSuccessStatusCode(); + await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); return await CollectStream(stream, cancellationToken); } @@ -75,6 +90,10 @@ public async Task> LoadAssignments(string season, string language, { var request = BuildRequest($"/api/v2/Assignment/War/{season}", language); using var response = await http.SendAsync(request, cancellationToken); + + // Throw on error responses so we don't have to look down the entire serialisation tree. + response.EnsureSuccessStatusCode(); + await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); return await CollectStream(stream, cancellationToken); @@ -87,6 +106,10 @@ public async Task> LoadSpaceStations(string season, long id, string { var request = BuildRequest($"/api/SpaceStation/{season}/{id}", language); using var response = await http.SendAsync(request, cancellationToken); + + // Throw on error responses so we don't have to look down the entire serialisation tree. + response.EnsureSuccessStatusCode(); + await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); return await CollectStream(stream, cancellationToken); @@ -99,6 +122,10 @@ public async Task> GetSummary(string season, CancellationToken canc { var request = BuildRequest($"/api/Stats/war/{season}/summary"); using var response = await http.SendAsync(request, cancellationToken); + + // Throw on error responses so we don't have to look down the entire serialisation tree. + response.EnsureSuccessStatusCode(); + await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); return await CollectStream(stream, cancellationToken); From 200974174035c84114453b65ffb7cca90c3f60d5 Mon Sep 17 00:00:00 2001 From: Wannes Gennar Date: Fri, 18 Jul 2025 11:26:09 +0200 Subject: [PATCH 2/4] remove offending parameter --- src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs b/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs index 92fc6a3..1598965 100644 --- a/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs +++ b/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs @@ -73,7 +73,7 @@ public async Task> GetWarStatus(string season, string language, Can /// public async Task> LoadFeed(string season, string language, CancellationToken cancellationToken) { - var request = BuildRequest($"/api/NewsFeed/{season}?maxEntries=1024", language); + var request = BuildRequest($"/api/NewsFeed/{season}", language); using var response = await http.SendAsync(request, cancellationToken); // Throw on error responses so we don't have to look down the entire serialisation tree. From 889c64bb4bde852182407ae921300c5836cb1cff Mon Sep 17 00:00:00 2001 From: Wannes Gennar Date: Fri, 18 Jul 2025 11:27:09 +0200 Subject: [PATCH 3/4] allow manually running sync --- .github/workflows/sync.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml index 98038b0..1a5af52 100644 --- a/.github/workflows/sync.yml +++ b/.github/workflows/sync.yml @@ -11,6 +11,7 @@ on: branches: ["master"] schedule: - cron: '0 0 * * *' + workflow_dispatch: jobs: validate-sync: From abd690d6af4351e441de18c4c018018a1c3a08d4 Mon Sep 17 00:00:00 2001 From: Wannes Gennar Date: Fri, 18 Jul 2025 11:32:38 +0200 Subject: [PATCH 4/4] fix formatting --- .../Services/ArrowHeadApiService.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs b/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs index 1598965..7cb256a 100644 --- a/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs +++ b/src/Helldivers-2-Sync/Services/ArrowHeadApiService.cs @@ -22,7 +22,7 @@ HttpClient http { var request = BuildRequest("/api/WarSeason/current/WarID"); using var response = await http.SendAsync(request, cancellationToken); - + // Throw on error responses so we don't have to look down the entire serialisation tree. response.EnsureSuccessStatusCode(); @@ -43,7 +43,7 @@ public async Task> GetWarInfo(string season, CancellationToken canc { var request = BuildRequest($"/api/WarSeason/{season}/WarInfo"); using var response = await http.SendAsync(request, cancellationToken); - + // Throw on error responses so we don't have to look down the entire serialisation tree. response.EnsureSuccessStatusCode(); @@ -59,7 +59,7 @@ public async Task> GetWarStatus(string season, string language, Can { var request = BuildRequest($"/api/WarSeason/{season}/Status", language); using var response = await http.SendAsync(request, cancellationToken); - + // Throw on error responses so we don't have to look down the entire serialisation tree. response.EnsureSuccessStatusCode(); @@ -75,7 +75,7 @@ public async Task> LoadFeed(string season, string language, Cancell { var request = BuildRequest($"/api/NewsFeed/{season}", language); using var response = await http.SendAsync(request, cancellationToken); - + // Throw on error responses so we don't have to look down the entire serialisation tree. response.EnsureSuccessStatusCode(); @@ -90,7 +90,7 @@ public async Task> LoadAssignments(string season, string language, { var request = BuildRequest($"/api/v2/Assignment/War/{season}", language); using var response = await http.SendAsync(request, cancellationToken); - + // Throw on error responses so we don't have to look down the entire serialisation tree. response.EnsureSuccessStatusCode(); @@ -106,7 +106,7 @@ public async Task> LoadSpaceStations(string season, long id, string { var request = BuildRequest($"/api/SpaceStation/{season}/{id}", language); using var response = await http.SendAsync(request, cancellationToken); - + // Throw on error responses so we don't have to look down the entire serialisation tree. response.EnsureSuccessStatusCode(); @@ -122,7 +122,7 @@ public async Task> GetSummary(string season, CancellationToken canc { var request = BuildRequest($"/api/Stats/war/{season}/summary"); using var response = await http.SendAsync(request, cancellationToken); - + // Throw on error responses so we don't have to look down the entire serialisation tree. response.EnsureSuccessStatusCode();