From 3b644de2d5bd163d8765ab772ef7394d2b632a75 Mon Sep 17 00:00:00 2001 From: Mohammad Mahdi Date: Wed, 4 Nov 2026 16:55:58 +0330 Subject: [PATCH] feat: refactor HTTP client setup for Github and Forgejo services - Centralized HTTP client configuration for `GithubService` and `ForgejoService` using `AddHttpClient`. - Enhanced maintainability by moving Forgejo token and base URL setup into DI-configured HTTP clients. - Fixed `forgejoInstance` validation logic and adjusted release selection to prioritize the first non-prerelease. --- ForgejoReleaseSync.csproj | 1 + Program.cs | 26 ++++++++++++++++---------- Services/AppConfig.cs | 2 +- Services/ForgejoService.cs | 2 -- Services/SyncService.cs | 4 ++-- 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/ForgejoReleaseSync.csproj b/ForgejoReleaseSync.csproj index 43ab138..cae8a76 100644 --- a/ForgejoReleaseSync.csproj +++ b/ForgejoReleaseSync.csproj @@ -13,6 +13,7 @@ + diff --git a/Program.cs b/Program.cs index e38f857..d47fcbd 100644 --- a/Program.cs +++ b/Program.cs @@ -1,4 +1,5 @@ -using ForgejoReleaseSync.Services; +using System.Net.Http.Headers; +using ForgejoReleaseSync.Services; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -11,12 +12,19 @@ var repositoryConfig = await RepoConfigLoader.LoadConfigAsync( config.RepositoryConfigFilePath); builder.Services.AddSingleton(repositoryConfig); -var client = new HttpClient(); -client.DefaultRequestHeaders.Add("User-Agent", "ForgejoReleaseSync"); -client.DefaultRequestHeaders.Add("Accept", "application/json"); -client.Timeout = TimeSpan.FromMinutes(3); -client.MaxResponseContentBufferSize = 1024 * 1024 * 1; -builder.Services.AddSingleton(client); +builder.Services.AddHttpClient(client => +{ + client.BaseAddress = new Uri("https://api.github.com/"); + client.DefaultRequestHeaders.UserAgent.ParseAdd("ForgejoReleaseSync"); + client.DefaultRequestHeaders.Accept.ParseAdd("application/vnd.github+json"); +}); + +builder.Services.AddHttpClient(client => +{ + client.BaseAddress = new Uri(config.ForgejoInstacne); + client.DefaultRequestHeaders.UserAgent.ParseAdd("ForgejoReleaseSync"); + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("token", config.ForgejoToken); +}); builder.Services.AddSingleton(); builder.Services.AddSingleton(); @@ -29,6 +37,4 @@ using var scope = app.Services.CreateScope(); await scope.ServiceProvider .GetRequiredService() - .Sync(); - -await app.RunAsync(); \ No newline at end of file + .Sync(); \ No newline at end of file diff --git a/Services/AppConfig.cs b/Services/AppConfig.cs index fda9e9c..32eee1b 100644 --- a/Services/AppConfig.cs +++ b/Services/AppConfig.cs @@ -24,7 +24,7 @@ public static class AppConfigLoader if (string.IsNullOrEmpty(forgejoInstance)) throw new Exception("FORGEJO_INSTANCE environment variable is required"); - if (!string.IsNullOrEmpty(forgejoToken) && forgejoInstance.EndsWith('/')) + if (!string.IsNullOrEmpty(forgejoInstance) && forgejoInstance.EndsWith('/')) forgejoInstance = forgejoInstance[..^1]; if (string.IsNullOrEmpty(forgejoToken)) diff --git a/Services/ForgejoService.cs b/Services/ForgejoService.cs index 868d8cd..b6c3474 100644 --- a/Services/ForgejoService.cs +++ b/Services/ForgejoService.cs @@ -20,7 +20,6 @@ public class ForgejoService(HttpClient httpClient, AppConfig config, ILogger !r.Prerelease); + var githubRelease = githubReleases.FirstOrDefault(r => !r.Prerelease); if (githubRelease is null) { logger.LogWarning("{Owner}/{Name}: no GitHub release found, skipping", owner, name); @@ -44,7 +44,7 @@ public class SyncService( } var forgejoReleases = await forgejoService.FetchRepoReleasesAsync(owner, name, token); - var forgejoRelease = forgejoReleases.LastOrDefault(r => !r.Prerelease); + var forgejoRelease = forgejoReleases.FirstOrDefault(r => !r.Prerelease); var releaseId = await ResolveReleaseIdAsync(owner, name, githubRelease, forgejoRelease, token);