Skip to content

Commit 604d84f

Browse files
Chris Martinezcommonsensesoftware
authored andcommitted
Checkpoint to fixes started in 2020-03
1 parent 8894e3a commit 604d84f

File tree

7 files changed

+28
-35
lines changed

7 files changed

+28
-35
lines changed

src/Common.OData.ApiExplorer/AspNet.OData/Builder/ODataValidationSettingsConvention.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,17 @@ protected virtual ApiParameterDescription NewCountParameter( ODataQueryOptionDes
115115
return NewParameterDescription( GetName( Count ), description, typeof( bool ), defaultValue: false );
116116
}
117117

118+
// REF: http://docs.oasis-open.org/odata/odata/v4.01/cs01/part2-url-conventions/odata-v4.01-cs01-part2-url-conventions.html#sec_SystemQueryOptions
119+
static bool IsSupported( string httpMethod ) =>
120+
httpMethod.ToUpperInvariant() switch
121+
{
122+
"GET" => true,
123+
"PUT" => true,
124+
"PATCH" => true,
125+
"POST" => true,
126+
_ => false,
127+
};
128+
118129
string GetName( AllowedQueryOptions option )
119130
{
120131
#pragma warning disable CA1308 // Normalize strings to uppercase

src/Microsoft.AspNet.OData.Versioning.ApiExplorer/AspNet.OData/Builder/ODataValidationSettingsConvention.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public virtual void ApplyTo( ApiDescription apiDescription )
2424
throw new ArgumentNullException( nameof( apiDescription ) );
2525
}
2626

27-
if ( !IsSupported( apiDescription ) )
27+
if ( !IsSupported( apiDescription.HttpMethod.Method ) )
2828
{
2929
return;
3030
}
@@ -142,15 +142,5 @@ static ApiParameterDescription SetAction( ApiParameterDescription parameter, Api
142142

143143
return parameter;
144144
}
145-
146-
static bool IsSupported( ApiDescription apiDescription )
147-
{
148-
return apiDescription.HttpMethod.Method.ToUpperInvariant() switch
149-
{
150-
"GET" => true,
151-
"POST" => apiDescription.Operation()?.IsAction() == true,
152-
_ => false,
153-
};
154-
}
155145
}
156146
}

src/Microsoft.AspNet.WebApi.Versioning/System.Web.Http/HttpActionDescriptorExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ internal static bool IsAttributeRouted( this HttpActionDescriptor action ) =>
110110

111111
internal static T? GetProperty<T>( this HttpActionDescriptor action ) where T : class =>
112112
action.Properties.TryGetValue( typeof( T ), out T value ) ? value : default;
113+
#pragma warning restore CS8603 // Possible null reference return.
113114

114115
internal static void SetProperty<T>( this HttpActionDescriptor action, T value ) =>
115116
action.Properties.AddOrUpdate( typeof( T ), value, ( key, oldValue ) => value );

src/Microsoft.AspNet.WebApi.Versioning/System.Web.Http/HttpRequestMessageExtensions.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using Microsoft.Web.Http;
44
using Microsoft.Web.Http.Versioning;
55
using System;
6-
using System.Diagnostics.CodeAnalysis;
76
using System.Net;
87
using System.Net.Http;
98

@@ -12,6 +11,7 @@
1211
/// </summary>
1312
public static class HttpRequestMessageExtensions
1413
{
14+
const string RoutingContextKey = "MS_RoutingContext";
1515
const string ApiVersionPropertiesKey = "MS_" + nameof( ApiVersionRequestProperties );
1616

1717
static HttpResponseMessage CreateErrorResponse( this HttpRequestMessage request, HttpStatusCode statusCode, Func<bool, HttpError> errorCreator )
@@ -83,7 +83,14 @@ public static ApiVersionRequestProperties ApiVersionProperties( this HttpRequest
8383

8484
if ( !request.Properties.TryGetValue( ApiVersionPropertiesKey, out ApiVersionRequestProperties properties ) )
8585
{
86+
var forceRouteConstraintEvaluation = !request.Properties.ContainsKey( RoutingContextKey );
87+
8688
request.Properties[ApiVersionPropertiesKey] = properties = new ApiVersionRequestProperties( request );
89+
90+
if ( forceRouteConstraintEvaluation )
91+
{
92+
request.GetConfiguration()?.Routes.GetRouteData( request );
93+
}
8794
}
8895

8996
return properties;

src/Microsoft.AspNetCore.OData.Versioning.ApiExplorer/AspNet.OData/Builder/ODataValidationSettingsConvention.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public virtual void ApplyTo( ApiDescription apiDescription )
2323
throw new ArgumentNullException( nameof( apiDescription ) );
2424
}
2525

26-
if ( !IsSupported( apiDescription ) )
26+
if ( !IsSupported( apiDescription.HttpMethod ) )
2727
{
2828
return;
2929
}
@@ -152,15 +152,5 @@ static bool IsSingleResult( ApiDescription description, out Type? resultType )
152152
resultType = responseType;
153153
return true;
154154
}
155-
156-
static bool IsSupported( ApiDescription apiDescription )
157-
{
158-
return apiDescription.HttpMethod.ToUpperInvariant() switch
159-
{
160-
"GET" => true,
161-
"POST" => apiDescription.Operation()?.IsAction() == true,
162-
_ => false,
163-
};
164-
}
165155
}
166156
}

test/Microsoft.AspNet.OData.Versioning.ApiExplorer.Tests/AspNet.OData/Builder/ODataValidationSettingsConventionTest.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,11 @@
2424

2525
public class ODataValidationSettingsConventionTest
2626
{
27-
[Theory]
28-
[InlineData( "PUT" )]
29-
[InlineData( "PATCH" )]
30-
[InlineData( "DELETE" )]
31-
public void apply_to_should_ignore_nonquery_and_nonaction_descriptions( string httpMethod )
27+
[Fact]
28+
public void apply_to_should_ignore_nonquery_and_nonaction_description()
3229
{
3330
// arrange
34-
var description = NewApiDescription( httpMethod );
31+
var description = NewApiDescription( "DELETE" );
3532
var validationSettings = new ODataValidationSettings();
3633
var settings = new TestODataQueryOptionSettings();
3734
var convention = new ODataValidationSettingsConvention( validationSettings, settings );

test/Microsoft.AspNetCore.OData.Versioning.ApiExplorer.Tests/AspNet.OData/Builder/ODataValidationSettingsConventionTest.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,11 @@
2424

2525
public class ODataValidationSettingsConventionTest
2626
{
27-
[Theory]
28-
[InlineData( "PUT" )]
29-
[InlineData( "PATCH" )]
30-
[InlineData( "DELETE" )]
31-
public void apply_to_should_ignore_nonquery_and_nonaction_descriptions( string httpMethod )
27+
[Fact]
28+
public void apply_to_should_ignore_nonquery_and_nonaction_description()
3229
{
3330
// arrange
34-
var description = NewApiDescription( httpMethod );
31+
var description = NewApiDescription( "DELETE" );
3532
var validationSettings = new ODataValidationSettings();
3633
var settings = new TestODataQueryOptionSettings( typeof( object ) );
3734
var convention = new ODataValidationSettingsConvention( validationSettings, settings );

0 commit comments

Comments
 (0)