public override ValueTask <FlushResult> FlushAsync(CancellationToken cancellationToken) { try { while (!_buffer.IsEmpty) { var memory = _buffer.GetOccupiedMemory(); _logger.LogTrace("TODO: SendStarting {bytes}", memory.Length); var bytes = _socket.Send(memory); _logger.LogTrace("TODO: SendComplete {bytes}", bytes); _buffer.ConsumeOccupiedMemory(bytes); } } catch (Exception ex) { _logger.LogTrace(ex, "TODO: SendError"); // Return FlushResult.IsCompleted true from now on // because we assume any write exceptions are not temporary _isCompleted = true; #if NETSTANDARD2_0 FireReaderCompleted(ex); #endif } return(new ValueTask <FlushResult>(new FlushResult( isCanceled: IsCanceled, isCompleted: IsCompleted))); }
public override async ValueTask <ReadResult> ReadAsync(CancellationToken cancellationToken) { if (_bufferHasUnexaminedData == false && IsCompleted == false) { try { // memory based on default page size for MemoryPool being used var memory = _buffer.GetTrailingMemory(); _logger.LogTrace("TODO: ReadStarting"); var bytes = await _socket.ReceiveAsync(memory, cancellationToken); _logger.LogTrace("TODO: ReadComplete {bytes}", bytes); if (bytes != 0) { // advance rolling memory based on number of bytes received _buffer.TrailingMemoryFilled(bytes); // the new bytes have not been examined yet. this flag // is true until the parser calls AdvanceTo with // an examined SequencePosition corresponding to the tail _bufferHasUnexaminedData = true; } else { // reading 0 bytes means the remote client has // sent FIN and no more bytes will be received _isCompleted = true; _connection.FireConnectionClosed(); } } catch (TaskCanceledException) { _logger.LogTrace("TODO: ReadCanceled"); _isCanceled = true; _connection.FireConnectionClosed(); } catch (Exception ex) { _logger.LogTrace(ex, "TODO: ReadFailed"); // Return ReadResult.IsCompleted == true from now on // because we assume any read exceptions are not temporary _isCompleted = true; _connection.FireConnectionClosed(); #if NETSTANDARD2_0 FireWriterCompleted(ex); #endif } } return(new ReadResult( _buffer.GetOccupiedMemory(), isCanceled: IsCanceled, isCompleted: IsCompleted)); }
public Connection( IConnectionLogger logger, InlineSocketsOptions options, INetworkSocket socket) { Features = new FeatureCollection(this); _logger = logger; _options = options; _socket = socket; RemoteEndPoint = _socket.RemoteEndPoint; LocalEndPoint = _socket.LocalEndPoint; (_socketInput, _socketOutput) = options.CreateSocketPipelines(this, socket); _connectionClosedTokenSource = new CancellationTokenSource(); _connectionClosedTokenSource.Token.Register(() => _logger.LogTrace("TODO: ConnectionClosed")); }