Skip to content
This repository was archived by the owner on Dec 14, 2018. It is now read-only.

Commit 17aa21d

Browse files
committed
Added StatusCode property to OutputFormatterContext
- Fixes issue #1809 - Added relevant tests
1 parent 8e85d53 commit 17aa21d

File tree

7 files changed

+87
-3
lines changed

7 files changed

+87
-3
lines changed

src/Microsoft.AspNet.Mvc.Core/ActionResults/ObjectResult.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public override async Task ExecuteResultAsync(ActionContext context)
4242
DeclaredType = DeclaredType,
4343
ActionContext = context,
4444
Object = Value,
45+
StatusCode = StatusCode
4546
};
4647

4748
var selectedFormatter = SelectFormatter(formatterContext, formatters);
@@ -52,9 +53,9 @@ public override async Task ExecuteResultAsync(ActionContext context)
5253
return;
5354
}
5455

55-
if (StatusCode != null)
56+
if (StatusCode.HasValue)
5657
{
57-
context.HttpContext.Response.StatusCode = (int)StatusCode;
58+
context.HttpContext.Response.StatusCode = StatusCode.Value;
5859
}
5960

6061
OnFormatting(context);

src/Microsoft.AspNet.Mvc.Core/Formatters/HttpNoContentOutputFormatter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public Task WriteAsync(OutputFormatterContext context)
4444
{
4545
var response = context.ActionContext.HttpContext.Response;
4646
response.ContentLength = 0;
47-
response.StatusCode = 204;
47+
response.StatusCode = context.StatusCode ?? 204;
4848
return Task.FromResult(true);
4949
}
5050
}

src/Microsoft.AspNet.Mvc.Core/Formatters/OutputFormatterContext.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,13 @@ public class OutputFormatterContext
3737
/// The content type which is chosen by the selected formatter.
3838
/// </summary>
3939
public MediaTypeHeaderValue SelectedContentType { get; set; }
40+
41+
/// <summary>
42+
/// Gets the status code that was previously set by the <see cref="ObjectResult"/>.
43+
/// </summary>
44+
/// <remarks>
45+
/// Null indicates no value set by the <see cref="ObjectResult"/>.
46+
/// </remarks>
47+
public int? StatusCode { get; set; }
4048
}
4149
}

test/Microsoft.AspNet.Mvc.Core.Test/ActionResults/ObjectResultTests.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,36 @@ public async Task ObjectResult_Execute_CallsContentResult_SetsContent()
430430
Assert.Equal(input.Length, httpResponse.Object.Body.Length);
431431
}
432432

433+
[Fact]
434+
public async Task ObjectResult_Execute_NullContent_SetsStatusCode()
435+
{
436+
// Arrange
437+
var stream = new MemoryStream();
438+
var expectedStatusCode = 201;
439+
var httpResponse = new Mock<HttpResponse>();
440+
httpResponse.SetupGet(r => r.Body).Returns(stream);
441+
442+
var formatters = new IOutputFormatter[]
443+
{
444+
new HttpNoContentOutputFormatter(),
445+
new StringOutputFormatter(),
446+
new JsonOutputFormatter()
447+
};
448+
var actionContext = CreateMockActionContext(formatters,
449+
httpResponse.Object,
450+
requestAcceptHeader: null,
451+
requestContentType: null);
452+
var result = new ObjectResult(null);
453+
result.StatusCode = expectedStatusCode;
454+
455+
// Act
456+
await result.ExecuteResultAsync(actionContext);
457+
458+
// Assert
459+
httpResponse.VerifySet(r => r.StatusCode = expectedStatusCode);
460+
Assert.Equal(0, httpResponse.Object.Body.Length);
461+
}
462+
433463
[Fact]
434464
public async Task ObjectResult_Execute_CallsJsonResult_SetsContent()
435465
{

test/Microsoft.AspNet.Mvc.Core.Test/Formatters/NoContentFormatterTests.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,5 +127,26 @@ public async Task WriteAsync_WritesTheStatusCode204()
127127
// Assert
128128
Assert.Equal(204, defaultHttpContext.Response.StatusCode);
129129
}
130+
131+
[Fact]
132+
public async Task WriteAsync_ContextStatusCodeSet_WritesSameStatusCode()
133+
{
134+
// Arrange
135+
var defaultHttpContext = new DefaultHttpContext();
136+
var formatterContext = new OutputFormatterContext()
137+
{
138+
Object = null,
139+
ActionContext = new ActionContext(defaultHttpContext, new RouteData(), new ActionDescriptor()),
140+
StatusCode = 201
141+
};
142+
143+
var formatter = new HttpNoContentOutputFormatter();
144+
145+
// Act
146+
await formatter.WriteAsync(formatterContext);
147+
148+
// Assert
149+
Assert.Equal(201, defaultHttpContext.Response.StatusCode);
150+
}
130151
}
131152
}

test/Microsoft.AspNet.Mvc.FunctionalTests/ActionResultTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,5 +307,22 @@ public async Task ContentResult_WritesContent_SetsContentTypeAndEncoding()
307307
Assert.Equal("us-ascii", response.Content.Headers.ContentType.CharSet);
308308
Assert.Equal("content", await response.Content.ReadAsStringAsync());
309309
}
310+
311+
[Fact]
312+
public async Task ObjectResult_WithStatusCodeAndNoContent_SetsSameStatusCode()
313+
{
314+
// Arrange
315+
var server = TestServer.Create(_provider, _app);
316+
var client = server.CreateClient();
317+
var request = new HttpRequestMessage(
318+
HttpMethod.Get,
319+
"http://localhost/ActionResultsVerification/GetObjectResultWithNoContent");
320+
321+
// Act
322+
var response = await client.SendAsync(request);
323+
324+
// Assert
325+
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
326+
}
310327
}
311328
}

test/WebSites/ActionResultsWebSite/Controllers/ActionResultsVerificationController.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ public IActionResult GetContentResultWithContentTypeAndEncoding()
7777
return Content("content", "application/json", Encoding.ASCII);
7878
}
7979

80+
public IActionResult GetObjectResultWithNoContent()
81+
{
82+
var result = new ObjectResult(null);
83+
result.StatusCode = 201;
84+
return result;
85+
}
86+
8087
public DummyClass GetDummy(int id)
8188
{
8289
return CreateDummy();

0 commit comments

Comments
 (0)