Skip to content

Commit f45eea8

Browse files
committed
Merge branch 'feature/267' into develop
2 parents f237e68 + ec22576 commit f45eea8

File tree

11 files changed

+135
-20
lines changed

11 files changed

+135
-20
lines changed

src/Simplify.Web.Tests/StaticFiles/Handlers/CachedFileHandlerTests.cs renamed to src/Simplify.Web.Tests/StaticFiles/Handlers/ClientCachedFileHandlerTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
namespace Simplify.Web.Tests.StaticFiles.Handlers;
1111

1212
[TestFixture]
13-
public class CachedFileHandlerTests
13+
public class ClientCachedFileHandlerTests
1414
{
15-
private CachedFileHandler _handler = null!;
15+
private ClientCachedFileHandler _handler = null!;
1616

1717
[SetUp]
18-
public void Initialize() => _handler = new CachedFileHandler();
18+
public void Initialize() => _handler = new ClientCachedFileHandler();
1919

2020
[Test]
2121
public void CanHandle_CanBeCached_True()

src/Simplify.Web/Bootstrapper/Setup/BaseBootstrapperStaticFiles.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,19 @@ public virtual void RegisterStaticFileRequestHandlingPipelineHandlers()
6464
if (TypesToExclude.Contains(typeof(IReadOnlyList<IStaticFileRequestHandler>)))
6565
return;
6666

67-
BootstrapperFactory.ContainerProvider.Register<IReadOnlyList<IStaticFileRequestHandler>>(r =>
68-
[
69-
new CachedFileHandler(),
70-
new NewFileHandler(r.Resolve<IResponseWriter>(), r.Resolve<IStaticFile>())
71-
], LifetimeType.Singleton);
67+
BootstrapperFactory.ContainerProvider.Register(r =>
68+
{
69+
IList<IStaticFileRequestHandler> handlers =
70+
[
71+
new ClientCachedFileHandler()
72+
];
73+
74+
if (r.Resolve<ISimplifyWebSettings>().StaticFilesMemoryCache)
75+
handlers.Add(new InMemoryFilesCacheHandler(r.Resolve<IResponseWriter>(), r.Resolve<IStaticFile>()));
76+
else
77+
handlers.Add(new NewFileHandler(r.Resolve<IResponseWriter>(), r.Resolve<IStaticFile>()));
78+
79+
return (IReadOnlyList<IStaticFileRequestHandler>)handlers;
80+
}, LifetimeType.Singleton);
7281
}
7382
}

src/Simplify.Web/Settings/ISimplifyWebSettings.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,14 @@ public interface ISimplifyWebSettings
151151
/// </value>
152152
bool StringTableMemoryCache { get; }
153153

154+
/// <summary>
155+
/// Gets the value indicating whether static files memory cache enabled or disabled.
156+
/// </summary>
157+
/// <value>
158+
/// <c>true</c> if static files memory cache is enabled; otherwise, <c>false</c>.
159+
/// </value>
160+
bool StaticFilesMemoryCache { get; }
161+
154162
/// <summary>
155163
/// Gets the value indicating whether file reader caching should be disabled.
156164
/// </summary>

src/Simplify.Web/Settings/SimplifyWebSettings.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,14 @@ public SimplifyWebSettings(IConfiguration configuration)
177177
/// </value>
178178
public bool StringTableMemoryCache { get; private set; }
179179

180+
/// <summary>
181+
/// Gets the value indicating whether static files memory cache enabled or disabled.
182+
/// </summary>
183+
/// <value>
184+
/// <c>true</c> if static files memory cache is enabled; otherwise, <c>false</c>.
185+
/// </value>
186+
public bool StaticFilesMemoryCache { get; private set; }
187+
180188
/// <summary>
181189
/// Gets the value indicating whether file reader caching should be disabled.
182190
/// </summary>
@@ -263,6 +271,7 @@ private void LoadCacheSettings(IConfiguration config)
263271
{
264272
TemplatesMemoryCache = config.GetValue<bool>(nameof(TemplatesMemoryCache));
265273
StringTableMemoryCache = config.GetValue<bool>(nameof(StringTableMemoryCache));
274+
StaticFilesMemoryCache = config.GetValue<bool>(nameof(StaticFilesMemoryCache));
266275
DisableFileReaderCache = config.GetValue<bool>(nameof(DisableFileReaderCache));
267276
}
268277

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System.Collections.Concurrent;
2+
3+
namespace Simplify.Web.StaticFiles.Cache;
4+
5+
/// <summary>
6+
/// Provides static files in-memory cache.
7+
/// </summary>
8+
public static class FilesInMemoryCache
9+
{
10+
// /// <summary>
11+
// /// Gets the static files in-memory cache data.
12+
// /// </summary>
13+
// /// <value>
14+
// /// The static files in-memory cache data..
15+
// /// </value>
16+
// public static IDictionary<string, byte[]> Data { get; set; } = new Dictionary<string, byte[]>();
17+
18+
/// <summary>
19+
/// Gets the static files in-memory cache data.
20+
/// </summary>
21+
public static readonly ConcurrentDictionary<string, byte[]> Items = new();
22+
}

src/Simplify.Web/StaticFiles/Handlers/CachedFileHandler.cs renamed to src/Simplify.Web/StaticFiles/Handlers/ClientCachedFileHandler.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
namespace Simplify.Web.StaticFiles.Handlers;
99

1010
/// <summary>
11-
/// Provides the cached file handler.
11+
/// Provides the cached on client side files handler.
1212
/// </summary>
1313
/// <seealso cref="IStaticFileRequestHandler" />
14-
public class CachedFileHandler : IStaticFileRequestHandler
14+
public class ClientCachedFileHandler : IStaticFileRequestHandler
1515
{
1616
/// <summary>
1717
/// Determines whether this handler can handle the file requested.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using System.Threading.Tasks;
2+
using Microsoft.AspNetCore.Http;
3+
using Simplify.Web.Http.ResponseWriting;
4+
using Simplify.Web.StaticFiles.Cache;
5+
using Simplify.Web.StaticFiles.Context;
6+
using Simplify.Web.StaticFiles.IO;
7+
8+
namespace Simplify.Web.StaticFiles.Handlers;
9+
10+
/// <summary>
11+
/// Provides the in-memory files cache.
12+
/// </summary>
13+
/// <seealso cref="IStaticFileRequestHandler" />
14+
public class InMemoryFilesCacheHandler(IResponseWriter responseWriter, IStaticFile staticFile) : IStaticFileRequestHandler
15+
{
16+
/// <summary>
17+
/// Determines whether this handler can handle the file requested.
18+
/// </summary>
19+
/// <param name="context">The context.</param>
20+
/// <returns>
21+
/// <c>true</c> if this handler can handle the file requested; otherwise, <c>false</c>.
22+
/// </returns>
23+
public bool CanHandle(IStaticFileProcessingContext context) => !context.CanBeCached;
24+
25+
/// <summary>
26+
/// Executes the handler asynchronously.
27+
/// </summary>
28+
/// <param name="context">The context.</param>
29+
/// <param name="response">The response.</param>
30+
public async Task ExecuteAsync(IStaticFileProcessingContext context, HttpResponse response)
31+
{
32+
response.SetNewReturningFileAttributes(context);
33+
34+
await responseWriter.WriteAsync(response, FilesInMemoryCache.Items.GetOrAdd(context.RelativeFilePath, staticFile.GetData));
35+
}
36+
}

src/Simplify.Web/StaticFiles/Handlers/NewFileHandler.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
using System;
21
using System.Threading.Tasks;
32
using Microsoft.AspNetCore.Http;
4-
using Simplify.System;
5-
using Simplify.Web.Http.Mime;
6-
using Simplify.Web.Http.ResponseTime;
73
using Simplify.Web.Http.ResponseWriting;
84
using Simplify.Web.StaticFiles.Context;
95
using Simplify.Web.StaticFiles.IO;
@@ -32,9 +28,7 @@ public class NewFileHandler(IResponseWriter responseWriter, IStaticFile staticFi
3228
/// <param name="response">The response.</param>
3329
public async Task ExecuteAsync(IStaticFileProcessingContext context, HttpResponse response)
3430
{
35-
response.SetContentMimeType(context.RelativeFilePath);
36-
response.SetLastModifiedTime(context.LastModificationTime);
37-
response.Headers["Expires"] = new DateTimeOffset(TimeProvider.Current.Now.AddYears(1)).ToString("R");
31+
response.SetNewReturningFileAttributes(context);
3832

3933
await responseWriter.WriteAsync(response, await staticFile.GetDataAsync(context.RelativeFilePath));
4034
}

src/Simplify.Web/StaticFiles/IO/IStaticFile.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,14 @@ public interface IStaticFile
2121
DateTime GetLastModificationTime(string relativeFilePath);
2222

2323
/// <summary>
24-
/// Gets the file data.
24+
/// Gets the file data asynchronously.
2525
/// </summary>
2626
/// <param name="relativeFilePath">The relative file path.</param>
27-
/// <returns></returns>
2827
Task<byte[]> GetDataAsync(string relativeFilePath);
28+
29+
/// <summary>
30+
/// Gets the file data.
31+
/// </summary>
32+
/// <param name="relativeFilePath">The relative file path.</param>
33+
byte[] GetData(string relativeFilePath);
2934
}

src/Simplify.Web/StaticFiles/IO/StaticFile.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public bool IsValidPath(string relativeFilePath)
3838
public DateTime GetLastModificationTime(string relativeFilePath) => File.GetLastWriteTimeUtc(sitePhysicalPath + relativeFilePath).TrimMilliseconds();
3939

4040
/// <summary>
41-
/// Gets the file data.
41+
/// Gets the file data asynchronously.
4242
/// </summary>
4343
/// <param name="relativeFilePath">The relative file path.</param>
4444
public async Task<byte[]> GetDataAsync(string relativeFilePath)
@@ -59,4 +59,10 @@ public async Task<byte[]> GetDataAsync(string relativeFilePath)
5959

6060
return result;
6161
}
62+
63+
/// <summary>
64+
/// Gets the file data.
65+
/// </summary>
66+
/// <param name="relativeFilePath">The relative file path.</param>
67+
public byte[] GetData(string relativeFilePath) => File.ReadAllBytes(relativeFilePath);
6268
}

0 commit comments

Comments
 (0)