Add option to remove the Server header

This commit is contained in:
Kristian Hellang 2016-05-20 13:12:32 +02:00
parent 86567e1d93
commit 2ab01c09fd
5 changed files with 48 additions and 11 deletions

View File

@ -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;
} }
} }

View File

@ -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)

View File

@ -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()

View File

@ -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

View File

@ -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;