示例#1
0
            public ReadBufferState(byte[] buffer, int offset, int count, HttpStreamAsyncResult ares)
            {
                Buffer = buffer;

                Offset = offset;

                Count = count;

                InitialCount = count;

                Ares = ares;
            }
示例#2
0
        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);
            }
        }
示例#3
0
        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 = Math.Max(0, 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));
        }
示例#4
0
        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);
        }
示例#5
0
        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;
        }
示例#6
0
            public ReadBufferState(byte[] buffer, int offset, int count, HttpStreamAsyncResult ares)
            {
                Buffer = buffer;

                Offset = offset;

                Count = count;

                InitialCount = count;

                Ares = ares;
            }
示例#7
0
        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 = Math.Max(0, 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);
        }