Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions src/Swashbuckle.AspNetCore.SwaggerUI/SwaggerUIMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -159,14 +159,6 @@ private async Task RespondWithFile(

await response.WriteAsync(text, Encoding.UTF8, cancellationToken);
}

static string HashText(string text)
{
var buffer = Encoding.UTF8.GetBytes(text);
var hash = SHA1.HashData(buffer);

return Convert.ToBase64String(hash);
}
}

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

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

var etag = HashText(json);
SetHeaders(response, _options, etag);

await response.WriteAsync(json, Encoding.UTF8);
}

private static string HashText(string text)
{
var buffer = Encoding.UTF8.GetBytes(text);
var hash = SHA1.HashData(buffer);

return Convert.ToBase64String(hash);
}

[UnconditionalSuppressMessage(
"AOT",
"IL2026:RequiresUnreferencedCode",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -381,4 +381,35 @@ public async Task SwaggerUIMiddleware_Returns_ExpectedAssetContents_NotModified(
using var stream = await cached.Content.ReadAsStreamAsync(cancellationToken);
Assert.Equal(0, stream.Length);
}

[Fact]
public async Task DocumentUrlsEndpoint_ReturnsJsonWithCacheHeaders()
{
// Arrange
var cancellationToken = TestContext.Current.CancellationToken;

var site = new TestSite(typeof(MultipleVersions.Startup), outputHelper);
using var client = site.BuildClient();

// Act
using var response = await client.GetAsync("/swagger/documentUrls", cancellationToken);

// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
Assert.Equal("application/javascript; charset=utf-8", response.Content.Headers.ContentType.ToString());

var content = await response.Content.ReadAsStringAsync(cancellationToken);
Assert.NotEmpty(content);
Assert.Contains("Version 1.0", content);
Assert.Contains("Version 2.0", content);

// Verify cache headers are set
Assert.NotNull(response.Headers.ETag);
Assert.True(response.Headers.ETag.IsWeak);
Assert.NotEmpty(response.Headers.ETag.Tag);

Assert.NotNull(response.Headers.CacheControl);
Assert.True(response.Headers.CacheControl.Private);
Assert.Equal(TimeSpan.FromDays(7), response.Headers.CacheControl.MaxAge);
Comment thread
martincostello marked this conversation as resolved.
}
}
Loading