// 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.Buffers; using System.Collections.Generic; using System.IO.Pipelines; using System.Net; using System.Threading; using Microsoft.AspNetCore.Http.Features; namespace Microsoft.AspNetCore.Connections { public abstract partial class TransportConnection : ConnectionContext { private IDictionary _items; private string _connectionId; public TransportConnection() { FastReset(); } public override EndPoint LocalEndPoint { get; set; } public override EndPoint RemoteEndPoint { get; set; } public override string ConnectionId { get => _connectionId ??= CorrelationIdGenerator.GetNextId(); set => _connectionId = value; } public override IFeatureCollection Features => this; public virtual MemoryPool MemoryPool { get; } public override IDuplexPipe Transport { get; set; } public IDuplexPipe Application { get; set; } public override IDictionary Items { get => _items ??= new ConnectionItems(); set => _items = value; } public override CancellationToken ConnectionClosed { get; set; } // DO NOT remove this override to ConnectionContext.Abort. Doing so would cause // any TransportConnection that does not override Abort or calls base.Abort // to stack overflow when IConnectionLifetimeFeature.Abort() is called. // That said, all derived types should override this method should override // this implementation of Abort because canceling pending output reads is not // sufficient to abort the connection if there is backpressure. public override void Abort(ConnectionAbortedException abortReason) { Application.Input.CancelPendingRead(); } } }