Skip to content

Commit 1ec0f7e

Browse files
committed
Merge branch 'develop'
2 parents c709360 + 0cd6feb commit 1ec0f7e

File tree

14 files changed

+151
-25
lines changed

14 files changed

+151
-25
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/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# Changelog
22

3+
## [5.1.0] - 2024-07-28
4+
5+
### Added
6+
7+
- Static files in-memory cache (#267)
8+
9+
### Fixed
10+
11+
- Web context is not available on WriteErrorResponseAsync causing NRE
12+
313
## [5.0.0] - 2024-06-05
414

515
### Breaking

src/Simplify.Web/Middleware/SimplifyWebRequestMiddleware.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using Simplify.Web.Diagnostics.Measurements;
88
using Simplify.Web.Diagnostics.Trace;
99
using Simplify.Web.Modules;
10-
using Simplify.Web.Modules.Context;
1110
using Simplify.Web.RequestHandling;
1211
using Simplify.Web.Settings;
1312

@@ -86,12 +85,12 @@ internal static bool ProcessOnException(Exception e)
8685

8786
private static async Task WriteErrorResponseAsync(this HttpContext context, ILifetimeScope scope, Exception e)
8887
{
89-
var webContext = scope.Resolver.Resolve<IWebContextProvider>().Get();
88+
var isAjax = context.Request.Headers.ContainsKey("X-Requested-With");
9089

91-
if (webContext.IsAjax)
90+
if (isAjax)
9291
context.Response.ContentType = "text/plain";
9392

94-
await context.Response.WriteAsync(scope.GenerateErrorResponse(e, webContext.IsAjax));
93+
await context.Response.WriteAsync(scope.GenerateErrorResponse(e, isAjax));
9594
}
9695

9796
private static string GenerateErrorResponse(this ILifetimeScope scope, Exception e, bool minimalStyle)

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

src/Simplify.Web/Simplify.Web.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
1010
<GenerateDocumentationFile>true</GenerateDocumentationFile>
1111

12-
<Version>5.0</Version>
12+
<Version>5.1</Version>
1313

1414
<Authors>Simplify community</Authors>
1515
<Product>Simplify</Product>
@@ -19,6 +19,7 @@
1919
<PackageProjectUrl>https://web.simplifynet.dev</PackageProjectUrl>
2020
<PackageIcon>icon.png</PackageIcon>
2121
<PublishRepositoryUrl>true</PublishRepositoryUrl>
22+
<PackageReadmeFile>README.md</PackageReadmeFile>
2223
<PackageTags>.NET web-framework MVC DI OWIN</PackageTags>
2324

2425
<PackageReleaseNotes>See https://github.com/SimplifyNet/Simplify.Web/tree/master/src/Simplify.Web/CHANGELOG.md for details</PackageReleaseNotes>
@@ -50,5 +51,6 @@
5051
<None Include="..\..\images\icon.png" Pack="true" Visible="false" PackagePath="" />
5152
<None Include="CHANGELOG.md" Pack="true" PackagePath="\" />
5253
<None Include="..\..\LICENSE.txt" Pack="true" PackagePath="\" />
54+
<None Include="..\..\README.md" Pack="true" PackagePath="\" />
5355
</ItemGroup>
5456
</Project>
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+
}

0 commit comments

Comments
 (0)