Does this work?

This commit is contained in:
defnotken
2026-01-15 13:03:49 -06:00
parent e8c56bb3bc
commit 134268c422
3 changed files with 55 additions and 2 deletions

View File

@@ -20,13 +20,14 @@ public class ShardServerFilesController : ControllerBase
[AllowAnonymous]
public async Task<IActionResult> DownloadFileDirect(string hash, [FromQuery] long expires, [FromQuery] string signature)
{
var result = await _cdnDownloadsService.GetDownloadAsync(hash, expires, signature).ConfigureAwait(false);
var result = _cdnDownloadsService.GetDownloadWithCacheCheck(hash, expires, signature);
return result.Status switch
{
CDNDownloadsService.ResultStatus.Disabled => NotFound(),
CDNDownloadsService.ResultStatus.Unauthorized => Unauthorized(),
CDNDownloadsService.ResultStatus.NotFound => NotFound(),
CDNDownloadsService.ResultStatus.Downloading => StatusCode(503),
CDNDownloadsService.ResultStatus.Success => PhysicalFile(result.File!.FullName, "application/octet-stream"),
_ => NotFound()
};

View File

@@ -10,7 +10,8 @@ public class CDNDownloadsService
Disabled,
Unauthorized,
NotFound,
Success
Success,
Downloading
}
public readonly record struct Result(ResultStatus Status, FileInfo? File);
@@ -53,4 +54,32 @@ public class CDNDownloadsService
return new Result(ResultStatus.Success, fileInfo);
}
public Result GetDownloadWithCacheCheck(string hash, long expiresUnixSeconds, string signature)
{
if (!_cdnDownloadUrlService.DirectDownloadsEnabled)
{
return new Result(ResultStatus.Disabled, null);
}
if (string.IsNullOrEmpty(signature) || string.IsNullOrEmpty(hash))
{
return new Result(ResultStatus.Unauthorized, null);
}
hash = hash.ToUpperInvariant();
if (!_cdnDownloadUrlService.TryValidateSignature(hash, expiresUnixSeconds, signature))
{
return new Result(ResultStatus.Unauthorized, null);
}
var fileInfo = _cachedFileProvider.TryGetLocalFileInfo(hash);
if (fileInfo == null)
{
return new Result(ResultStatus.Downloading, null);
}
return new Result(ResultStatus.Success, fileInfo);
}
}

View File

@@ -219,4 +219,27 @@ public sealed class CachedFileProvider : IDisposable
{
return hashes.Exists(_currentTransfers.Keys.Contains);
}
public FileInfo? TryGetLocalFileInfo(string hash)
{
var fi = FilePathUtil.GetFileInfoForHash(_hotStoragePath, hash);
if (fi != null)
{
return GetLocalFilePath(hash);
}
_ = Task.Run(async () =>
{
try
{
await DownloadFileWhenRequired(hash).ConfigureAwait(false);
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Download failed for {hash}", hash);
}
});
return null;
}
}