Ejemplo n.º 1
0
        private async Task <(long Chunks, long Bytes)> StreamContentWithCompressionAsync(Stream reader, byte[] buffer, IServerStreamWriter <CopyFileResponse> responseStream, CancellationToken ct = default(CancellationToken))
        {
            Debug.Assert(!(reader is null));
            Debug.Assert(!(responseStream is null));

            long bytes  = 0L;
            long chunks = 0L;

            using (Stream grpcStream = new BufferedWriteStream(
                       buffer,
                       async(byte[] bf, int offset, int count) =>
            {
                ByteString content = ByteString.CopyFrom(bf, offset, count);
                CopyFileResponse response = new CopyFileResponse()
                {
                    Content = content, Index = chunks
                };
                await responseStream.WriteAsync(response);
                bytes += count;
                chunks++;
            }
                       ))

            {
                using (Stream compressionStream = new GZipStream(grpcStream, System.IO.Compression.CompressionLevel.Fastest, true))
                {
                    await reader.CopyToAsync(compressionStream, buffer.Length, ct).ConfigureAwait(false);

                    await compressionStream.FlushAsync().ConfigureAwait(false);
                }
                await grpcStream.FlushAsync().ConfigureAwait(false);
            }

            return(chunks, bytes);
        }
Ejemplo n.º 2
0
        private async Task <Result <(long Chunks, long Bytes)> > StreamContentWithCompressionAsync(Stream input, byte[] buffer, byte[] secondaryBuffer, IServerStreamWriter <CopyFileResponse> responseStream, CancellationToken ct)
        {
            long bytes  = 0L;
            long chunks = 0L;

            using (Stream grpcStream = new BufferedWriteStream(
                       buffer,
                       async(byte[] bf, int offset, int count) =>
            {
                ByteString content = ByteString.CopyFrom(bf, offset, count);
                CopyFileResponse response = new CopyFileResponse()
                {
                    Content = content, Index = chunks
                };
                await responseStream.WriteAsync(response);
                bytes += count;
                chunks++;
            }
                       ))
            {
                using (Stream compressionStream = new GZipStream(grpcStream, System.IO.Compression.CompressionLevel.Fastest, true))
                {
                    await input.CopyToAsync(compressionStream, buffer.Length, ct);

                    await compressionStream.FlushAsync(ct);
                }
                await grpcStream.FlushAsync(ct);
            }

            return(chunks, bytes);
        }