private Read ( |
||
request | ||
buffer | byte | |
offset | int | |
size | int | |
Результат | int |
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(); }