Add option to remove the Server header
This commit is contained in:
parent
86567e1d93
commit
2ab01c09fd
|
|
@ -610,10 +610,15 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Http
|
||||||
var responseHeaders = _frameHeaders.ResponseHeaders;
|
var responseHeaders = _frameHeaders.ResponseHeaders;
|
||||||
responseHeaders.Reset();
|
responseHeaders.Reset();
|
||||||
var dateHeaderValues = DateHeaderValueManager.GetDateHeaderValues();
|
var dateHeaderValues = DateHeaderValueManager.GetDateHeaderValues();
|
||||||
|
|
||||||
responseHeaders.SetRawDate(dateHeaderValues.String, dateHeaderValues.Bytes);
|
responseHeaders.SetRawDate(dateHeaderValues.String, dateHeaderValues.Bytes);
|
||||||
responseHeaders.SetRawServer("Kestrel", Headers.BytesServer);
|
|
||||||
responseHeaders.SetRawContentLength("0", _bytesContentLengthZero);
|
responseHeaders.SetRawContentLength("0", _bytesContentLengthZero);
|
||||||
|
|
||||||
|
if (ServerOptions.AddServerHeader)
|
||||||
|
{
|
||||||
|
responseHeaders.SetRawServer(Constants.ServerName, Headers.BytesServer);
|
||||||
|
}
|
||||||
|
|
||||||
ResponseHeaders = responseHeaders;
|
ResponseHeaders = responseHeaders;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Infrastructure
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const string RFC1123DateFormat = "r";
|
public const string RFC1123DateFormat = "r";
|
||||||
|
|
||||||
|
public const string ServerName = "Kestrel";
|
||||||
|
|
||||||
private static int? GetECONNRESET()
|
private static int? GetECONNRESET()
|
||||||
{
|
{
|
||||||
switch (PlatformServices.Default.Runtime.OperatingSystemPlatform)
|
switch (PlatformServices.Default.Runtime.OperatingSystemPlatform)
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Infrastructure
|
||||||
|
|
||||||
if (!_headerPool.TryDequeue(out headers))
|
if (!_headerPool.TryDequeue(out headers))
|
||||||
{
|
{
|
||||||
headers = new Headers();
|
headers = new Headers(ServerOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
headers.Initialize(dateValueManager);
|
headers.Initialize(dateValueManager);
|
||||||
|
|
@ -76,11 +76,23 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Infrastructure
|
||||||
public readonly FrameRequestHeaders RequestHeaders = new FrameRequestHeaders();
|
public readonly FrameRequestHeaders RequestHeaders = new FrameRequestHeaders();
|
||||||
public readonly FrameResponseHeaders ResponseHeaders = new FrameResponseHeaders();
|
public readonly FrameResponseHeaders ResponseHeaders = new FrameResponseHeaders();
|
||||||
|
|
||||||
|
private readonly KestrelServerOptions _options;
|
||||||
|
|
||||||
|
public Headers(KestrelServerOptions options)
|
||||||
|
{
|
||||||
|
_options = options;
|
||||||
|
}
|
||||||
|
|
||||||
public void Initialize(DateHeaderValueManager dateValueManager)
|
public void Initialize(DateHeaderValueManager dateValueManager)
|
||||||
{
|
{
|
||||||
var dateHeaderValues = dateValueManager.GetDateHeaderValues();
|
var dateHeaderValues = dateValueManager.GetDateHeaderValues();
|
||||||
|
|
||||||
ResponseHeaders.SetRawDate(dateHeaderValues.String, dateHeaderValues.Bytes);
|
ResponseHeaders.SetRawDate(dateHeaderValues.String, dateHeaderValues.Bytes);
|
||||||
ResponseHeaders.SetRawServer("Kestrel", BytesServer);
|
|
||||||
|
if (_options.AddServerHeader)
|
||||||
|
{
|
||||||
|
ResponseHeaders.SetRawServer(Constants.ServerName, BytesServer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Uninitialize()
|
public void Uninitialize()
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel
|
||||||
|
|
||||||
public bool NoDelay { get; set; } = true;
|
public bool NoDelay { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the <c>Server</c> header should be included in each response.
|
||||||
|
/// </summary>
|
||||||
|
public bool AddServerHeader { get; set; } = true;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The amount of time after the server begins shutting down before connections will be forcefully closed.
|
/// The amount of time after the server begins shutting down before connections will be forcefully closed.
|
||||||
/// By default, Kestrel will wait 5 seconds for any ongoing requests to complete before terminating
|
/// By default, Kestrel will wait 5 seconds for any ongoing requests to complete before terminating
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,13 @@ namespace Microsoft.AspNetCore.Server.KestrelTests
|
||||||
{
|
{
|
||||||
public class FrameResponseHeadersTests
|
public class FrameResponseHeadersTests
|
||||||
{
|
{
|
||||||
[Fact]
|
[Theory]
|
||||||
public void InitialDictionaryContainsServerAndDate()
|
[InlineData(true)]
|
||||||
|
[InlineData(false)]
|
||||||
|
public void InitialDictionaryContainsServerAndDate(bool addServerHeader)
|
||||||
{
|
{
|
||||||
var serverOptions = new KestrelServerOptions();
|
var serverOptions = new KestrelServerOptions { AddServerHeader = addServerHeader };
|
||||||
|
|
||||||
var connectionContext = new ConnectionContext
|
var connectionContext = new ConnectionContext
|
||||||
{
|
{
|
||||||
DateHeaderValueManager = new DateHeaderValueManager(),
|
DateHeaderValueManager = new DateHeaderValueManager(),
|
||||||
|
|
@ -31,12 +34,22 @@ namespace Microsoft.AspNetCore.Server.KestrelTests
|
||||||
|
|
||||||
IDictionary<string, StringValues> headers = frame.ResponseHeaders;
|
IDictionary<string, StringValues> headers = frame.ResponseHeaders;
|
||||||
|
|
||||||
Assert.Equal(2, headers.Count);
|
if (addServerHeader)
|
||||||
|
{
|
||||||
|
Assert.Equal(2, headers.Count);
|
||||||
|
|
||||||
StringValues serverHeader;
|
StringValues serverHeader;
|
||||||
Assert.True(headers.TryGetValue("Server", out serverHeader));
|
Assert.True(headers.TryGetValue("Server", out serverHeader));
|
||||||
Assert.Equal(1, serverHeader.Count);
|
Assert.Equal(1, serverHeader.Count);
|
||||||
Assert.Equal("Kestrel", serverHeader[0]);
|
Assert.Equal("Kestrel", serverHeader[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Assert.Equal(1, headers.Count);
|
||||||
|
|
||||||
|
StringValues serverHeader;
|
||||||
|
Assert.False(headers.TryGetValue("Server", out serverHeader));
|
||||||
|
}
|
||||||
|
|
||||||
StringValues dateHeader;
|
StringValues dateHeader;
|
||||||
DateTime date;
|
DateTime date;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue