Avoid double allocating the HttpConnectionContext (#12225)
This commit is contained in:
parent
7f2a97a603
commit
ba15186bbe
|
|
@ -35,6 +35,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal
|
||||||
_systemClock = _context.ServiceContext.SystemClock;
|
_systemClock = _context.ServiceContext.SystemClock;
|
||||||
|
|
||||||
_timeoutControl = new TimeoutControl(this);
|
_timeoutControl = new TimeoutControl(this);
|
||||||
|
|
||||||
|
// Tests override the timeout control sometimes
|
||||||
|
_context.TimeoutControl ??= _timeoutControl;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IKestrelTrace Log => _context.ServiceContext.Log;
|
private IKestrelTrace Log => _context.ServiceContext.Log;
|
||||||
|
|
@ -48,31 +51,18 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal
|
||||||
|
|
||||||
IRequestProcessor requestProcessor = null;
|
IRequestProcessor requestProcessor = null;
|
||||||
|
|
||||||
var httpConnectionContext = new HttpConnectionContext
|
|
||||||
{
|
|
||||||
ConnectionId = _context.ConnectionId,
|
|
||||||
ConnectionFeatures = _context.ConnectionFeatures,
|
|
||||||
MemoryPool = _context.MemoryPool,
|
|
||||||
LocalEndPoint = _context.LocalEndPoint,
|
|
||||||
RemoteEndPoint = _context.RemoteEndPoint,
|
|
||||||
ServiceContext = _context.ServiceContext,
|
|
||||||
ConnectionContext = _context.ConnectionContext,
|
|
||||||
TimeoutControl = _timeoutControl,
|
|
||||||
Transport = _context.Transport
|
|
||||||
};
|
|
||||||
|
|
||||||
switch (SelectProtocol())
|
switch (SelectProtocol())
|
||||||
{
|
{
|
||||||
case HttpProtocols.Http1:
|
case HttpProtocols.Http1:
|
||||||
// _http1Connection must be initialized before adding the connection to the connection manager
|
// _http1Connection must be initialized before adding the connection to the connection manager
|
||||||
requestProcessor = _http1Connection = new Http1Connection(httpConnectionContext);
|
requestProcessor = _http1Connection = new Http1Connection(_context);
|
||||||
_protocolSelectionState = ProtocolSelectionState.Selected;
|
_protocolSelectionState = ProtocolSelectionState.Selected;
|
||||||
break;
|
break;
|
||||||
case HttpProtocols.Http2:
|
case HttpProtocols.Http2:
|
||||||
// _http2Connection must be initialized before yielding control to the transport thread,
|
// _http2Connection must be initialized before yielding control to the transport thread,
|
||||||
// to prevent a race condition where _http2Connection.Abort() is called just as
|
// to prevent a race condition where _http2Connection.Abort() is called just as
|
||||||
// _http2Connection is about to be initialized.
|
// _http2Connection is about to be initialized.
|
||||||
requestProcessor = new Http2Connection(httpConnectionContext);
|
requestProcessor = new Http2Connection(_context);
|
||||||
_protocolSelectionState = ProtocolSelectionState.Selected;
|
_protocolSelectionState = ProtocolSelectionState.Selected;
|
||||||
break;
|
break;
|
||||||
case HttpProtocols.None:
|
case HttpProtocols.None:
|
||||||
|
|
|
||||||
|
|
@ -34,12 +34,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal
|
||||||
ServiceContext = _serviceContext,
|
ServiceContext = _serviceContext,
|
||||||
ConnectionFeatures = connectionContext.Features,
|
ConnectionFeatures = connectionContext.Features,
|
||||||
MemoryPool = memoryPoolFeature.MemoryPool,
|
MemoryPool = memoryPoolFeature.MemoryPool,
|
||||||
Transport = connectionContext.Transport
|
Transport = connectionContext.Transport,
|
||||||
|
LocalEndPoint = connectionContext.LocalEndPoint as IPEndPoint,
|
||||||
|
RemoteEndPoint = connectionContext.RemoteEndPoint as IPEndPoint
|
||||||
};
|
};
|
||||||
|
|
||||||
httpConnectionContext.LocalEndPoint = connectionContext.LocalEndPoint as IPEndPoint;
|
|
||||||
httpConnectionContext.RemoteEndPoint = connectionContext.RemoteEndPoint as IPEndPoint;
|
|
||||||
|
|
||||||
var connection = new HttpConnection(httpConnectionContext);
|
var connection = new HttpConnection(httpConnectionContext);
|
||||||
|
|
||||||
return connection.ProcessRequestsAsync(_application);
|
return connection.ProcessRequestsAsync(_application);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue