From 205fe9daf1736535f11397ae883df3dfa8f48d93 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Thu, 22 Mar 2018 12:21:10 -0700 Subject: [PATCH] Do not return 200 for exceptions --- .../Properties/launchSettings.json | 1 + .../Server/IISHttpContext.cs | 4 +- .../Inprocess/ResponseHeaderTests.cs | 8 ++++ test/IISTestSite/Startup.cs | 43 +++++++------------ 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/samples/NativeIISSample/Properties/launchSettings.json b/samples/NativeIISSample/Properties/launchSettings.json index 7d09a120ab..6d5ce43f73 100644 --- a/samples/NativeIISSample/Properties/launchSettings.json +++ b/samples/NativeIISSample/Properties/launchSettings.json @@ -12,6 +12,7 @@ "commandName": "Executable", "executablePath": "$(IISExpressPath)", "commandLineArgs": "$(IISExpressArguments)", + "nativeDebugging": true, "environmentVariables": { "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", "ANCM_PATH": "$(TargetDir)$(AncmPath)", diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/Server/IISHttpContext.cs b/src/Microsoft.AspNetCore.Server.IISIntegration/Server/IISHttpContext.cs index f6cbe57255..e7fe04d9d4 100644 --- a/src/Microsoft.AspNetCore.Server.IISIntegration/Server/IISHttpContext.cs +++ b/src/Microsoft.AspNetCore.Server.IISIntegration/Server/IISHttpContext.cs @@ -332,10 +332,12 @@ namespace Microsoft.AspNetCore.Server.IISIntegration public unsafe void SendResponseHeaders(bool appCompleted) { // Verifies we have sent the statuscode before writing a header - var reasonPhraseBytes = Encoding.UTF8.GetBytes(ReasonPhrase ?? ReasonPhrases.GetReasonPhrase(StatusCode)); + var reasonPhrase = string.IsNullOrWhiteSpace(ReasonPhrase) ? ReasonPhrases.GetReasonPhrase(StatusCode) : ReasonPhrase; + var reasonPhraseBytes = Encoding.UTF8.GetBytes(reasonPhrase); fixed (byte* pReasonPhrase = reasonPhraseBytes) { + Debug.Assert((IntPtr)pReasonPhrase != IntPtr.Zero); // This copies data into the underlying buffer NativeMethods.http_set_response_status_code(_pInProcessHandler, (ushort)StatusCode, pReasonPhrase); } diff --git a/test/IISIntegration.FunctionalTests/Inprocess/ResponseHeaderTests.cs b/test/IISIntegration.FunctionalTests/Inprocess/ResponseHeaderTests.cs index 0ab845f1d4..8cee6643a4 100644 --- a/test/IISIntegration.FunctionalTests/Inprocess/ResponseHeaderTests.cs +++ b/test/IISIntegration.FunctionalTests/Inprocess/ResponseHeaderTests.cs @@ -40,5 +40,13 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests Assert.Equal("1", headerValues.First()); Assert.Equal("2", headerValues.Last()); } + + [ConditionalFact] + public async Task ErrorCodeIsSetForExceoptionDuringRequest() + { + var response = await _fixture.Client.GetAsync("Throw"); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + Assert.Equal("Internal Server Error", response.ReasonPhrase); + } } } diff --git a/test/IISTestSite/Startup.cs b/test/IISTestSite/Startup.cs index dd035b01a5..a74524587a 100644 --- a/test/IISTestSite/Startup.cs +++ b/test/IISTestSite/Startup.cs @@ -5,6 +5,7 @@ using System; using System.Diagnostics; using System.IO; using System.Net; +using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -23,33 +24,16 @@ namespace IISTestSite { public void Configure(IApplicationBuilder app) { - app.Map("/ServerVariable", ServerVariable); - app.Map("/AuthenticationAnonymous", AuthenticationAnonymous); - app.Map("/AuthenticationRestricted", AuthenticationRestricted); - app.Map("/AuthenticationForbidden", AuthenticationForbidden); - app.Map("/AuthenticationRestrictedNTLM", AuthenticationRestrictedNTLM); - app.Map("/FeatureCollectionSetRequestFeatures", FeatureCollectionSetRequestFeatures); - app.Map("/FeatureCollectionSetResponseFeatures", FeatureCollectionSetResponseFeatures); - app.Map("/FeatureCollectionSetConnectionFeatures", FeatureCollectionSetConnectionFeatures); - app.Map("/HelloWorld", HelloWorld); - app.Map("/LargeResponseBody", LargeResponseBody); - app.Map("/ResponseHeaders", ResponseHeaders); - app.Map("/ResponseInvalidOrdering", ResponseInvalidOrdering); - app.Map("/CheckEnvironmentVariable", CheckEnvironmentVariable); - app.Map("/CheckEnvironmentLongValueVariable", CheckEnvironmentLongValueVariable); - app.Map("/CheckAppendedEnvironmentVariable", CheckAppendedEnvironmentVariable); - app.Map("/CheckRemoveAuthEnvironmentVariable", CheckRemoveAuthEnvironmentVariable); - app.Map("/ReadAndWriteSynchronously", ReadAndWriteSynchronously); - app.Map("/ReadAndWriteEcho", ReadAndWriteEcho); - app.Map("/ReadAndWriteCopyToAsync", ReadAndWriteCopyToAsync); - app.Map("/ReadAndWriteEchoTwice", ReadAndWriteEchoTwice); - app.Map("/ReadAndWriteSlowConnection", ReadAndWriteSlowConnection); - app.Map("/WebsocketRequest", WebsocketRequest); - app.Map("/UpgradeFeatureDetection", UpgradeFeatureDetection); - app.Map("/TestInvalidReadOperations", TestInvalidReadOperations); - app.Map("/TestInvalidWriteOperations", TestInvalidWriteOperations); - app.Map("/TestReadOffsetWorks", TestReadOffsetWorks); - app.Map("/LargeResponseFile", LargeResponseFile); + foreach (var method in GetType().GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) + { + var parameters = method.GetParameters(); + if (method.Name != nameof(Configure) && + parameters.Length == 1 && + parameters[0].ParameterType == typeof(IApplicationBuilder)) + { + app.Map("/" + method.Name, innerAppBuilder => method.Invoke(this, new[] { innerAppBuilder })); + } + } } private void ServerVariable(IApplicationBuilder app) @@ -229,6 +213,11 @@ namespace IISTestSite }); } + private void Throw(IApplicationBuilder app) + { + app.Run(ctx => { throw new Exception(); }); + } + private void HelloWorld(IApplicationBuilder app) { app.Run(async ctx =>