using System; using System.IO; namespace ln.http; public class HttpRequestStream : Stream { public int MemoryLimit { get; set; } = 1024 * 1024 * 10; private Stream _stream; private string _tempFileName; public HttpRequestStream(Stream connectionStream, int length) { byte[] transferBuffer; // if (length <= MemoryLimit) // { // transferBuffer = new byte[length]; // if (connectionStream.ReadExactly(transferBuffer, 0, transferBuffer.Length) != length) // throw new IOException(); // // _stream = new MemoryStream(transferBuffer); // } // else // { _tempFileName = Path.GetTempFileName(); _stream = new FileStream(_tempFileName, FileMode.Open, FileAccess.ReadWrite); transferBuffer = new byte[MemoryLimit]; while (length > 0) { int size = length > transferBuffer.Length ? transferBuffer.Length : length; int nread = connectionStream.Read(transferBuffer, 0, size); _stream.Write(transferBuffer, 0, nread); length -= nread; } _stream.Position = 0; // } } public override int Read(byte[] buffer, int offset, int count) => _stream.Read(buffer, offset, count); public override long Seek(long offset, SeekOrigin origin) => _stream.Seek(offset, origin); public override void SetLength(long value) => throw new System.NotImplementedException(); public override void Write(byte[] buffer, int offset, int count) => throw new System.NotImplementedException(); public override void Flush() => throw new System.NotImplementedException(); public override bool CanRead { get; } = true; public override bool CanSeek { get; } = true; public override bool CanWrite { get; } = false; public override long Length => _stream.Length; public override long Position { get => _stream.Position; set => _stream.Position = value; } public override int Read(Span buffer) => _stream.Read(buffer); public override void Close() => _stream.Close(); protected override void Dispose(bool disposing) { _stream.Dispose(); if (_tempFileName is not null) File.Delete(_tempFileName); } }