Skip to content

Commit 95cb16f

Browse files
committed
Prepare loader cache
1 parent bd659cf commit 95cb16f

File tree

5 files changed

+101
-6
lines changed

5 files changed

+101
-6
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Copyright (c) usercode
2+
// https://github.com/usercode/ImageWizard
3+
// MIT License
4+
5+
namespace ImageWizard.Core.Loaders;
6+
7+
/// <summary>
8+
/// ILoaderCacheKey
9+
/// </summary>
10+
public interface ILoaderCacheKey
11+
{
12+
/// <summary>
13+
/// Create
14+
/// </summary>
15+
string Create(string loaderType, string loaderSource);
16+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (c) usercode
2+
// https://github.com/usercode/ImageWizard
3+
// MIT License
4+
5+
namespace ImageWizard.Core.Loaders;
6+
7+
/// <summary>
8+
/// LoaderCacheKey
9+
/// </summary>
10+
public class LoaderCacheKey : ILoaderCacheKey
11+
{
12+
public string Create(string loaderType, string loaderSource)
13+
{
14+
string input = $"{loaderType}/{loaderSource}";
15+
16+
return input.CreateSHA256Hash();
17+
}
18+
}

src/ImageWizard.Core/Middlewares/ImageWizardApi.cs

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// MIT License
44

55
using ImageWizard.Caches;
6+
using ImageWizard.Core.Loaders;
67
using ImageWizard.Loaders;
78
using ImageWizard.Processing;
89
using ImageWizard.Processing.Results;
@@ -13,6 +14,7 @@
1314
using Microsoft.Extensions.Logging;
1415
using Microsoft.Extensions.Options;
1516
using Microsoft.Net.Http.Headers;
17+
using System.Buffers;
1618
using System.Globalization;
1719
using System.Text;
1820

@@ -35,6 +37,7 @@ public static async Task ExecuteAsync(
3537
ICacheKey cacheKey,
3638
ICacheHash cacheHash,
3739
ICacheLock cacheLock,
40+
ILoaderCacheKey loaderCacheKey,
3841
InterceptorInvoker interceptor,
3942
ImageWizardBuilder builder,
4043
string signature,
@@ -383,11 +386,11 @@ public static async Task ExecuteAsync(
383386
{
384387
responseHeaders.AppendList(
385388
HeaderNames.Vary,
386-
new[] {
389+
[
387390
ClientHints.DPRHeader,
388391
ClientHints.WidthHeader,
389392
ClientHints.ViewportWidthHeader
390-
});
393+
]);
391394

392395
//is image?
393396
if (cachedData.Metadata.Width != null)
@@ -443,4 +446,54 @@ public static async Task ExecuteAsync(
443446

444447
logger.LogTrace("Operation completed");
445448
}
449+
450+
private static async Task<LoaderResult> GetLoaderDataAsync(
451+
ILoaderCacheKey loaderCacheKey,
452+
ILoader loader,
453+
ICache cache,
454+
ImageWizardUrl url,
455+
CachedData? cachedData)
456+
{
457+
string loaderKey = loaderCacheKey.Create(url.LoaderType, url.LoaderSource);
458+
459+
CachedData? cacheResult = await cache.ReadAsync(loaderKey);
460+
461+
if (cacheResult != null)
462+
{
463+
//original data modified?
464+
if (cachedData != null && cachedData.Metadata.Cache.ETag == cachedData.Metadata.Cache.ETag)
465+
{
466+
return LoaderResult.NotModified();
467+
}
468+
469+
Stream stream = await cacheResult.OpenReadAsync();
470+
471+
return LoaderResult.Success(new OriginalData(cacheResult.Metadata.MimeType, stream));
472+
}
473+
474+
LoaderResult result = await loader.GetAsync(url.LoaderSource, cachedData);
475+
476+
if (result.State == LoaderResultState.Success && result.Result != null)
477+
{
478+
DateTime now = DateTime.UtcNow;
479+
480+
Metadata metadata = new Metadata()
481+
{
482+
Cache = result.Result.Cache,
483+
Created = now,
484+
LastAccess = now,
485+
Key = loaderKey,
486+
//Hash = hash,
487+
//Filters = url.Filters.Select(x => x.Fullname).ToArray(),
488+
LoaderSource = url.LoaderSource,
489+
LoaderType = url.LoaderType,
490+
MimeType = result.Result.MimeType,
491+
//FileLength = processingContext.Result.Data.Length
492+
};
493+
494+
await cache.WriteAsync(metadata, result.Result.Data);
495+
}
496+
497+
return result;
498+
}
446499
}

src/ImageWizard.Core/Middlewares/ImageWizardExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// MIT License
44

55
using ImageWizard.Caches;
6+
using ImageWizard.Core.Loaders;
67
using ImageWizard.Utils;
78
using Microsoft.AspNetCore.Builder;
89
using Microsoft.AspNetCore.Http;
@@ -84,6 +85,8 @@ public static IImageWizardBuilder AddImageWizard(this IServiceCollection service
8485
services.AddTransient<ICacheKey, SHA256CacheKey>();
8586
services.AddTransient<ICacheHash, SHA256CacheHash>();
8687

88+
services.AddTransient<ILoaderCacheKey, LoaderCacheKey>();
89+
8790
services.AddSingleton<IUrlSignature, HMACSHA256UrlSignature>();
8891

8992
services.AddTransient<InterceptorInvoker>();

src/ImageWizard.Core/Middlewares/ImageWizardOptions.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,19 @@ public class ImageWizardOptions : ImageWizardBaseOptions
3434
public bool UseETag { get; set; } = true;
3535

3636
/// <summary>
37-
/// Duration when the last-access time (metadata) should be refreshed.
37+
/// Use client hints. (Default: false)
3838
/// </summary>
39-
public TimeSpan? RefreshLastAccessInterval { get; set; } = TimeSpan.FromDays(1);
39+
public bool UseClientHints { get; set; } = false;
4040

4141
/// <summary>
42-
/// Use client hints. (Default: false)
42+
/// Use cache for original data. (Default: true)
4343
/// </summary>
44-
public bool UseClientHints { get; set; } = false;
44+
public bool UseLoaderCache { get; set; } = false;
45+
46+
/// <summary>
47+
/// Duration when the last-access time (metadata) should be refreshed.
48+
/// </summary>
49+
public TimeSpan? RefreshLastAccessInterval { get; set; } = TimeSpan.FromDays(1);
4550

4651
/// <summary>
4752
/// Allowed DPR values. (Default: 1.0, 1.5, 2.0, 3.0)

0 commit comments

Comments
 (0)