internal bool WriteRequestAsync (SimpleAsyncResult result)
{
if (requestWritten)
return false;
requestWritten = true;
if (sendChunked || !allowBuffering || writeBuffer == null)
return false;
// Keep the call for a potential side-effect of GetBuffer
var bytes = writeBuffer.GetBuffer ();
var length = (int)writeBuffer.Length;
if (request.ContentLength != -1 && request.ContentLength < length) {
nextReadCalled = true;
cnc.Close (true);
throw new WebException ("Specified Content-Length is less than the number of bytes to write", null,
WebExceptionStatus.ServerProtocolViolation, null);
}
SetHeadersAsync (true, inner => {
if (inner.GotException) {
result.SetCompleted (inner.CompletedSynchronously, inner.Exception);
return;
}
if (cnc.Data.StatusCode != 0 && cnc.Data.StatusCode != 100) {
result.SetCompleted (inner.CompletedSynchronously);
return;
}
if (!initRead) {
initRead = true;
WebConnection.InitRead (cnc);
}
if (length == 0) {
complete_request_written = true;
result.SetCompleted (inner.CompletedSynchronously);
return;
}
cnc.BeginWrite (request, bytes, 0, length, r => {
try {
complete_request_written = cnc.EndWrite (request, false, r);
result.SetCompleted (false);
} catch (Exception exc) {
result.SetCompleted (false, exc);
}
}, null);
});
return true;
}