public IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback cback, object state) { if (_disposed) { throw new ObjectDisposedException(typeof(RequestStream).ToString()); } var nread = FillFromBuffer(buffer, offset, count); if (nread > 0 || nread == -1) { var ares = new HttpStreamAsyncResult { Buffer = buffer, Offset = offset, Count = count, Callback = cback, State = state, SynchRead = Math.Max(0, nread) }; ares.Complete(); return(ares); } // Avoid reading past the end of the request to allow // for HTTP pipelining if (_remainingBody >= 0 && count > _remainingBody) { count = (int)Math.Min(int.MaxValue, _remainingBody); } return(_stream.BeginRead(buffer, offset, count, cback, state)); }
public ReadBufferState(byte[] buffer, int offset, int count, HttpStreamAsyncResult ares) { Buffer = buffer; Offset = offset; Count = count; InitialCount = count; Ares = ares; }
public new IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback cback, object state) { if (_disposed) throw new ObjectDisposedException(GetType().ToString()); if (buffer == null) throw new ArgumentNullException(nameof(buffer)); var len = buffer.Length; if (offset < 0 || offset > len) throw new ArgumentOutOfRangeException("offset exceeds the size of buffer"); if (count < 0 || offset > len - count) throw new ArgumentOutOfRangeException("offset+size exceeds the size of buffer"); var ares = new HttpStreamAsyncResult { Callback = cback, State = state }; if (_noMoreData) { ares.Complete(); return ares; } var nread = Decoder.Read(buffer, offset, count); offset += nread; count -= nread; if (count == 0) { // got all we wanted, no need to bother the decoder yet ares.Count = nread; ares.Complete(); return ares; } if (!Decoder.WantMore) { _noMoreData = nread == 0; ares.Count = nread; ares.Complete(); return ares; } ares.Buffer = new byte[8192]; ares.Offset = 0; ares.Count = 8192; var rb = new ReadBufferState(buffer, offset, count, ares); rb.InitialCount += nread; base.BeginRead(ares.Buffer, ares.Offset, ares.Count, OnRead, rb); return ares; }
public new IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback cback, object state) { if (_disposed) { throw new ObjectDisposedException(GetType().ToString()); } if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } var len = buffer.Length; if (offset < 0 || offset > len) { throw new ArgumentOutOfRangeException(nameof(offset), "offset exceeds the size of buffer"); } if (count < 0 || offset > len - count) { throw new ArgumentOutOfRangeException(nameof(offset), "offset+size exceeds the size of buffer"); } var ares = new HttpStreamAsyncResult { Callback = cback, State = state }; if (_noMoreData) { ares.Complete(); return(ares); } var nread = Decoder.Read(buffer, offset, count); offset += nread; count -= nread; if (count == 0) { // got all we wanted, no need to bother the decoder yet ares.Count = nread; ares.Complete(); return(ares); } if (!Decoder.WantMore) { _noMoreData = nread == 0; ares.Count = nread; ares.Complete(); return(ares); } ares.Buffer = new byte[8192]; ares.Offset = 0; ares.Count = 8192; var rb = new ReadBufferState(buffer, offset, count, ares); rb.InitialCount += nread; base.BeginRead(ares.Buffer, ares.Offset, ares.Count, OnRead, rb); return(ares); }