Skip to content

Commit e48a078

Browse files
Report parameter location and handle empty parameter name. Fixes #904
1 parent d5fad5c commit e48a078

File tree

7 files changed

+49
-11
lines changed

7 files changed

+49
-11
lines changed

src/AspNet/WebApi/src/Asp.Versioning.WebApi.ApiExplorer/Description/ApiVersionParameterDescriptionContext.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,11 @@ protected virtual void UpdateUrlSegment()
157157
/// <param name="name">The name of the media type parameter.</param>
158158
protected virtual void AddMediaTypeParameter( string name )
159159
{
160+
if ( string.IsNullOrEmpty( name ) )
161+
{
162+
return;
163+
}
164+
160165
var parameter = new NameValueHeaderValue( name, ApiVersion.ToString() );
161166

162167
CloneFormattersAndAddMediaTypeParameter( parameter, ApiDescription.SupportedRequestBodyFormatters );

src/AspNet/WebApi/src/Asp.Versioning.WebApi/ApplyContentTypeVersionActionFilter.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace Asp.Versioning;
44

55
using System.Net.Http.Headers;
6-
using System.Web.Http;
76
using System.Web.Http.Filters;
87
using static Asp.Versioning.ApiVersionParameterLocation;
98

src/AspNet/WebApi/src/Asp.Versioning.WebApi/System.Web.Http/HttpConfigurationExtensions.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ namespace System.Web.Http;
77
using Asp.Versioning.Dispatcher;
88
using System.Web.Http.Controllers;
99
using System.Web.Http.Dispatcher;
10+
using static Asp.Versioning.ApiVersionParameterLocation;
1011

1112
/// <summary>
1213
/// Provides extension methods for the <see cref="HttpConfiguration"/> class.
@@ -79,9 +80,16 @@ private static void AddApiVersioning( this HttpConfiguration configuration, ApiV
7980
configuration.Filters.Add( new ReportApiVersionsAttribute() );
8081
}
8182

82-
if ( options.ApiVersionReader.VersionsByMediaType() )
83+
var reader = options.ApiVersionReader;
84+
85+
if ( reader.VersionsByMediaType() )
8386
{
84-
configuration.Filters.Add( new ApplyContentTypeVersionActionFilter( options.ApiVersionReader ) );
87+
var parameterName = reader.GetParameterName( MediaTypeParameter );
88+
89+
if ( !string.IsNullOrEmpty( parameterName ) )
90+
{
91+
configuration.Filters.Add( new ApplyContentTypeVersionActionFilter( reader ) );
92+
}
8593
}
8694

8795
configuration.Properties.AddOrUpdate( ApiVersioningOptionsKey, options, ( key, oldValue ) => options );

src/AspNetCore/WebApi/src/Asp.Versioning.Http/net6.0/Builder/IEndpointConventionBuilderExtensions.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace Microsoft.AspNetCore.Builder;
1010
using Microsoft.Extensions.DependencyInjection;
1111
using Microsoft.Extensions.Options;
1212
using System.Globalization;
13+
using System.Runtime.CompilerServices;
1314
using static Asp.Versioning.ApiVersionParameterLocation;
1415

1516
/// <summary>
@@ -100,12 +101,17 @@ private static void Apply(
100101
if ( parameterSource.VersionsByMediaType() )
101102
{
102103
var parameterName = parameterSource.GetParameterName( MediaTypeParameter );
103-
requestDelegate = EnsureRequestDelegate( requestDelegate, endpointBuilder.RequestDelegate );
104-
requestDelegate = new ContentTypeApiVersionDecorator( requestDelegate, parameterName );
105-
endpointBuilder.RequestDelegate = requestDelegate;
104+
105+
if ( !string.IsNullOrEmpty( parameterName ) )
106+
{
107+
requestDelegate = EnsureRequestDelegate( requestDelegate, endpointBuilder.RequestDelegate );
108+
requestDelegate = new ContentTypeApiVersionDecorator( requestDelegate, parameterName );
109+
endpointBuilder.RequestDelegate = requestDelegate;
110+
}
106111
}
107112
}
108113

114+
[MethodImpl( MethodImplOptions.AggressiveInlining )]
109115
private static RequestDelegate EnsureRequestDelegate( RequestDelegate? current, RequestDelegate? original ) =>
110116
( current ?? original ) ??
111117
throw new InvalidOperationException(

src/AspNetCore/WebApi/src/Asp.Versioning.Mvc.ApiExplorer/ApiVersionParameterDescriptionContext.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,11 @@ protected virtual void UpdateUrlSegment()
200200
/// <param name="name">The name of the media type parameter.</param>
201201
protected virtual void AddMediaTypeParameter( string name )
202202
{
203+
if ( string.IsNullOrEmpty( name ) )
204+
{
205+
return;
206+
}
207+
203208
var requestFormats = ApiDescription.SupportedRequestFormats.ToArray();
204209
var responseTypes = ApiDescription.SupportedResponseTypes.ToArray();
205210
var parameter = $"{name}={ApiVersion}";

src/AspNetCore/WebApi/src/Asp.Versioning.Mvc/ApiVersioningMvcOptionsSetup.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ namespace Asp.Versioning;
66
using Microsoft.AspNetCore.Mvc.ModelBinding;
77
using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
88
using Microsoft.Extensions.Options;
9+
using static Asp.Versioning.ApiVersionParameterLocation;
910

1011
/// <summary>
1112
/// Represents the API versioning configuration for ASP.NET Core <see cref="MvcOptions">MVC options</see>.
@@ -36,9 +37,16 @@ public virtual void PostConfigure( string name, MvcOptions options )
3637
options.Filters.AddService<ReportApiVersionsAttribute>();
3738
}
3839

39-
if ( value.ApiVersionReader.VersionsByMediaType() )
40+
var reader = value.ApiVersionReader;
41+
42+
if ( reader.VersionsByMediaType() )
4043
{
41-
options.Filters.AddService<ApplyContentTypeVersionActionFilter>();
44+
var parameterName = reader.GetParameterName( MediaTypeParameter );
45+
46+
if ( !string.IsNullOrEmpty( parameterName ) )
47+
{
48+
options.Filters.AddService<ApplyContentTypeVersionActionFilter>();
49+
}
4250
}
4351

4452
var modelMetadataDetailsProviders = options.ModelMetadataDetailsProviders;

src/Common/src/Common/MediaTypeApiVersionReaderBuilder.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,9 +301,16 @@ public void AddParameters( IApiVersionParameterDescriptionContext context )
301301
throw new ArgumentNullException( nameof( context ) );
302302
}
303303

304-
for ( var i = 0; i < parameters.Count; i++ )
304+
if ( parameters.Count == 0 )
305305
{
306-
context.AddParameter( parameters[i], MediaTypeParameter );
306+
context.AddParameter( name: string.Empty, MediaTypeParameter );
307+
}
308+
else
309+
{
310+
for ( var i = 0; i < parameters.Count; i++ )
311+
{
312+
context.AddParameter( parameters[i], MediaTypeParameter );
313+
}
307314
}
308315
}
309316

@@ -427,7 +434,7 @@ private void Read(
427434
versions.Add( result[j] );
428435
}
429436
}
437+
}
430438
}
431439
}
432-
}
433440
}

0 commit comments

Comments
 (0)