Hosting 292 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. commit 05fd382b93cb51668d1d8858e79292601ca71b18
  2. Author: Chris Ross (ASP.NET) <[email protected]>
  3. Date: Wed Nov 8 11:10:07 2017 -0800
  4. #1256 Check HasStarted for StatusCode and ReasonPhrase
  5. diff --git a/src/Microsoft.AspNetCore.TestHost/ResponseFeature.cs b/src/Microsoft.AspNetCore.TestHost/ResponseFeature.cs
  6. index 2fb691619a1..c6c7b47e18d 100644
  7. --- a/src/Microsoft.AspNetCore.TestHost/ResponseFeature.cs
  8. +++ b/src/Microsoft.AspNetCore.TestHost/ResponseFeature.cs
  9. @@ -14,6 +14,8 @@ namespace Microsoft.AspNetCore.TestHost
  10. private Func<Task> _responseStartingAsync = () => Task.FromResult(true);
  11. private Func<Task> _responseCompletedAsync = () => Task.FromResult(true);
  12. private HeaderDictionary _headers = new HeaderDictionary();
  13. + private int _statusCode;
  14. + private string _reasonPhrase;
  15. public ResponseFeature()
  16. {
  17. @@ -25,9 +27,37 @@ namespace Microsoft.AspNetCore.TestHost
  18. StatusCode = 200;
  19. }
  20. - public int StatusCode { get; set; }
  21. + public int StatusCode
  22. + {
  23. + get => _statusCode;
  24. + set
  25. + {
  26. + if (HasStarted)
  27. + {
  28. + throw new InvalidOperationException("The status code cannot be set, the response has already started.");
  29. + }
  30. + if (value < 100)
  31. + {
  32. + throw new ArgumentOutOfRangeException(nameof(value), value, "The status code cannot be set to a value less than 100");
  33. + }
  34. +
  35. + _statusCode = value;
  36. + }
  37. + }
  38. +
  39. + public string ReasonPhrase
  40. + {
  41. + get => _reasonPhrase;
  42. + set
  43. + {
  44. + if (HasStarted)
  45. + {
  46. + throw new InvalidOperationException("The reason phrase cannot be set, the response has already started.");
  47. + }
  48. - public string ReasonPhrase { get; set; }
  49. + _reasonPhrase = value;
  50. + }
  51. + }
  52. public IHeaderDictionary Headers { get; set; }
  53. diff --git a/test/Microsoft.AspNetCore.TestHost.Tests/ResponseFeatureTests.cs b/test/Microsoft.AspNetCore.TestHost.Tests/ResponseFeatureTests.cs
  54. index 8081f092a84..f8af4cf64d2 100644
  55. --- a/test/Microsoft.AspNetCore.TestHost.Tests/ResponseFeatureTests.cs
  56. +++ b/test/Microsoft.AspNetCore.TestHost.Tests/ResponseFeatureTests.cs
  57. @@ -41,5 +41,28 @@ namespace Microsoft.AspNetCore.TestHost
  58. }, state: "string");
  59. });
  60. }
  61. +
  62. + [Fact]
  63. + public void StatusCode_ThrowsWhenHasStarted()
  64. + {
  65. + var responseInformation = new ResponseFeature();
  66. + responseInformation.HasStarted = true;
  67. +
  68. + Assert.Throws<InvalidOperationException>(() => responseInformation.StatusCode = 400);
  69. + Assert.Throws<InvalidOperationException>(() => responseInformation.ReasonPhrase = "Hello World");
  70. + }
  71. +
  72. + [Fact]
  73. + public void StatusCode_MustBeGreaterThan99()
  74. + {
  75. + var responseInformation = new ResponseFeature();
  76. +
  77. + Assert.Throws<ArgumentOutOfRangeException>(() => responseInformation.StatusCode = 99);
  78. + Assert.Throws<ArgumentOutOfRangeException>(() => responseInformation.StatusCode = 0);
  79. + Assert.Throws<ArgumentOutOfRangeException>(() => responseInformation.StatusCode = -200);
  80. + responseInformation.StatusCode = 100;
  81. + responseInformation.StatusCode = 200;
  82. + responseInformation.StatusCode = 1000;
  83. + }
  84. }
  85. }
  86. \ No newline at end of file