public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { // Validate inputs if (buffer == _arrayPoolBuffer) { throw new ArgumentException(nameof(buffer)); } _deflateStream.EnsureNotDisposed(); if (count <= 0) { return; } else if (count > buffer.Length - offset) { // The source stream is either malicious or poorly implemented and returned a number of // bytes larger than the buffer supplied to it. throw new InvalidDataException("Found invalid data while decoding."); } // Feed the data from base stream into the decompression engine. _deflateStream._inflater.SetInput(buffer, offset, count); // While there's more decompressed data available, forward it to the destination stream. while (true) { int bytesRead = _deflateStream._inflater.Inflate(_arrayPoolBuffer, 0, _arrayPoolBuffer.Length); if (bytesRead > 0) { if (bytesRead > _arrayPoolBufferHighWaterMark) { _arrayPoolBufferHighWaterMark = bytesRead; } await _destination.WriteAsync(_arrayPoolBuffer, 0, bytesRead, cancellationToken).ConfigureAwait(false); } else { break; } } }