Skip to content

Commit c6f88cf

Browse files
committed
Move registration of filter to route handlers
1 parent c1970e5 commit c6f88cf

12 files changed

+43
-19
lines changed

src/Http/Http.Abstractions/src/Extensions/EndpointBuilder.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using Microsoft.AspNetCore.Http;
5-
using Microsoft.AspNetCore.Http.Validation;
65

76
namespace Microsoft.AspNetCore.Builder;
87

@@ -16,7 +15,7 @@ public abstract class EndpointBuilder
1615
/// <summary>
1716
/// Gets the list of filters that apply to this endpoint.
1817
/// </summary>
19-
public IList<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>> FilterFactories => _filterFactories ??= [ValidationEndpointFilterFactory.Create];
18+
public IList<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>> FilterFactories => _filterFactories ??= new();
2019

2120
/// <summary>
2221
/// Gets or sets the delegate used to process requests for the endpoint.

src/Http/Http.Extensions/gen/Microsoft.AspNetCore.Http.ValidationsGenerator/Emitters/ValidationsGenerator.Emitter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public static IServiceCollection AddValidation(this IServiceCollection services,
135135
// Use non-extension method to avoid infinite recursion.
136136
return ValidationServiceCollectionExtensions.AddValidation(services, options =>
137137
{
138-
options.Resolvers.Add(new GeneratedValidatableInfoResolver());
138+
options.Resolvers.Insert(0, new GeneratedValidatableInfoResolver());
139139
if (configureOptions is not null)
140140
{
141141
configureOptions(options);

src/Http/Http.Extensions/test/ValidationsGenerator/ValidationsGenerator.IValidatableObject.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ namespace Microsoft.AspNetCore.Http.ValidationsGenerator.Tests;
55

66
public partial class ValidationsGeneratorTests : ValidationsGeneratorTestBase
77
{
8-
// [Fact]
9-
internal async Task CanValidateIValidatableObject()
8+
[Fact]
9+
public async Task CanValidateIValidatableObject()
1010
{
1111
var source = """
1212
using System.Collections.Generic;

src/Http/Http.Extensions/test/ValidationsGenerator/snapshots/ValidationsGeneratorTests.CanValidateComplexTypes#ValidatableInfoResolver.g.verified.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ public static IServiceCollection AddValidation(this IServiceCollection services,
276276
// Use non-extension method to avoid infinite recursion.
277277
return ValidationServiceCollectionExtensions.AddValidation(services, options =>
278278
{
279-
options.Resolvers.Add(new GeneratedValidatableInfoResolver());
279+
options.Resolvers.Insert(0, new GeneratedValidatableInfoResolver());
280280
if (configureOptions is not null)
281281
{
282282
configureOptions(options);

src/Http/Http.Extensions/test/ValidationsGenerator/snapshots/ValidationsGeneratorTests.CanValidateIValidatableObject#ValidatableInfoResolver.g.verified.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,10 +221,17 @@ private ValidatableParameterInfo CreateParameterInfomodel()
221221
file static class GeneratedServiceCollectionExtensions
222222
{
223223
[global::System.Runtime.CompilerServices.InterceptsLocationAttribute(1, "ZbyAIis29Y/4fT/GGaRWq7ABAABQcm9ncmFtLmNz")]
224-
public static IServiceCollection AddValidation(this IServiceCollection services)
224+
public static IServiceCollection AddValidation(this IServiceCollection services, Action<ValidationOptions>? configureOptions = null)
225225
{
226-
services.AddSingleton<global::Microsoft.AspNetCore.Http.Validation.IValidatableInfoResolver>(new GeneratedValidatableInfoResolver());
227-
return services;
226+
// Use non-extension method to avoid infinite recursion.
227+
return ValidationServiceCollectionExtensions.AddValidation(services, options =>
228+
{
229+
options.Resolvers.Insert(0, new GeneratedValidatableInfoResolver());
230+
if (configureOptions is not null)
231+
{
232+
configureOptions(options);
233+
}
234+
});
228235
}
229236
}
230237

src/Http/Http.Extensions/test/ValidationsGenerator/snapshots/ValidationsGeneratorTests.CanValidateParameters#ValidatableInfoResolver.g.verified.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ public static IServiceCollection AddValidation(this IServiceCollection services,
191191
// Use non-extension method to avoid infinite recursion.
192192
return ValidationServiceCollectionExtensions.AddValidation(services, options =>
193193
{
194-
options.Resolvers.Add(new GeneratedValidatableInfoResolver());
194+
options.Resolvers.Insert(0, new GeneratedValidatableInfoResolver());
195195
if (configureOptions is not null)
196196
{
197197
configureOptions(options);

src/Http/Http.Extensions/test/ValidationsGenerator/snapshots/ValidationsGeneratorTests.CanValidatePolymorphicTypes#ValidatableInfoResolver.g.verified.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ public static IServiceCollection AddValidation(this IServiceCollection services,
295295
// Use non-extension method to avoid infinite recursion.
296296
return ValidationServiceCollectionExtensions.AddValidation(services, options =>
297297
{
298-
options.Resolvers.Add(new GeneratedValidatableInfoResolver());
298+
options.Resolvers.Insert(0, new GeneratedValidatableInfoResolver());
299299
if (configureOptions is not null)
300300
{
301301
configureOptions(options);

src/Http/Http.Extensions/test/ValidationsGenerator/snapshots/ValidationsGeneratorTests.CanValidateRecursiveTypes#ValidatableInfoResolver.g.verified.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ public static IServiceCollection AddValidation(this IServiceCollection services,
159159
// Use non-extension method to avoid infinite recursion.
160160
return ValidationServiceCollectionExtensions.AddValidation(services, options =>
161161
{
162-
options.Resolvers.Add(new GeneratedValidatableInfoResolver());
162+
options.Resolvers.Insert(0, new GeneratedValidatableInfoResolver());
163163
if (configureOptions is not null)
164164
{
165165
configureOptions(options);

src/Http/Http.Extensions/test/ValidationsGenerator/snapshots/ValidationsGeneratorTests.CanValidateTypesWithAttribute#ValidatableInfoResolver.g.verified.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ public static IServiceCollection AddValidation(this IServiceCollection services,
260260
// Use non-extension method to avoid infinite recursion.
261261
return ValidationServiceCollectionExtensions.AddValidation(services, options =>
262262
{
263-
options.Resolvers.Add(new GeneratedValidatableInfoResolver());
263+
options.Resolvers.Insert(0, new GeneratedValidatableInfoResolver());
264264
if (configureOptions is not null)
265265
{
266266
configureOptions(options);

src/Http/Http.Extensions/test/ValidationsGenerator/validations-design-doc.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,10 @@ internal static class ValidationEndpointFilterFactory
157157
}
158158
var validatableParameters = parameters
159159
.Select(p => options.TryGetValidatableParameterInfo(p, out var validatableParameter) ? validatableParameter : null);
160+
var validatableContext = new ValidatableContext { ValidationOptions = options };
160161
return async (context) =>
161162
{
162-
var validationErrors = new Dictionary<string, string[]>();
163+
validatableContext.ValidationErrors?.Clear();
163164

164165
for (var i = 0; i < context.Arguments.Count; i++)
165166
{
@@ -171,15 +172,15 @@ internal static class ValidationEndpointFilterFactory
171172
continue;
172173
}
173174
var validationContext = new ValidationContext(argument, context.HttpContext.RequestServices, items: null);
174-
var validatableContext = new ValidatableContext(validationContext, string.Empty, options, validationErrors);
175+
validatableContext.ValidationContext = validationContext;
175176
await validatableParameter.Validate(argument, validatableContext);
176177
}
177178

178-
if (validationErrors.Count > 0)
179+
if (validatableContext.ValidationErrors is { Count: > 0 })
179180
{
180181
context.HttpContext.Response.StatusCode = StatusCodes.Status400BadRequest;
181182
context.HttpContext.Response.ContentType = "application/problem+json";
182-
return await ValueTask.FromResult(new HttpValidationProblemDetails(validationErrors));
183+
return await ValueTask.FromResult(new HttpValidationProblemDetails(validatableContext.ValidationErrors));
183184
}
184185

185186
return await next(context);

0 commit comments

Comments
 (0)