// Copyright Epic Games, Inc. All Rights Reserved. using System; using System.ComponentModel.DataAnnotations; using System.Net.Http; using Microsoft.Extensions.DependencyInjection; namespace EpicGames.Horde.Auth { /// /// Base class for configuring HTTP service clients /// public class HttpServiceClientOptions : IOAuthOptions, ITokenAuthOptions { /// /// Base address for http requests /// [Required] public Uri Url { get; set; } = null!; #region OAuth2 /// public Uri? AuthUrl { get; set; } /// public string GrantType { get; set; } = String.Empty; /// public string ClientId { get; set; } = String.Empty; /// public string ClientSecret { get; set; } = String.Empty; /// public string Scope { get; set; } = String.Empty; #endregion #region Bearer token /// public string Token { get; set; } = String.Empty; #endregion } internal static class AuthExtensions { public static void AddHttpClientWithAuth(this IServiceCollection services, Func getOptions) where TClient : class where TImplementation : class, TClient { services.AddScoped(); services.AddHttpClient(); services.AddScoped>(serviceProvider => serviceProvider.GetRequiredService().Create(getOptions(serviceProvider))); services.AddHttpClient((serviceProvider, client) => { HttpServiceClientOptions options = getOptions(serviceProvider); client.BaseAddress = options.Url; }) .ConfigurePrimaryHttpMessageHandler(serviceProvider => { HttpServiceClientOptions options = getOptions(serviceProvider); return CreateMessageHandler(serviceProvider, options); }); } static HttpMessageHandler CreateMessageHandler(IServiceProvider serviceProvider, HttpServiceClientOptions options) { if (options.AuthUrl != null) { return serviceProvider.GetRequiredService>(); } else if (!String.IsNullOrEmpty(options.Token)) { return new TokenHandler(options); } else { return new HttpClientHandler(); } } } }