Skip to content

Commit c1f7320

Browse files
authored
Make ProblemDetails settable in ProblemDetailsContext (#48510)
* make problemdetails settable in problemdetailscontext fixes #47633
1 parent 4eae56d commit c1f7320

File tree

5 files changed

+105
-1
lines changed

5 files changed

+105
-1
lines changed

src/Http/Http.Abstractions/src/ProblemDetails/ProblemDetailsContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public sealed class ProblemDetailsContext
2929
public ProblemDetails ProblemDetails
3030
{
3131
get => _problemDetails ??= new ProblemDetails();
32-
init => _problemDetails = value;
32+
set => _problemDetails = value;
3333
}
3434

3535
/// <summary>

src/Http/Http.Abstractions/src/PublicAPI.Unshipped.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ Microsoft.AspNetCore.Http.Metadata.IRouteDiagnosticsMetadata
1010
Microsoft.AspNetCore.Http.Metadata.IRouteDiagnosticsMetadata.Route.get -> string!
1111
Microsoft.AspNetCore.Http.ProblemDetailsContext.Exception.get -> System.Exception?
1212
Microsoft.AspNetCore.Http.ProblemDetailsContext.Exception.init -> void
13+
*REMOVED*Microsoft.AspNetCore.Http.ProblemDetailsContext.ProblemDetails.init -> void
14+
Microsoft.AspNetCore.Http.ProblemDetailsContext.ProblemDetails.set -> void
1315
Microsoft.AspNetCore.Mvc.ProblemDetails.Extensions.set -> void
1416
static Microsoft.AspNetCore.Http.EndpointFilterInvocationContext.Create(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> Microsoft.AspNetCore.Http.EndpointFilterInvocationContext!
1517
static Microsoft.AspNetCore.Http.EndpointFilterInvocationContext.Create<T1, T2, T3, T4, T5, T6, T7, T8>(Microsoft.AspNetCore.Http.HttpContext! httpContext, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8) -> Microsoft.AspNetCore.Http.EndpointFilterInvocationContext!
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using Microsoft.AspNetCore.Http;
5+
using Microsoft.AspNetCore.Mvc;
6+
7+
namespace Microsoft.AspNetCore.Http.Abstractions.Tests;
8+
9+
public class ProblemDetailsContextTests
10+
{
11+
[Fact]
12+
public void ProblemDetailsPropertySetter_Should_SetProblemDetails()
13+
{
14+
// Arrange
15+
ProblemDetailsContext context = new() { HttpContext = new DefaultHttpContext() };
16+
ProblemDetails problemDetails = new();
17+
18+
// Act
19+
context.ProblemDetails = problemDetails;
20+
21+
// Assert
22+
Assert.Equal(problemDetails, context.ProblemDetails);
23+
}
24+
}

src/Http/Http.Extensions/test/ProblemDetailsDefaultWriterTest.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,45 @@ public async Task WriteAsync_Works()
5454
Assert.Equal(expectedProblem.Instance, problemDetails.Instance);
5555
}
5656

57+
[Fact]
58+
public async Task WriteAsync_Works_WhenReplacingProblemDetailsUsingSetter()
59+
{
60+
// Arrange
61+
var writer = GetWriter();
62+
var stream = new MemoryStream();
63+
var context = CreateContext(stream);
64+
var originalProblemDetails = new ProblemDetails();
65+
66+
var expectedProblem = new ProblemDetails()
67+
{
68+
Detail = "Custom Bad Request",
69+
Instance = "Custom Bad Request",
70+
Status = StatusCodes.Status400BadRequest,
71+
Type = "https://tools.ietf.org/html/rfc9110#section-15.5.1-custom",
72+
Title = "Custom Bad Request",
73+
};
74+
var problemDetailsContext = new ProblemDetailsContext()
75+
{
76+
HttpContext = context,
77+
ProblemDetails = originalProblemDetails
78+
};
79+
80+
problemDetailsContext.ProblemDetails = expectedProblem;
81+
82+
//Act
83+
await writer.WriteAsync(problemDetailsContext);
84+
85+
//Assert
86+
stream.Position = 0;
87+
var problemDetails = await JsonSerializer.DeserializeAsync<ProblemDetails>(stream, SerializerOptions);
88+
Assert.NotNull(problemDetails);
89+
Assert.Equal(expectedProblem.Status, problemDetails.Status);
90+
Assert.Equal(expectedProblem.Type, problemDetails.Type);
91+
Assert.Equal(expectedProblem.Title, problemDetails.Title);
92+
Assert.Equal(expectedProblem.Detail, problemDetails.Detail);
93+
Assert.Equal(expectedProblem.Instance, problemDetails.Instance);
94+
}
95+
5796
[Fact]
5897
public async Task WriteAsync_Works_WithJsonContext()
5998
{

src/Mvc/Mvc.Core/test/Infrastructure/DefaultApiProblemDetailsWriterTest.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,45 @@ public async Task WriteAsync_Works()
5151
Assert.Equal(expectedProblem.Instance, problemDetails.Instance);
5252
}
5353

54+
[Fact]
55+
public async Task WriteAsync_Works_WhenReplacingProblemDetailsUsingSetter()
56+
{
57+
// Arrange
58+
var writer = GetWriter();
59+
var stream = new MemoryStream();
60+
var context = CreateContext(stream);
61+
var originalProblemDetails = new ProblemDetails();
62+
63+
var expectedProblem = new ProblemDetails()
64+
{
65+
Detail = "Custom Bad Request",
66+
Instance = "Custom Bad Request",
67+
Status = StatusCodes.Status400BadRequest,
68+
Type = "https://tools.ietf.org/html/rfc9110#section-15.5.1-custom",
69+
Title = "Custom Bad Request",
70+
};
71+
var problemDetailsContext = new ProblemDetailsContext()
72+
{
73+
HttpContext = context,
74+
ProblemDetails = originalProblemDetails
75+
};
76+
77+
problemDetailsContext.ProblemDetails = expectedProblem;
78+
79+
//Act
80+
await writer.WriteAsync(problemDetailsContext);
81+
82+
//Assert
83+
stream.Position = 0;
84+
var problemDetails = await JsonSerializer.DeserializeAsync<ProblemDetails>(stream, new JsonSerializerOptions(JsonSerializerDefaults.Web));
85+
Assert.NotNull(problemDetails);
86+
Assert.Equal(expectedProblem.Status, problemDetails.Status);
87+
Assert.Equal(expectedProblem.Type, problemDetails.Type);
88+
Assert.Equal(expectedProblem.Title, problemDetails.Title);
89+
Assert.Equal(expectedProblem.Detail, problemDetails.Detail);
90+
Assert.Equal(expectedProblem.Instance, problemDetails.Instance);
91+
}
92+
5493
[Fact]
5594
public async Task WriteAsync_AddExtensions()
5695
{

0 commit comments

Comments
 (0)