using System; using System.IO; using System.Threading; using System.Threading.Tasks; namespace SocketHttpListener.Net { internal sealed partial class HttpResponseStream : Stream { private bool _closed; internal bool Closed => _closed; public override bool CanRead => false; public override bool CanSeek => false; public override bool CanWrite => true; public override void Flush() { } public override Task FlushAsync(CancellationToken cancellationToken) => Task.CompletedTask; public override long Length { get { throw new NotImplementedException(); } } public override long Position { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public override long Seek(long offset, SeekOrigin origin) { throw new NotImplementedException(); } public override void SetLength(long value) { throw new NotImplementedException(); } public override int Read(byte[] buffer, int offset, int count) { throw new NotImplementedException(); } public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { return base.BeginRead(buffer, offset, count, callback, state); } public override int EndRead(IAsyncResult asyncResult) { return base.EndRead(asyncResult); } public override void Write(byte[] buffer, int offset, int size) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } if (offset < 0 || offset > buffer.Length) { throw new ArgumentOutOfRangeException(nameof(offset)); } if (size < 0 || size > buffer.Length - offset) { throw new ArgumentOutOfRangeException(nameof(size)); } if (_closed) { return; } WriteCore(buffer, offset, size); } public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } if (offset < 0 || offset > buffer.Length) { throw new ArgumentOutOfRangeException(nameof(offset)); } if (size < 0 || size > buffer.Length - offset) { throw new ArgumentOutOfRangeException(nameof(size)); } return BeginWriteCore(buffer, offset, size, callback, state); } public override void EndWrite(IAsyncResult asyncResult) { if (asyncResult == null) { throw new ArgumentNullException(nameof(asyncResult)); } EndWriteCore(asyncResult); } protected override void Dispose(bool disposing) { try { if (disposing) { if (_closed) { return; } _closed = true; DisposeCore(); } } finally { base.Dispose(disposing); } } } }