From a9a27ce51d260f4409065cb34117c9f23331f0c5 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 a9a7ecf6a1a6..c5f161f6fecd 100644 --- a/src/OpenApi/src/Services/OpenApiDocumentService.cs +++ b/src/OpenApi/src/Services/OpenApiDocumentService.cs @@ -411,7 +411,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 206e8587acf861846d200dfc3411b780cf2c4988 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 c5f161f6fecd..5d678e67c8c7 100644 --- a/src/OpenApi/src/Services/OpenApiDocumentService.cs +++ b/src/OpenApi/src/Services/OpenApiDocumentService.cs @@ -411,7 +411,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); }); }