public override int EndRead(IAsyncResult ares) { if (disposed) { throw new ObjectDisposedException(GetType().ToString()); } HttpStreamAsyncResult my_ares = ares as HttpStreamAsyncResult; if (ares == null) { throw new ArgumentException("Invalid IAsyncResult", "ares"); } if (!ares.IsCompleted) { ares.AsyncWaitHandle.WaitOne(); } if (my_ares.Error != null) { throw new HttpListenerException(400, "I/O operation aborted."); } return(my_ares.Count); }
void OnRead(IAsyncResult base_ares) { ReadBufferState rb = (ReadBufferState)base_ares.AsyncState; HttpStreamAsyncResult ares = rb.Ares; try { int nread = base.EndRead(base_ares); decoder.Write(ares.Buffer, ares.Offset, nread); nread = decoder.Read(rb.Buffer, rb.Offset, rb.Count); rb.Offset += nread; rb.Count -= nread; if (rb.Count == 0 || !decoder.WantMore || nread == 0) { no_more_data = !decoder.WantMore && nread == 0; ares.Count = rb.InitialCount - rb.Count; ares.Complete(); return; } ares.Offset = 0; ares.Count = Math.Min(8192, decoder.ChunkLeft + 6); base.BeginRead(ares.Buffer, ares.Offset, ares.Count, OnRead, rb); } catch (Exception e) { context.Connection.SendError(e.Message, 400); ares.Complete(e); } }
public override int EndRead(IAsyncResult ares) { if (disposed) { throw new ObjectDisposedException(typeof(RequestStream).ToString()); } if (ares == null) { throw new ArgumentNullException("async_result"); } if (ares is HttpStreamAsyncResult) { HttpStreamAsyncResult r = (HttpStreamAsyncResult)ares; if (!ares.IsCompleted) { ares.AsyncWaitHandle.WaitOne(); } return(r.SynchRead); } // Close on exception? int nread = stream.EndRead(ares); if (remaining_body > 0 && nread > 0) { remaining_body -= nread; } return(nread); }
public override IAsyncResult BeginRead(byte [] buffer, int offset, int count, AsyncCallback cback, object state) { if (disposed) { throw new ObjectDisposedException(typeof(RequestStream).ToString()); } int nread = FillFromBuffer(buffer, offset, count); if (nread > 0 || nread == -1) { HttpStreamAsyncResult ares = new HttpStreamAsyncResult(); ares.Buffer = buffer; ares.Offset = offset; ares.Count = count; ares.Callback = cback; ares.State = state; ares.SynchRead = nread; ares.Complete(); return(ares); } // Avoid reading past the end of the request to allow // for HTTP pipelining if (remaining_body >= 0 && count > remaining_body) { count = (int)Math.Min(Int32.MaxValue, remaining_body); } 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 override 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("buffer"); } int 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"); } HttpStreamAsyncResult ares = new HttpStreamAsyncResult(); ares.Callback = cback; ares.State = state; if (no_more_data) { ares.Complete(); return(ares); } int 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) { no_more_data = nread == 0; ares.Count = nread; ares.Complete(); return(ares); } ares.Buffer = new byte [8192]; ares.Offset = 0; ares.Count = 8192; ReadBufferState rb = new ReadBufferState(buffer, offset, count, ares); rb.InitialCount += nread; base.BeginRead(ares.Buffer, ares.Offset, ares.Count, OnRead, rb); return(ares); }