63 lines
2.3 KiB
C#
63 lines
2.3 KiB
C#
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<byte> 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);
|
|
}
|
|
} |