Skip to content

Commit 2d23e7b

Browse files
authored
ProblemHttpResult should use ProblemDetailsService when registered. (#47100)
1 parent f876ff1 commit 2d23e7b

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

src/Http/Http.Results/src/ProblemHttpResult.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,23 +46,27 @@ internal ProblemHttpResult(ProblemDetails problemDetails)
4646
int? IStatusCodeHttpResult.StatusCode => StatusCode;
4747

4848
/// <inheritdoc/>
49-
public Task ExecuteAsync(HttpContext httpContext)
49+
public async Task ExecuteAsync(HttpContext httpContext)
5050
{
5151
ArgumentNullException.ThrowIfNull(httpContext);
5252

5353
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
5454
var logger = loggerFactory.CreateLogger(typeof(ProblemHttpResult));
55+
var problemDetailsService = httpContext.RequestServices.GetService<IProblemDetailsService>();
5556

5657
if (StatusCode is { } code)
5758
{
5859
HttpResultsHelper.Log.WritingResultAsStatusCode(logger, code);
5960
httpContext.Response.StatusCode = code;
6061
}
6162

62-
return HttpResultsHelper.WriteResultAsJsonAsync(
63+
if (problemDetailsService is null || !await problemDetailsService.TryWriteAsync(new() { HttpContext = httpContext, ProblemDetails = ProblemDetails }))
64+
{
65+
await HttpResultsHelper.WriteResultAsJsonAsync(
6366
httpContext,
6467
logger,
6568
value: ProblemDetails,
6669
ContentType);
70+
}
6771
}
6872
}

src/Http/Http.Results/test/ProblemResultTests.cs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,38 @@ public async Task ExecuteAsync_UsesDefaults_ForProblemDetails()
4343
Assert.Equal(StatusCodes.Status500InternalServerError, responseDetails.Status);
4444
}
4545

46+
[Fact]
47+
public async Task ExecuteAsync_UsesDefaultsFromProblemDetailsServoce_ForProblemDetails()
48+
{
49+
// Arrange
50+
var details = new ProblemDetails();
51+
52+
var result = new ProblemHttpResult(details);
53+
var stream = new MemoryStream();
54+
var services = CreateServiceCollection()
55+
.AddProblemDetails(options => options.CustomizeProblemDetails = x => x.ProblemDetails.Type = null)
56+
.BuildServiceProvider();
57+
var httpContext = new DefaultHttpContext()
58+
{
59+
RequestServices = services,
60+
Response =
61+
{
62+
Body = stream,
63+
},
64+
};
65+
66+
// Act
67+
await result.ExecuteAsync(httpContext);
68+
69+
// Assert
70+
Assert.Equal(StatusCodes.Status500InternalServerError, httpContext.Response.StatusCode);
71+
stream.Position = 0;
72+
var responseDetails = JsonSerializer.Deserialize<ProblemDetails>(stream, SerializerOptions);
73+
Assert.Null(responseDetails.Type);
74+
Assert.Equal("An error occurred while processing your request.", responseDetails.Title);
75+
Assert.Equal(StatusCodes.Status500InternalServerError, responseDetails.Status);
76+
}
77+
4678
[Fact]
4779
public async Task ExecuteAsync_UsesDefaults_ForValidationProblemDetails()
4880
{
@@ -217,11 +249,17 @@ public void ProblemResult_Implements_IContentTypeHttpResult_Correctly()
217249
Assert.Equal("application/problem+json", result.ContentType);
218250
}
219251

220-
private static IServiceProvider CreateServices()
252+
private static IServiceCollection CreateServiceCollection()
221253
{
222254
var services = new ServiceCollection();
223255
services.AddTransient(typeof(ILogger<>), typeof(NullLogger<>));
224256
services.AddSingleton<ILoggerFactory>(NullLoggerFactory.Instance);
257+
return services;
258+
}
259+
260+
private static IServiceProvider CreateServices()
261+
{
262+
var services = CreateServiceCollection();
225263

226264
return services.BuildServiceProvider();
227265
}

0 commit comments

Comments
 (0)