You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.3 KiB
73 lines
2.3 KiB
using System;
|
|
using System.Net;
|
|
using NLog;
|
|
using NzbDrone.Common.Http;
|
|
|
|
namespace NzbDrone.Core.Http
|
|
{
|
|
public interface ICachedHttpResponseService
|
|
{
|
|
HttpResponse Get(HttpRequest request, bool useCache, TimeSpan ttl);
|
|
HttpResponse<T> Get<T>(HttpRequest request, bool useCache, TimeSpan ttl)
|
|
where T : new();
|
|
}
|
|
|
|
public class CachedHttpResponseService : ICachedHttpResponseService
|
|
{
|
|
private readonly ICachedHttpResponseRepository _repo;
|
|
private readonly IHttpClient _httpClient;
|
|
private readonly Logger _logger;
|
|
|
|
public CachedHttpResponseService(ICachedHttpResponseRepository httpResponseRepository,
|
|
IHttpClient httpClient,
|
|
Logger logger)
|
|
{
|
|
_repo = httpResponseRepository;
|
|
_httpClient = httpClient;
|
|
_logger = logger;
|
|
}
|
|
|
|
public HttpResponse Get(HttpRequest request, bool useCache, TimeSpan ttl)
|
|
{
|
|
var cached = _repo.FindByUrl(request.Url.ToString());
|
|
|
|
if (useCache && cached != null && cached.Expiry > DateTime.UtcNow)
|
|
{
|
|
_logger.Trace($"Returning cached response for [GET] {request.Url}");
|
|
return new HttpResponse(request, new HttpHeader(), cached.Value, (HttpStatusCode)cached.StatusCode);
|
|
}
|
|
|
|
var result = _httpClient.Get(request);
|
|
|
|
if (!result.HasHttpError)
|
|
{
|
|
if (cached == null)
|
|
{
|
|
cached = new CachedHttpResponse
|
|
{
|
|
Url = request.Url.ToString(),
|
|
};
|
|
}
|
|
|
|
var now = DateTime.UtcNow;
|
|
|
|
cached.LastRefresh = now;
|
|
cached.Expiry = now.Add(ttl);
|
|
cached.Value = result.Content;
|
|
cached.StatusCode = (int)result.StatusCode;
|
|
|
|
_repo.Upsert(cached);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public HttpResponse<T> Get<T>(HttpRequest request, bool useCache, TimeSpan ttl)
|
|
where T : new()
|
|
{
|
|
var response = Get(request, useCache, ttl);
|
|
return new HttpResponse<T>(response);
|
|
}
|
|
}
|
|
}
|