private void OnRead(IAsyncResult base_ares)
        {
            ChunkedInputStream.ReadBufferState readBufferState = (ChunkedInputStream.ReadBufferState)base_ares.AsyncState;
            HttpStreamAsyncResult ares = readBufferState.Ares;

            try
            {
                int num = base.EndRead(base_ares);
                this.decoder.Write(ares.Buffer, ares.Offset, num);
                num = this.decoder.Read(readBufferState.Buffer, readBufferState.Offset, readBufferState.Count);
                readBufferState.Offset += num;
                readBufferState.Count  -= num;
                if (readBufferState.Count == 0 || !this.decoder.WantMore || num == 0)
                {
                    this.no_more_data = (!this.decoder.WantMore && num == 0);
                    ares.Count        = readBufferState.InitialCount - readBufferState.Count;
                    ares.Complete();
                }
                else
                {
                    ares.Offset = 0;
                    ares.Count  = Math.Min(8192, this.decoder.ChunkLeft + 6);
                    base.BeginRead(ares.Buffer, ares.Offset, ares.Count, new AsyncCallback(this.OnRead), readBufferState);
                }
            }
            catch (Exception ex)
            {
                this.context.Connection.SendError(ex.Message, 400);
                ares.Complete(ex);
            }
        }
        public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback cback, object state)
        {
            if (this.disposed)
            {
                throw new ObjectDisposedException(base.GetType().ToString());
            }
            if (buffer == null)
            {
                throw new ArgumentNullException("buffer");
            }
            int num = buffer.Length;

            if (offset < 0 || offset > num)
            {
                throw new ArgumentOutOfRangeException("'offset' exceeds the size of buffer.");
            }
            if (count < 0 || offset > num - count)
            {
                throw new ArgumentOutOfRangeException("'offset' + 'count' exceeds the size of buffer.");
            }
            HttpStreamAsyncResult httpStreamAsyncResult = new HttpStreamAsyncResult();

            httpStreamAsyncResult.Callback = cback;
            httpStreamAsyncResult.State    = state;
            if (this.no_more_data)
            {
                httpStreamAsyncResult.Complete();
                return(httpStreamAsyncResult);
            }
            int num2 = this.decoder.Read(buffer, offset, count);

            offset += num2;
            count  -= num2;
            if (count == 0)
            {
                httpStreamAsyncResult.Count = num2;
                httpStreamAsyncResult.Complete();
                return(httpStreamAsyncResult);
            }
            if (!this.decoder.WantMore)
            {
                this.no_more_data           = (num2 == 0);
                httpStreamAsyncResult.Count = num2;
                httpStreamAsyncResult.Complete();
                return(httpStreamAsyncResult);
            }
            httpStreamAsyncResult.Buffer = new byte[8192];
            httpStreamAsyncResult.Offset = 0;
            httpStreamAsyncResult.Count  = 8192;
            ChunkedInputStream.ReadBufferState readBufferState = new ChunkedInputStream.ReadBufferState(buffer, offset, count, httpStreamAsyncResult);
            readBufferState.InitialCount += num2;
            base.BeginRead(httpStreamAsyncResult.Buffer, httpStreamAsyncResult.Offset, httpStreamAsyncResult.Count, new AsyncCallback(this.OnRead), readBufferState);
            return(httpStreamAsyncResult);
        }