Add queue name to HttpSysOptions (#13846)
* Check for MAX_PATH * Update ref assemblies * Add test to check queue name * PR feedback * Bad rebase + PR comments Resolves #13461
This commit is contained in:
parent
0079423514
commit
04f37e59d5
|
|
@ -52,6 +52,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys
|
|||
public long? MaxConnections { get { throw null; } set { } }
|
||||
public long? MaxRequestBodySize { get { throw null; } set { } }
|
||||
public long RequestQueueLimit { get { throw null; } set { } }
|
||||
public string RequestQueueName { get { throw null; } set { } }
|
||||
public bool ThrowWriteExceptions { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } [System.Runtime.CompilerServices.CompilerGeneratedAttribute]set { } }
|
||||
public Microsoft.AspNetCore.Server.HttpSys.TimeoutManager Timeouts { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||
public Microsoft.AspNetCore.Server.HttpSys.UrlPrefixCollection UrlPrefixes { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys
|
|||
|
||||
_urlGroup = new UrlGroup(_serverSession, Logger);
|
||||
|
||||
_requestQueue = new RequestQueue(_urlGroup, Logger);
|
||||
_requestQueue = new RequestQueue(_urlGroup, options.RequestQueueName, Logger);
|
||||
|
||||
_disconnectListener = new DisconnectListener(_requestQueue, Logger);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys
|
|||
{
|
||||
public class HttpSysOptions
|
||||
{
|
||||
private const uint MaximumRequestQueueNameLength = 260;
|
||||
private const Http503VerbosityLevel DefaultRejectionVerbosityLevel = Http503VerbosityLevel.Basic; // Http.sys default.
|
||||
private const long DefaultRequestQueueLength = 1000; // Http.sys default.
|
||||
internal static readonly int DefaultMaxAccepts = 5 * Environment.ProcessorCount;
|
||||
|
|
@ -23,11 +24,30 @@ namespace Microsoft.AspNetCore.Server.HttpSys
|
|||
private RequestQueue _requestQueue;
|
||||
private UrlGroup _urlGroup;
|
||||
private long? _maxRequestBodySize = DefaultMaxRequestBodySize;
|
||||
private string _requestQueueName;
|
||||
|
||||
public HttpSysOptions()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The name of the Http.Sys request queue
|
||||
/// </summary>
|
||||
public string RequestQueueName
|
||||
{
|
||||
get => _requestQueueName;
|
||||
set
|
||||
{
|
||||
if (value.Length > MaximumRequestQueueNameLength)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(value),
|
||||
value,
|
||||
$"The request queue name should be fewer than {MaximumRequestQueueNameLength} characters in length");
|
||||
}
|
||||
_requestQueueName = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The maximum number of concurrent accepts.
|
||||
/// </summary>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
|
|
@ -18,14 +18,14 @@ namespace Microsoft.AspNetCore.Server.HttpSys
|
|||
private readonly ILogger _logger;
|
||||
private bool _disposed;
|
||||
|
||||
internal RequestQueue(UrlGroup urlGroup, ILogger logger)
|
||||
internal RequestQueue(UrlGroup urlGroup, string requestQueueName, ILogger logger)
|
||||
{
|
||||
_urlGroup = urlGroup;
|
||||
_logger = logger;
|
||||
|
||||
HttpRequestQueueV2Handle requestQueueHandle = null;
|
||||
var statusCode = HttpApi.HttpCreateRequestQueue(
|
||||
HttpApi.Version, null, null, 0, out requestQueueHandle);
|
||||
HttpApi.Version, requestQueueName, null, 0, out requestQueueHandle);
|
||||
|
||||
if (statusCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System.Linq;
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
|
|
@ -32,6 +33,30 @@ namespace Microsoft.AspNetCore.Server.HttpSys
|
|||
}
|
||||
}
|
||||
|
||||
[ConditionalFact]
|
||||
public async Task Server_SetQueueName_Success()
|
||||
{
|
||||
string address;
|
||||
var queueName = Guid.NewGuid().ToString();
|
||||
using (Utilities.CreateHttpServer(out address, httpContext =>
|
||||
{
|
||||
return Task.FromResult(0);
|
||||
}, options =>
|
||||
{
|
||||
options.RequestQueueName = queueName;
|
||||
}))
|
||||
{
|
||||
var psi = new ProcessStartInfo("netsh", "http show servicestate view=requestq")
|
||||
{
|
||||
RedirectStandardOutput = true
|
||||
};
|
||||
using var process = Process.Start(psi);
|
||||
process.Start();
|
||||
var netshOutput = await process.StandardOutput.ReadToEndAsync();
|
||||
Assert.Contains(queueName, netshOutput);
|
||||
}
|
||||
}
|
||||
|
||||
[ConditionalFact]
|
||||
public async Task Server_SendHelloWorld_Success()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -122,6 +122,13 @@ namespace Microsoft.AspNetCore.Server.HttpSys
|
|||
internal static MessagePump CreatePump()
|
||||
=> new MessagePump(Options.Create(new HttpSysOptions()), new LoggerFactory(), new AuthenticationSchemeProvider(Options.Create(new AuthenticationOptions())));
|
||||
|
||||
internal static MessagePump CreatePump(Action<HttpSysOptions> configureOptions)
|
||||
{
|
||||
var options = new HttpSysOptions();
|
||||
configureOptions(options);
|
||||
return new MessagePump(Options.Create(options), new LoggerFactory(), new AuthenticationSchemeProvider(Options.Create(new AuthenticationOptions())));
|
||||
}
|
||||
|
||||
internal static IServer CreateDynamicHttpServer(string basePath, out string root, out string baseAddress, Action<HttpSysOptions> configureOptions, RequestDelegate app)
|
||||
{
|
||||
lock (PortLock)
|
||||
|
|
@ -134,9 +141,8 @@ namespace Microsoft.AspNetCore.Server.HttpSys
|
|||
root = prefix.Scheme + "://" + prefix.Host + ":" + prefix.Port;
|
||||
baseAddress = prefix.ToString();
|
||||
|
||||
var server = CreatePump();
|
||||
var server = CreatePump(configureOptions);
|
||||
server.Features.Get<IServerAddressesFeature>().Addresses.Add(baseAddress);
|
||||
configureOptions(server.Listener.Options);
|
||||
try
|
||||
{
|
||||
server.StartAsync(new DummyApplication(app), CancellationToken.None).Wait();
|
||||
|
|
|
|||
Loading…
Reference in New Issue