From 0440aa4459cedc411347e5cb9d8c22ca6d4f2b9a Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Mon, 18 Nov 2024 13:22:59 -0800 Subject: [PATCH 1/2] Don't through exception for parameters with custom binding source --- .../src/Services/OpenApiDocumentService.cs | 2 +- .../OpenApiDocumentServiceTests.Parameters.cs | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/OpenApi/src/Services/OpenApiDocumentService.cs b/src/OpenApi/src/Services/OpenApiDocumentService.cs index c16407212f14..e5f3e051f99c 100644 --- a/src/OpenApi/src/Services/OpenApiDocumentService.cs +++ b/src/OpenApi/src/Services/OpenApiDocumentService.cs @@ -410,7 +410,7 @@ private async Task GetResponseAsync( "Query" => ParameterLocation.Query, "Header" => ParameterLocation.Header, "Path" => ParameterLocation.Path, - _ => throw new InvalidOperationException($"Unsupported parameter source: {parameter.Source.Id}") + _ => null }, Required = IsRequired(parameter), Schema = await _componentService.GetOrCreateSchemaAsync(GetTargetType(description, parameter), scopedServiceProvider, schemaTransformers, parameter, cancellationToken: cancellationToken), diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs index 10c65ae2787f..ff03696fbabd 100644 --- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs +++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs @@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.OpenApi.Models; public partial class OpenApiDocumentServiceTests : OpenApiDocumentServiceTestBase @@ -190,4 +191,29 @@ await VerifyOpenApiDocument(builder, document => Assert.Null(document.Paths["/api/content-type-lower"].Operations[OperationType.Get].Parameters); }); } + + [Fact] + public async Task GetOpenApiParameters_ToleratesCustomBindingSource() + { + var action = CreateActionDescriptor(nameof(ActionWithCustomBinder)); + + await VerifyOpenApiDocument(action, document => + { + var operation = document.Paths["/custom-binding"].Operations[OperationType.Get]; + var parameter = Assert.Single(operation.Parameters); + Assert.Equal("model", parameter.Name); + Assert.Null(parameter.In); + }); + } + + [Route("/custom-binding")] + private void ActionWithCustomBinder([ModelBinder(BinderType = typeof(CustomBinder))] Todo model) { } + + public class CustomBinder : IModelBinder + { + public Task BindModelAsync(ModelBindingContext bindingContext) + { + return Task.CompletedTask; + } + } } From 7bee0edfe8f006dd68afa34ac8df55683d6b2da8 Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Tue, 19 Nov 2024 07:51:59 -0800 Subject: [PATCH 2/2] Default to ParameterLocation.Query for ambiguous source --- src/OpenApi/src/Services/OpenApiDocumentService.cs | 2 +- .../OpenApiDocumentServiceTests.Parameters.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenApi/src/Services/OpenApiDocumentService.cs b/src/OpenApi/src/Services/OpenApiDocumentService.cs index e5f3e051f99c..d082c92582f6 100644 --- a/src/OpenApi/src/Services/OpenApiDocumentService.cs +++ b/src/OpenApi/src/Services/OpenApiDocumentService.cs @@ -410,7 +410,7 @@ private async Task GetResponseAsync( "Query" => ParameterLocation.Query, "Header" => ParameterLocation.Header, "Path" => ParameterLocation.Path, - _ => null + _ => ParameterLocation.Query }, Required = IsRequired(parameter), Schema = await _componentService.GetOrCreateSchemaAsync(GetTargetType(description, parameter), scopedServiceProvider, schemaTransformers, parameter, cancellationToken: cancellationToken), diff --git a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs index ff03696fbabd..999283022706 100644 --- a/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs +++ b/src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiDocumentService/OpenApiDocumentServiceTests.Parameters.cs @@ -202,7 +202,7 @@ await VerifyOpenApiDocument(action, document => var operation = document.Paths["/custom-binding"].Operations[OperationType.Get]; var parameter = Assert.Single(operation.Parameters); Assert.Equal("model", parameter.Name); - Assert.Null(parameter.In); + Assert.Equal(ParameterLocation.Query, parameter.In); }); }