private static async Task ProcessClient <TContext>(IHttpApplication <TContext> application, IReadableChannel input, IWritableChannel output) { var connection = new HttpConnection <TContext>(application, input, output); await connection.ProcessAllRequests(); output.CompleteWriting(); input.CompleteReading(); }
private static async Task ReadLines(IReadableChannel channel) { // Using SIMD to scan through bytes quickly var newLine = new Vector <byte>((byte)'\n'); while (true) { await channel; var iter = channel.BeginRead().Begin; var start = iter; // If we're at the end of the channel then stop if (iter.IsEnd && channel.Completion.IsCompleted) { break; } try { while (iter.Seek(ref newLine) != -1) { // Get the daata from the start to where we found the \n var line = start.GetArraySegment(iter); Console.WriteLine(Encoding.UTF8.GetString(line.Array, line.Offset, line.Count)); // Skip /n iter.Skip(1); start = iter; } } finally { channel.EndRead(iter); } } // Tell te channel we're done consuming channel.CompleteReading(); }
private async void Process(IReadableChannel inner) { while (true) { await inner; var span = inner.BeginRead(); if (span.Begin.IsEnd && inner.Completion.IsCompleted) { break; } // PERF: This might copy var data = span.Begin.GetArraySegment(span.End); var iter = _channel.BeginWrite(); for (int i = 0; i < data.Count; i++) { byte b = data.Array[data.Offset + i]; if (b >= 'a' && b <= 'z') { // To upper iter.Write((byte)(b & 0xdf)); } else { // Leave it alone iter.Write(b); } } await _channel.EndWriteAsync(iter); inner.EndRead(span.End); } inner.CompleteReading(); _channel.CompleteWriting(); }
public async Task Execute(IReadableChannel input, IWritableChannel output) { while (true) { var inputBuffer = await input.ReadAsync(); if (inputBuffer.IsEmpty && input.Completion.IsCompleted) { break; } var writerBuffer = output.Alloc(2048); var span = inputBuffer.FirstSpan; if (span.Length > 0) { unsafe { _inflater.SetInput((IntPtr)span.UnsafePointer, span.Length); int written = _inflater.Inflate((IntPtr)writerBuffer.Memory.UnsafePointer, writerBuffer.Memory.Length); writerBuffer.CommitBytes(written); var consumed = span.Length - _inflater.AvailableInput; inputBuffer = inputBuffer.Slice(0, consumed); } } inputBuffer.Consumed(); await writerBuffer.FlushAsync(); } input.CompleteReading(); output.CompleteWriting(); _inflater.Dispose(); }
public async Task Execute(IReadableChannel input, IWritableChannel output) { while (true) { await input; var inputBuffer = input.BeginRead(); if (inputBuffer.IsEmpty && input.Completion.IsCompleted) { break; } var writerBuffer = output.Alloc(2048); var span = inputBuffer.FirstSpan; if (span.Length > 0) { _inflater.SetInput(span.BufferPtr, span.Length); int written = _inflater.Inflate(writerBuffer.Memory.BufferPtr, writerBuffer.Memory.Length); writerBuffer.UpdateWritten(written); var consumed = span.Length - _inflater.AvailableInput; inputBuffer = inputBuffer.Slice(0, consumed); } input.EndRead(inputBuffer); await output.WriteAsync(writerBuffer); } input.CompleteReading(); output.CompleteWriting(); _inflater.Dispose(); }
public async Task Execute(IReadableChannel input, IWritableChannel output) { while (true) { var inputBuffer = await input; if (inputBuffer.IsEmpty && input.Completion.IsCompleted) { break; } var writerBuffer = output.Alloc(2048); var span = inputBuffer.FirstSpan; _deflater.SetInput(span.BufferPtr, span.Length); while (!_deflater.NeedsInput()) { int written = _deflater.ReadDeflateOutput(writerBuffer.Memory.BufferPtr, writerBuffer.Memory.Length); writerBuffer.CommitBytes(written); } var consumed = span.Length - _deflater.AvailableInput; inputBuffer = inputBuffer.Slice(0, consumed); inputBuffer.Consumed(); await writerBuffer.FlushAsync(); } bool flushed; do { // Need to do more stuff here var writerBuffer = output.Alloc(2048); int compressedBytes; flushed = _deflater.Flush(writerBuffer.Memory.BufferPtr, writerBuffer.Memory.Length, out compressedBytes); writerBuffer.CommitBytes(compressedBytes); await writerBuffer.FlushAsync(); }while (flushed); bool finished; do { // Need to do more stuff here var writerBuffer = output.Alloc(2048); int compressedBytes; finished = _deflater.Finish(writerBuffer.Memory.BufferPtr, writerBuffer.Memory.Length, out compressedBytes); writerBuffer.CommitBytes(compressedBytes); await writerBuffer.FlushAsync(); }while (!finished); input.CompleteReading(); output.CompleteWriting(); _deflater.Dispose(); }