internal int Read (HttpWebRequest request, byte [] buffer, int offset, int size)
{
lock (this) {
if (Data.request != request)
throw new ObjectDisposedException (typeof (NetworkStream).FullName);
if (nstream == null)
return 0;
}
int result = 0;
try {
bool done = false;
if (!chunkedRead) {
result = nstream.Read (buffer, offset, size);
done = (result == 0);
}
if (chunkedRead) {
try {
chunkStream.WriteAndReadBack (buffer, offset, size, ref result);
if (!done && result == 0 && chunkStream.WantMore)
result = EnsureRead (buffer, offset, size);
} catch (Exception e) {
HandleError (WebExceptionStatus.ReceiveFailure, e, "chunked Read1");
throw;
}
if ((done || result == 0) && chunkStream.WantMore) {
HandleError (WebExceptionStatus.ReceiveFailure, null, "chunked Read2");
throw new WebException ("Read error", null, WebExceptionStatus.ReceiveFailure, null);
}
}
} catch (Exception e) {
HandleError (WebExceptionStatus.ReceiveFailure, e, "Read");
}
return result;
}