diff --git a/MareSynchronosServer/MareSynchronosShared/Utils/StaticFilesServerConfiguration.cs b/MareSynchronosServer/MareSynchronosShared/Utils/StaticFilesServerConfiguration.cs index eb053e2..996a503 100644 --- a/MareSynchronosServer/MareSynchronosShared/Utils/StaticFilesServerConfiguration.cs +++ b/MareSynchronosServer/MareSynchronosShared/Utils/StaticFilesServerConfiguration.cs @@ -34,6 +34,8 @@ public class StaticFilesServerConfiguration : MareConfigurationBase public bool UseXAccelRedirect { get; set; } = false; public string XAccelRedirectPrefix { get; set; } = "/_internal/mare-files/"; + public bool UseSSI { get; set; } = false; + public string SSIContentType { get; set; } = "application/x-block-file-list"; public override string ToString() { diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResult.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResult.cs index 61e06dd..54420cf 100644 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResult.cs +++ b/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResult.cs @@ -1,4 +1,5 @@ using MareSynchronosShared.Metrics; +using MareSynchronosShared.Services; using MareSynchronosStaticFilesServer.Services; using Microsoft.AspNetCore.Mvc; using System.Globalization; @@ -12,14 +13,17 @@ public class RequestBlockFileListResult : IActionResult private readonly RequestQueueService _requestQueueService; private readonly MareMetrics _mareMetrics; private readonly IEnumerable _fileList; + private readonly IConfigurationService _configurationService; - public RequestBlockFileListResult(Guid requestId, RequestQueueService requestQueueService, MareMetrics mareMetrics, IEnumerable fileList) + public RequestBlockFileListResult(Guid requestId, RequestQueueService requestQueueService, MareMetrics mareMetrics, IEnumerable fileList, + IConfigurationService configurationService) { _requestId = requestId; _requestQueueService = requestQueueService; _mareMetrics = mareMetrics; _mareMetrics.IncGauge(MetricsAPI.GaugeCurrentDownloads); _fileList = fileList; + _configurationService = configurationService; } public async Task ExecuteResultAsync(ActionContext context) @@ -28,13 +32,34 @@ public class RequestBlockFileListResult : IActionResult { ArgumentNullException.ThrowIfNull(context); + var useSSI = _configurationService.GetValueOrDefault(nameof(StaticFilesServerConfiguration.UseSSI), false); + context.HttpContext.Response.StatusCode = 200; - context.HttpContext.Response.ContentType = "application/octet-stream"; + + if (useSSI) + context.HttpContext.Response.ContentType = _configurationService.GetValue(nameof(StaticFilesServerConfiguration.SSIContentType)); + else + context.HttpContext.Response.ContentType = "application/octet-stream"; + + string ssiFilePrefix = null; + + if (useSSI) + ssiFilePrefix = _configurationService.GetValue(nameof(StaticFilesServerConfiguration.XAccelRedirectPrefix)); foreach (var file in _fileList) { - await context.HttpContext.Response.WriteAsync("#" + file.Name + ":" + file.Length.ToString(CultureInfo.InvariantCulture) + "#", Encoding.ASCII); - await context.HttpContext.Response.SendFileAsync(file.FullName); + if (useSSI) + { + var internalName = Path.Combine(ssiFilePrefix, file.Name); + await context.HttpContext.Response.WriteAsync( + "#" + file.Name + ":" + file.Length.ToString(CultureInfo.InvariantCulture) + "#" + + "", Encoding.ASCII); + } + else + { + await context.HttpContext.Response.WriteAsync("#" + file.Name + ":" + file.Length.ToString(CultureInfo.InvariantCulture) + "#", Encoding.ASCII); + await context.HttpContext.Response.SendFileAsync(file.FullName); + } } } catch diff --git a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResultFactory.cs b/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResultFactory.cs index 7779331..3cd35d2 100644 --- a/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResultFactory.cs +++ b/MareSynchronosServer/MareSynchronosStaticFilesServer/Utils/RequestBlockFileListResultFactory.cs @@ -19,6 +19,6 @@ public class RequestBlockFileListResultFactory public RequestBlockFileListResult Create(Guid requestId, IEnumerable fileList) { - return new RequestBlockFileListResult(requestId, _requestQueueService, _metrics, fileList); + return new RequestBlockFileListResult(requestId, _requestQueueService, _metrics, fileList, _configurationService); } } \ No newline at end of file