using LightlessSyncShared.Metrics; using LightlessSyncStaticFilesServer.Services; using Microsoft.AspNetCore.Mvc; namespace LightlessSyncStaticFilesServer.Utils; public class RequestFileStreamResult : FileStreamResult { private readonly Guid _requestId; private readonly RequestQueueService _requestQueueService; private readonly LightlessMetrics _lightlessMetrics; public RequestFileStreamResult(Guid requestId, RequestQueueService requestQueueService, LightlessMetrics lightlessMetrics, Stream fileStream, string contentType) : base(fileStream, contentType) { _requestId = requestId; _requestQueueService = requestQueueService; _lightlessMetrics = lightlessMetrics; _lightlessMetrics.IncGauge(MetricsAPI.GaugeCurrentDownloads); } public override void ExecuteResult(ActionContext context) { try { base.ExecuteResult(context); } catch { throw; } finally { _requestQueueService.FinishRequest(_requestId); _lightlessMetrics.DecGauge(MetricsAPI.GaugeCurrentDownloads); FileStream?.Dispose(); } } public override async Task ExecuteResultAsync(ActionContext context) { try { await base.ExecuteResultAsync(context).ConfigureAwait(false); } catch { throw; } finally { _requestQueueService.FinishRequest(_requestId); _lightlessMetrics.DecGauge(MetricsAPI.GaugeCurrentDownloads); FileStream?.Dispose(); } } }