Skip to content

Commit 43fd294

Browse files
authored
Add cache headers to document URLs endpoint (#3766)
1 parent 1bbe001 commit 43fd294

File tree

2 files changed

+42
-8
lines changed

2 files changed

+42
-8
lines changed

src/Swashbuckle.AspNetCore.SwaggerUI/SwaggerUIMiddleware.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -159,14 +159,6 @@ private async Task RespondWithFile(
159159

160160
await response.WriteAsync(text, Encoding.UTF8, cancellationToken);
161161
}
162-
163-
static string HashText(string text)
164-
{
165-
var buffer = Encoding.UTF8.GetBytes(text);
166-
var hash = SHA1.HashData(buffer);
167-
168-
return Convert.ToBase64String(hash);
169-
}
170162
}
171163

172164
[UnconditionalSuppressMessage(
@@ -192,9 +184,20 @@ private async Task RespondWithDocumentUrls(HttpResponse response)
192184

193185
json ??= JsonSerializer.Serialize(_options.ConfigObject, _jsonSerializerOptions);
194186

187+
var etag = HashText(json);
188+
SetHeaders(response, _options, etag);
189+
195190
await response.WriteAsync(json, Encoding.UTF8);
196191
}
197192

193+
private static string HashText(string text)
194+
{
195+
var buffer = Encoding.UTF8.GetBytes(text);
196+
var hash = SHA1.HashData(buffer);
197+
198+
return Convert.ToBase64String(hash);
199+
}
200+
198201
[UnconditionalSuppressMessage(
199202
"AOT",
200203
"IL2026:RequiresUnreferencedCode",

test/Swashbuckle.AspNetCore.IntegrationTests/SwaggerUIIntegrationTests.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,4 +381,35 @@ public async Task SwaggerUIMiddleware_Returns_ExpectedAssetContents_NotModified(
381381
using var stream = await cached.Content.ReadAsStreamAsync(cancellationToken);
382382
Assert.Equal(0, stream.Length);
383383
}
384+
385+
[Fact]
386+
public async Task DocumentUrlsEndpoint_ReturnsJsonWithCacheHeaders()
387+
{
388+
// Arrange
389+
var cancellationToken = TestContext.Current.CancellationToken;
390+
391+
var site = new TestSite(typeof(MultipleVersions.Startup), outputHelper);
392+
using var client = site.BuildClient();
393+
394+
// Act
395+
using var response = await client.GetAsync("/swagger/documentUrls", cancellationToken);
396+
397+
// Assert
398+
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
399+
Assert.Equal("application/javascript; charset=utf-8", response.Content.Headers.ContentType.ToString());
400+
401+
var content = await response.Content.ReadAsStringAsync(cancellationToken);
402+
Assert.NotEmpty(content);
403+
Assert.Contains("Version 1.0", content);
404+
Assert.Contains("Version 2.0", content);
405+
406+
// Verify cache headers are set
407+
Assert.NotNull(response.Headers.ETag);
408+
Assert.True(response.Headers.ETag.IsWeak);
409+
Assert.NotEmpty(response.Headers.ETag.Tag);
410+
411+
Assert.NotNull(response.Headers.CacheControl);
412+
Assert.True(response.Headers.CacheControl.Private);
413+
Assert.Equal(TimeSpan.FromDays(7), response.Headers.CacheControl.MaxAge);
414+
}
384415
}

0 commit comments

Comments
 (0)