Skip to content

Commit 3d318ca

Browse files
committed
Fix bugs around case-sensitive document names
1 parent 37d01d2 commit 3d318ca

File tree

1 file changed

+17
-3
lines changed

1 file changed

+17
-3
lines changed

src/OpenApi/src/Services/OpenApiDocumentProvider.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,17 @@ internal sealed class OpenApiDocumentProvider(IServiceProvider serviceProvider)
2525
/// <param name="writer">A text writer associated with the document to write to.</param>
2626
public async Task GenerateAsync(string documentName, TextWriter writer)
2727
{
28+
// We need to retrieve the document name in a case-insensitive manner to support case-insensitive document name resolution.
29+
// The options are registered with a key equal to the document name, but in lowercase.
30+
// The options monitor's Get() method is case-sensitive, which doesn't work well for OpenAPI document names here,
31+
// as the document name is also used as the route to retrieve the document, so we need to ensure this is lowercased to achieve consistency with ASP.NET Core routing.
32+
// See OpenApiServiceCollectionExtensions.cs for more info.
33+
var lowercasedDocumentName = documentName.ToLowerInvariant();
34+
2835
var options = serviceProvider.GetRequiredService<IOptionsMonitor<OpenApiOptions>>();
29-
var namedOption = options.Get(documentName);
36+
var namedOption = options.Get(lowercasedDocumentName);
3037
var resolvedOpenApiVersion = namedOption.OpenApiVersion;
31-
await GenerateAsync(documentName, writer, resolvedOpenApiVersion);
38+
await GenerateAsync(lowercasedDocumentName, writer, resolvedOpenApiVersion);
3239
}
3340

3441
/// <summary>
@@ -40,10 +47,17 @@ public async Task GenerateAsync(string documentName, TextWriter writer)
4047
/// <param name="openApiSpecVersion">The OpenAPI specification version to use when serializing the document.</param>
4148
public async Task GenerateAsync(string documentName, TextWriter writer, OpenApiSpecVersion openApiSpecVersion)
4249
{
50+
// We need to retrieve the document name in a case-insensitive manner to support case-insensitive document name resolution.
51+
// The document service is registered with a key equal to the document name, but in lowercase.
52+
// The GetRequiredKeyedService() method is case-sensitive, which doesn't work well for OpenAPI document names here,
53+
// as the document name is also used as the route to retrieve the document, so we need to ensure this is lowercased to achieve consistency with ASP.NET Core routing.
54+
// See OpenApiServiceCollectionExtensions.cs for more info.
55+
var lowercasedDocumentName = documentName.ToLowerInvariant();
56+
4357
// Microsoft.OpenAPI does not provide async APIs for writing the JSON
4458
// document to a file. See https://github.com/microsoft/OpenAPI.NET/issues/421 for
4559
// more info.
46-
var targetDocumentService = serviceProvider.GetRequiredKeyedService<OpenApiDocumentService>(documentName);
60+
var targetDocumentService = serviceProvider.GetRequiredKeyedService<OpenApiDocumentService>(lowercasedDocumentName);
4761
using var scopedService = serviceProvider.CreateScope();
4862
var document = await targetDocumentService.GetOpenApiDocumentAsync(scopedService.ServiceProvider);
4963
var jsonWriter = new OpenApiJsonWriter(writer);

0 commit comments

Comments
 (0)