private void ExtractFileFromStream( LimitedStream sourceStream, Stream targetStream, long fileSize, ICryptoTransform decryptor, DecompressorCreator createDecompressor, Action <double> onProgress, CancellationToken cancellationToken) { using (var cryptoStream = new CryptoStream(sourceStream, decryptor, CryptoStreamMode.Read)) { using (var wrapperStream = new GZipReadWrapperStream(cryptoStream)) { using (Stream decompressionStream = createDecompressor(wrapperStream)) { try { const int bufferSize = 128 * 1024; var buffer = new byte[bufferSize]; int count; while ((count = decompressionStream.Read(buffer, 0, buffer.Length)) > 0) { cancellationToken.ThrowIfCancellationRequested(); targetStream.Write(buffer, 0, count); long bytesProcessed = sourceStream.Limit - sourceStream.BytesLeft; onProgress(bytesProcessed / (double)fileSize); } } catch (OperationCanceledException) { throw; } catch (Exception e) { DebugLogger.LogException(e); PatcherLogManager logManager = PatcherLogManager.Instance; PatcherLogSentryRegistry sentryRegistry = logManager.SentryRegistry; RavenClient ravenClient = sentryRegistry.RavenClient; var sentryEvent = new SentryEvent(e); PatcherLogSentryRegistry.AddDataToSentryEvent(sentryEvent, logManager.Storage.Guid.ToString()); ravenClient.Capture(sentryEvent); throw; } } } } }
public void Wrapped_Read_Succeeds_On_Mocked_Stream() { string decompressed; using (var targetStream = new MemoryStream()) { using (var mockStream = new MockStream(compressedData, 5)) { using (var wrapperStream = new GZipReadWrapperStream(mockStream)) { using (var gzipStream = new GZipStream(wrapperStream, CompressionMode.Decompress)) { Streams.Copy(gzipStream, targetStream); } } } decompressed = Encoding.ASCII.GetString(targetStream.ToArray()); } Assert.That(decompressed == RawData); }