33using System . Net . Http ;
44using Microsoft . CodeAnalysis ;
55using Microsoft . CodeAnalysis . Text ;
6+ using OpenAPI . WebApiGenerator . Extensions ;
67
78namespace OpenAPI . WebApiGenerator . CodeGeneration ;
89
@@ -27,11 +28,25 @@ internal partial class Operation
2728 internal const string PathTemplate = "{{ pathTemplate }} ";
2829 internal const string Method = "{{ method . Method }} ";
2930
30- {{ HandleMethodSignature }} ;
31+ /// <summary>
32+ /// Should responses be validated?
33+ /// If the response has already been validated, this can be disabled to avoid redundant validation.
34+ /// </summary>
35+ internal bool ValidateResponse { get; init; } = true;
3136
32- private Func<ImmutableList<ValidationResult>, Response> HandleValidationError { get; } = validationResult =>
37+ {{ HandleMethodSignature . Indent ( 4 ) }} ;
38+
39+ /// <summary>
40+ /// Set a custom delegate to handle request validation errors.
41+ /// <exception cref="JsonValidationException"></exception>
42+ /// </summary>
43+ private Func<ImmutableList<ValidationResult>, Response> HandleRequestValidationError { get; } = validationResult =>
3344 {{ jsonValidationExceptionGenerator . CreateThrowJsonValidationExceptionInvocation ( "Request is not valid" , "validationResult" ) }} ;
3445
46+ /// <summary>
47+ /// Handle a operation.
48+ /// <exception cref="JsonValidationException"></exception>
49+ /// </summary>
3550 internal static async Task HandleAsync(
3651 HttpContext context,
3752 [FromServices] Operation operation,
@@ -45,20 +60,22 @@ internal static async Task HandleAsync(
4560 var validationContext = request.Validate(validationLevel);
4661 if (!validationContext.IsValid)
4762 {
48- operation.HandleValidationError (validationContext.Results.WithLocation(configuration.OpenApiSpecificationUri))
63+ operation.HandleRequestValidationError (validationContext.Results.WithLocation(configuration.OpenApiSpecificationUri))
4964 .WriteTo(context.Response);
5065 return;
5166 }
5267
5368 var response = await operation.HandleAsync(request, cancellationToken)
5469 .ConfigureAwait(false);
55- validationContext = response.Validate(validationLevel);
56- if (!validationContext.IsValid)
70+ if (operation.ValidateResponse)
5771 {
58- var validationResult = validationContext.Results.WithLocation(configuration.OpenApiSpecificationUri);
59- {{ jsonValidationExceptionGenerator . CreateThrowJsonValidationExceptionInvocation ( "Response is not valid" , "validationResult" ) }} ;
72+ validationContext = response.Validate(validationLevel);
73+ if (!validationContext.IsValid)
74+ {
75+ var validationResult = validationContext.Results.WithLocation(configuration.OpenApiSpecificationUri);
76+ {{ jsonValidationExceptionGenerator . CreateThrowJsonValidationExceptionInvocation ( "Response is not valid" , "validationResult" ) }} ;
77+ }
6078 }
61-
6279 response.WriteTo(context.Response);
6380 }
6481}
@@ -79,7 +96,12 @@ internal static async Task HandleAsync(
7996 }
8097
8198 private const string HandleMethodSignature =
82- "internal partial Task<Response> HandleAsync(Request request, CancellationToken cancellationToken)" ;
99+ """
100+ /// <summary>
101+ /// Handles a request for this operation.
102+ /// </summary>
103+ internal partial Task<Response> HandleAsync(Request request, CancellationToken cancellationToken)
104+ """ ;
83105
84106 private static bool HasImplementedHandleMethod ( INamedTypeSymbol typeSymbol )
85107 {
0 commit comments