From b3989048c1a5d0fcab1139baa6eff82231cf06eb Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 3 Mar 2022 21:47:34 +0100 Subject: [PATCH] Improve and fix etags. --- .../Pipeline/CachingKeysMiddleware.cs | 4 +-- .../Contents/ContentsController.cs | 2 -- .../Pipeline/CachingKeysMiddlewareTests.cs | 26 ++++++++++++++++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/backend/src/Squidex.Web/Pipeline/CachingKeysMiddleware.cs b/backend/src/Squidex.Web/Pipeline/CachingKeysMiddleware.cs index c54446ace..b7bd0ff34 100644 --- a/backend/src/Squidex.Web/Pipeline/CachingKeysMiddleware.cs +++ b/backend/src/Squidex.Web/Pipeline/CachingKeysMiddleware.cs @@ -36,6 +36,8 @@ namespace Squidex.Web.Pipeline { var httpContext = (HttpContext)_; + cachingManager.Finish(httpContext); + if (httpContext.Response.Headers.TryGetString(HeaderNames.ETag, out var etag)) { if (!cachingOptions.StrongETag && !ETagUtils.IsWeakEtag(etag)) @@ -44,8 +46,6 @@ namespace Squidex.Web.Pipeline } } - cachingManager.Finish(httpContext); - return Task.CompletedTask; }, context); diff --git a/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs b/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs index 22baaff9b..cc117451d 100644 --- a/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs +++ b/backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs @@ -212,8 +212,6 @@ namespace Squidex.Areas.Api.Controllers.Contents return ContentDto.FromContent(content, Resources); }); - Response.Headers[HeaderNames.ETag] = content.ToEtag(); - return Ok(response); } diff --git a/backend/tests/Squidex.Web.Tests/Pipeline/CachingKeysMiddlewareTests.cs b/backend/tests/Squidex.Web.Tests/Pipeline/CachingKeysMiddlewareTests.cs index 73d78016f..e1d4b9f06 100644 --- a/backend/tests/Squidex.Web.Tests/Pipeline/CachingKeysMiddlewareTests.cs +++ b/backend/tests/Squidex.Web.Tests/Pipeline/CachingKeysMiddlewareTests.cs @@ -306,7 +306,31 @@ namespace Squidex.Web.Pipeline cachingManager.AddDependency(12); }); - Assert.True(httpContext.Response.Headers[HeaderNames.ETag].ToString().Length > 20); + var etag = httpContext.Response.Headers[HeaderNames.ETag].ToString(); + + Assert.StartsWith("W/", etag, StringComparison.Ordinal); + Assert.True(etag.Length > 20); + } + + [Fact] + public async Task Should_generate_strong_etag_from_ids_and_versions() + { + var id1 = DomainId.NewGuid(); + var id2 = DomainId.NewGuid(); + + cachingOptions.StrongETag = true; + + await MakeRequestAsync(() => + { + cachingManager.AddDependency(id1, 12); + cachingManager.AddDependency(id2, 12); + cachingManager.AddDependency(12); + }); + + var etag = httpContext.Response.Headers[HeaderNames.ETag].ToString(); + + Assert.False(etag.StartsWith("W/", StringComparison.Ordinal)); + Assert.True(etag.Length > 20); } [Fact]