From 05fd382b93cb51668d1d8858e79292601ca71b18 Mon Sep 17 00:00:00 2001 From: "Chris Ross (ASP.NET)" Date: Wed, 8 Nov 2017 11:10:07 -0800 Subject: [PATCH] #1256 Check HasStarted for StatusCode and ReasonPhrase --- .../ResponseFeature.cs | 34 +++++++++++++++++-- .../ResponseFeatureTests.cs | 23 +++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.TestHost/ResponseFeature.cs b/src/Microsoft.AspNetCore.TestHost/ResponseFeature.cs index 2fb691619a..c6c7b47e18 100644 --- a/src/Microsoft.AspNetCore.TestHost/ResponseFeature.cs +++ b/src/Microsoft.AspNetCore.TestHost/ResponseFeature.cs @@ -14,6 +14,8 @@ namespace Microsoft.AspNetCore.TestHost private Func _responseStartingAsync = () => Task.FromResult(true); private Func _responseCompletedAsync = () => Task.FromResult(true); private HeaderDictionary _headers = new HeaderDictionary(); + private int _statusCode; + private string _reasonPhrase; public ResponseFeature() { @@ -25,9 +27,37 @@ namespace Microsoft.AspNetCore.TestHost StatusCode = 200; } - public int StatusCode { get; set; } + public int StatusCode + { + get => _statusCode; + set + { + if (HasStarted) + { + throw new InvalidOperationException("The status code cannot be set, the response has already started."); + } + if (value < 100) + { + throw new ArgumentOutOfRangeException(nameof(value), value, "The status code cannot be set to a value less than 100"); + } - public string ReasonPhrase { get; set; } + _statusCode = value; + } + } + + public string ReasonPhrase + { + get => _reasonPhrase; + set + { + if (HasStarted) + { + throw new InvalidOperationException("The reason phrase cannot be set, the response has already started."); + } + + _reasonPhrase = value; + } + } public IHeaderDictionary Headers { get; set; } diff --git a/test/Microsoft.AspNetCore.TestHost.Tests/ResponseFeatureTests.cs b/test/Microsoft.AspNetCore.TestHost.Tests/ResponseFeatureTests.cs index 8081f092a8..f8af4cf64d 100644 --- a/test/Microsoft.AspNetCore.TestHost.Tests/ResponseFeatureTests.cs +++ b/test/Microsoft.AspNetCore.TestHost.Tests/ResponseFeatureTests.cs @@ -41,5 +41,28 @@ namespace Microsoft.AspNetCore.TestHost }, state: "string"); }); } + + [Fact] + public void StatusCode_ThrowsWhenHasStarted() + { + var responseInformation = new ResponseFeature(); + responseInformation.HasStarted = true; + + Assert.Throws(() => responseInformation.StatusCode = 400); + Assert.Throws(() => responseInformation.ReasonPhrase = "Hello World"); + } + + [Fact] + public void StatusCode_MustBeGreaterThan99() + { + var responseInformation = new ResponseFeature(); + + Assert.Throws(() => responseInformation.StatusCode = 99); + Assert.Throws(() => responseInformation.StatusCode = 0); + Assert.Throws(() => responseInformation.StatusCode = -200); + responseInformation.StatusCode = 100; + responseInformation.StatusCode = 200; + responseInformation.StatusCode = 1000; + } } } \ No newline at end of file