// Copyright © 2017 The CefSharp Authors. All rights reserved. // // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. using System; using System.IO; namespace CefSharp.ResponseFilter { /// /// StreamResponseFilter - copies all data from IResponseFilter.Filter /// to the provided Stream. The must be writable, no data will be copied otherwise. /// The StreamResponseFilter will release it's reference (set to null) to the when it's Disposed. /// public class StreamResponseFilter : IResponseFilter { private Stream responseStream; /// /// StreamResponseFilter constructor /// /// a writable stream public StreamResponseFilter(Stream stream) { responseStream = stream; } bool IResponseFilter.InitFilter() { return responseStream != null && responseStream.CanWrite; } FilterStatus IResponseFilter.Filter(Stream dataIn, out long dataInRead, Stream dataOut, out long dataOutWritten) { if (dataIn == null) { dataInRead = 0; dataOutWritten = 0; return FilterStatus.Done; } //Calculate how much data we can read, in some instances dataIn.Length is //greater than dataOut.Length dataInRead = Math.Min(dataIn.Length, dataOut.Length); dataOutWritten = dataInRead; var readBytes = new byte[dataInRead]; dataIn.Read(readBytes, 0, readBytes.Length); dataOut.Write(readBytes, 0, readBytes.Length); //Write buffer to the memory stream responseStream.Write(readBytes, 0, readBytes.Length); //If we read less than the total amount avaliable then we need //return FilterStatus.NeedMoreData so we can then write the rest if (dataInRead < dataIn.Length) { return FilterStatus.NeedMoreData; } return FilterStatus.Done; } void IDisposable.Dispose() { responseStream = null; } } }