public static byte[] ReadToEnd(this Stream stream, int bufferSize = 1024, int length = 0, long maxLength = 0,
Logger logger = null)
{
ArgumentGuard.NotNull(stream, nameof(stream));
using (var ms = length == 0 ? new MemoryStream() : new MemoryStream(length))
{
byte[] array = new byte[bufferSize];
int count;
long maxPosition = maxLength - bufferSize;
bool stillReading = true;
NetworkStream networkStream = stream as NetworkStream;
logger?.Log(TraceLevel.Debug, Stage.General,
new { message = "start reading", streamType = stream.GetType().Name });
while (stillReading && (networkStream?.DataAvailable ?? true) && (count = stream.Read(array, 0, array.Length)) != 0)
{
if (maxLength > 0 && ms.Position >= maxPosition)
{
stillReading = false;
count = (int)Math.Max(0, maxLength - ms.Position);
}
ms.Write(array, 0, count);
}
byte[] bytes = ms.ToArray();
logger?.Log(TraceLevel.Debug, Stage.General,
new { message = "done reading", streamType = stream.GetType().Name, bytesRead = bytes.Length });
return bytes;
}
}