Set connection close with a switch for ANCM out of process (#16643)

This commit is contained in:
Justin Kotalik 2019-10-30 13:19:39 -07:00 committed by GitHub
parent d427e43d78
commit 76193ecdfd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 64 additions and 2 deletions

View File

@ -14,6 +14,7 @@ class ConfigUtility
#define CS_ASPNETCORE_HANDLER_SETTINGS L"handlerSettings"
#define CS_ASPNETCORE_HANDLER_VERSION L"handlerVersion"
#define CS_ASPNETCORE_DEBUG_FILE L"debugFile"
#define CS_ASPNETCORE_FORWARD_RESPONSE_CONNECTION_HEADER L"forwardResponseConnectionHeader"
#define CS_ASPNETCORE_DEBUG_LEVEL L"debugLevel"
#define CS_ASPNETCORE_HANDLER_SETTINGS_NAME L"name"
#define CS_ASPNETCORE_HANDLER_SETTINGS_VALUE L"value"
@ -40,6 +41,13 @@ public:
return FindKeyValuePair(pElement, CS_ASPNETCORE_DEBUG_LEVEL, strDebugFile);
}
static
HRESULT
FindForwardResponseConnectionHeader(IAppHostElement* pElement, STRU& strForwardResponseConnectionHeader)
{
return FindKeyValuePair(pElement, CS_ASPNETCORE_FORWARD_RESPONSE_CONNECTION_HEADER, strForwardResponseConnectionHeader);
}
private:
static
HRESULT

View File

@ -55,6 +55,7 @@ FORWARDING_HANDLER::FORWARDING_HANDLER(
LOG_TRACE(L"FORWARDING_HANDLER::FORWARDING_HANDLER");
m_fWebSocketSupported = m_pApplication->QueryWebsocketStatus();
m_fForwardResponseConnectionHeader = m_pApplication->QueryConfig()->QueryForwardResponseConnectionHeader()->Equals(L"true", /* ignoreCase */ 1);
InitializeSRWLock(&m_RequestLock);
}
@ -2212,10 +2213,14 @@ FORWARDING_HANDLER::SetStatusAndHeaders(
break;
}
__fallthrough;
case HttpHeaderConnection:
case HttpHeaderDate:
continue;
case HttpHeaderConnection:
if (!m_fForwardResponseConnectionHeader)
{
continue;
}
break;
case HttpHeaderServer:
fServerHeaderPresent = TRUE;
break;

View File

@ -179,6 +179,7 @@ private:
HINTERNET m_hRequest;
FORWARDING_REQUEST_STATUS m_RequestStatus;
BOOL m_fForwardResponseConnectionHeader;
BOOL m_fWebSocketEnabled;
BOOL m_fWebSocketSupported;
BOOL m_fResponseHeadersReceivedAndSet;

View File

@ -379,6 +379,12 @@ REQUESTHANDLER_CONFIG::Populate(
goto Finished;
}
hr = ConfigUtility::FindForwardResponseConnectionHeader(pAspNetCoreElement, m_struForwardResponseConnectionHeader);
if (FAILED(hr))
{
goto Finished;
}
Finished:
if (pAspNetCoreElement != NULL)

View File

@ -218,6 +218,12 @@ public:
return &m_struConfigPath;
}
STRU*
QueryForwardResponseConnectionHeader()
{
return &m_struForwardResponseConnectionHeader;
}
protected:
//
@ -249,6 +255,7 @@ protected:
STRU m_struApplicationPhysicalPath;
STRU m_struApplicationVirtualPath;
STRU m_struConfigPath;
STRU m_struForwardResponseConnectionHeader;
BOOL m_fStdoutLogEnabled;
BOOL m_fForwardWindowsAuthToken;
BOOL m_fDisableStartUpErrorPage;

View File

@ -162,6 +162,35 @@ namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests
Assert.Equal("NOVALUE", await client.GetStringAsync("/HTTPS_PORT"));
}
[ConditionalFact]
[RequiresNewHandler]
[RequiresNewShim]
public async Task SetsConnectionCloseHeader()
{
// Only tests OutOfProcess as the Connection header is removed for out of process and not inprocess.
// This test checks a quirk to allow setting the Connection header.
var deploymentParameters = Fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess);
deploymentParameters.HandlerSettings["forwardResponseConnectionHeader"] = "true";
var deploymentResult = await DeployAsync(deploymentParameters);
var response = await deploymentResult.HttpClient.GetAsync("ConnectionClose");
Assert.Equal(true, response.Headers.ConnectionClose);
}
[ConditionalFact]
[RequiresNewHandler]
[RequiresNewShim]
public async Task ConnectionCloseIsNotPropagated()
{
var deploymentParameters = Fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess);
var deploymentResult = await DeployAsync(deploymentParameters);
var response = await deploymentResult.HttpClient.GetAsync("ConnectionClose");
Assert.Null(response.Headers.ConnectionClose);
}
private static HttpClient CreateNonValidatingClient(IISDeploymentResult deploymentResult)
{
var handler = new HttpClientHandler

View File

@ -144,6 +144,12 @@ namespace TestSite
return Task.CompletedTask;
}
public Task ConnectionClose(HttpContext context)
{
context.Response.Headers["connection"] = "close";
return Task.CompletedTask;
}
public Task OverrideServer(HttpContext context)
{
context.Response.Headers["Server"] = "MyServer/7.8";