// 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();
}
}
}
}