Use HttpClientFactory for coinaverage

This commit is contained in:
nicolas.dorier
2018-08-21 14:33:13 +09:00
parent 9c30476fc8
commit 8728356698
4 changed files with 25 additions and 6 deletions

View File

@@ -1711,7 +1711,7 @@ namespace BTCPayServer.Tests
private static BTCPayRateProviderFactory CreateBTCPayRateFactory(BTCPayNetworkProvider provider) private static BTCPayRateProviderFactory CreateBTCPayRateFactory(BTCPayNetworkProvider provider)
{ {
return new BTCPayRateProviderFactory(new MemoryCacheOptions() { ExpirationScanFrequency = TimeSpan.FromSeconds(1.0) }, provider, new CoinAverageSettings()); return new BTCPayRateProviderFactory(new MemoryCacheOptions() { ExpirationScanFrequency = TimeSpan.FromSeconds(1.0) }, null, provider, new CoinAverageSettings());
} }
[Fact] [Fact]

View File

@@ -53,6 +53,7 @@ namespace BTCPayServer.Hosting
var factory = provider.GetRequiredService<ApplicationDbContextFactory>(); var factory = provider.GetRequiredService<ApplicationDbContextFactory>();
factory.ConfigureBuilder(o); factory.ConfigureBuilder(o);
}); });
services.AddHttpClient();
services.TryAddSingleton<SettingsRepository>(); services.TryAddSingleton<SettingsRepository>();
services.TryAddSingleton<InvoicePaymentNotification>(); services.TryAddSingleton<InvoicePaymentNotification>();
services.TryAddSingleton<BTCPayServerOptions>(o => o.GetRequiredService<IOptions<BTCPayServerOptions>>().Value); services.TryAddSingleton<BTCPayServerOptions>(o => o.GetRequiredService<IOptions<BTCPayServerOptions>>().Value);

View File

@@ -36,6 +36,8 @@ namespace BTCPayServer.Services.Rates
} }
IMemoryCache _Cache; IMemoryCache _Cache;
private IOptions<MemoryCacheOptions> _CacheOptions; private IOptions<MemoryCacheOptions> _CacheOptions;
private readonly IHttpClientFactory _httpClientFactory;
public IMemoryCache Cache public IMemoryCache Cache
{ {
get get
@@ -45,6 +47,7 @@ namespace BTCPayServer.Services.Rates
} }
CoinAverageSettings _CoinAverageSettings; CoinAverageSettings _CoinAverageSettings;
public BTCPayRateProviderFactory(IOptions<MemoryCacheOptions> cacheOptions, public BTCPayRateProviderFactory(IOptions<MemoryCacheOptions> cacheOptions,
IHttpClientFactory httpClientFactory,
BTCPayNetworkProvider btcpayNetworkProvider, BTCPayNetworkProvider btcpayNetworkProvider,
CoinAverageSettings coinAverageSettings) CoinAverageSettings coinAverageSettings)
{ {
@@ -53,6 +56,7 @@ namespace BTCPayServer.Services.Rates
_CoinAverageSettings = coinAverageSettings; _CoinAverageSettings = coinAverageSettings;
_Cache = new MemoryCache(cacheOptions); _Cache = new MemoryCache(cacheOptions);
_CacheOptions = cacheOptions; _CacheOptions = cacheOptions;
_httpClientFactory = httpClientFactory;
// We use 15 min because of limits with free version of bitcoinaverage // We use 15 min because of limits with free version of bitcoinaverage
CacheSpan = TimeSpan.FromMinutes(15.0); CacheSpan = TimeSpan.FromMinutes(15.0);
this.btcpayNetworkProvider = btcpayNetworkProvider; this.btcpayNetworkProvider = btcpayNetworkProvider;
@@ -73,7 +77,7 @@ namespace BTCPayServer.Services.Rates
// Handmade providers // Handmade providers
DirectProviders.Add("bitpay", new BitpayRateProvider(new NBitpayClient.Bitpay(new NBitcoin.Key(), new Uri("https://bitpay.com/")))); DirectProviders.Add("bitpay", new BitpayRateProvider(new NBitpayClient.Bitpay(new NBitcoin.Key(), new Uri("https://bitpay.com/"))));
DirectProviders.Add(QuadrigacxRateProvider.QuadrigacxName, new QuadrigacxRateProvider()); DirectProviders.Add(QuadrigacxRateProvider.QuadrigacxName, new QuadrigacxRateProvider());
DirectProviders.Add(CoinAverageRateProvider.CoinAverageName, new CoinAverageRateProvider() { Exchange = CoinAverageRateProvider.CoinAverageName, Authenticator = _CoinAverageSettings }); DirectProviders.Add(CoinAverageRateProvider.CoinAverageName, new CoinAverageRateProvider() { Exchange = CoinAverageRateProvider.CoinAverageName, HttpClient = _httpClientFactory?.CreateClient(), Authenticator = _CoinAverageSettings });
// Those exchanges make multiple requests when calling GetTickers so we remove them // Those exchanges make multiple requests when calling GetTickers so we remove them
//DirectProviders.Add("kraken", new ExchangeSharpRateProvider("kraken", new ExchangeKrakenAPI(), true)); //DirectProviders.Add("kraken", new ExchangeSharpRateProvider("kraken", new ExchangeKrakenAPI(), true));
@@ -194,6 +198,7 @@ namespace BTCPayServer.Services.Rates
providers.Add(new CoinAverageRateProvider() providers.Add(new CoinAverageRateProvider()
{ {
Exchange = exchangeName, Exchange = exchangeName,
HttpClient = _httpClientFactory?.CreateClient(),
Authenticator = _CoinAverageSettings Authenticator = _CoinAverageSettings
}); });
} }

View File

@@ -56,6 +56,19 @@ namespace BTCPayServer.Services.Rates
{ {
} }
public HttpClient HttpClient
{
get
{
return _LocalClient ?? _Client;
}
set
{
_LocalClient = null;
}
}
HttpClient _LocalClient;
static HttpClient _Client = new HttpClient(); static HttpClient _Client = new HttpClient();
public string Exchange { get; set; } = CoinAverageName; public string Exchange { get; set; } = CoinAverageName;
@@ -107,7 +120,7 @@ namespace BTCPayServer.Services.Rates
{ {
await auth.AddHeader(request); await auth.AddHeader(request);
} }
var resp = await _Client.SendAsync(request); var resp = await HttpClient.SendAsync(request);
using (resp) using (resp)
{ {
@@ -150,7 +163,7 @@ namespace BTCPayServer.Services.Rates
{ {
await auth.AddHeader(request); await auth.AddHeader(request);
} }
var resp = await _Client.SendAsync(request); var resp = await HttpClient.SendAsync(request);
resp.EnsureSuccessStatusCode(); resp.EnsureSuccessStatusCode();
} }
@@ -162,7 +175,7 @@ namespace BTCPayServer.Services.Rates
{ {
await auth.AddHeader(request); await auth.AddHeader(request);
} }
var resp = await _Client.SendAsync(request); var resp = await HttpClient.SendAsync(request);
resp.EnsureSuccessStatusCode(); resp.EnsureSuccessStatusCode();
var jobj = JObject.Parse(await resp.Content.ReadAsStringAsync()); var jobj = JObject.Parse(await resp.Content.ReadAsStringAsync());
var response = new GetRateLimitsResponse(); var response = new GetRateLimitsResponse();
@@ -193,7 +206,7 @@ namespace BTCPayServer.Services.Rates
{ {
await auth.AddHeader(request); await auth.AddHeader(request);
} }
var resp = await _Client.SendAsync(request); var resp = await HttpClient.SendAsync(request);
resp.EnsureSuccessStatusCode(); resp.EnsureSuccessStatusCode();
var jobj = JObject.Parse(await resp.Content.ReadAsStringAsync()); var jobj = JObject.Parse(await resp.Content.ReadAsStringAsync());
var response = new GetExchangeTickersResponse(); var response = new GetExchangeTickersResponse();