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 == Int32.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 = 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 ();
}