Read() private method

private Read ( HttpWebRequest request, byte buffer, int offset, int size ) : int
request HttpWebRequest
buffer byte
offset int
size int
return int
Example #1
0
        internal void ReadAll()
        {
            if (!isRead || read_eof || totalRead >= contentLength || nextReadCalled)
            {
                if (isRead && !nextReadCalled)
                {
                    nextReadCalled = true;
                    cnc.NextRead();
                }
                return;
            }

            if (!pending.WaitOne(ReadTimeout))
            {
                throw new WebException("The operation has timed out.", WebExceptionStatus.Timeout);
            }
            lock (locker) {
                if (totalRead >= contentLength)
                {
                    return;
                }

                byte [] b    = null;
                int     diff = readBufferSize - readBufferOffset;
                int     new_size;

                if (contentLength == Int64.MaxValue)
                {
                    MemoryStream ms     = new MemoryStream();
                    byte []      buffer = null;
                    if (readBuffer != null && diff > 0)
                    {
                        ms.Write(readBuffer, readBufferOffset, diff);
                        if (readBufferSize >= 8192)
                        {
                            buffer = readBuffer;
                        }
                    }

                    if (buffer == null)
                    {
                        buffer = new byte [8192];
                    }

                    int read;
                    while ((read = cnc.Read(request, buffer, 0, buffer.Length)) != 0)
                    {
                        ms.Write(buffer, 0, read);
                    }

                    b             = ms.GetBuffer();
                    new_size      = (int)ms.Length;
                    contentLength = new_size;
                }
                else
                {
                    new_size = (int)(contentLength - totalRead);
                    b        = new byte [new_size];
                    if (readBuffer != null && diff > 0)
                    {
                        if (diff > new_size)
                        {
                            diff = new_size;
                        }

                        Buffer.BlockCopy(readBuffer, readBufferOffset, b, 0, diff);
                    }

                    int remaining = new_size - diff;
                    int r         = -1;
                    while (remaining > 0 && r != 0)
                    {
                        r          = cnc.Read(request, b, diff, remaining);
                        remaining -= r;
                        diff      += r;
                    }
                }

                readBuffer       = b;
                readBufferOffset = 0;
                readBufferSize   = new_size;
                totalRead        = 0;
                nextReadCalled   = true;
            }

            cnc.NextRead();
        }