Example #1
0
        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;
 }
Example #3
0
        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;
        }
Example #4
0
 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(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);
        }