private long WriteSingleContent(Stream stream, IHttpContent content, Action <UploadStatusMessage> uploadStatusCallback, int blockSize, long overallContentLength, long totalContentUploadedOverall) { long contentLength = content.GetContentLength(); int contentUploadedThisRound = 0; int totalContentUploaded = 0; byte[] requestBuffer = null; Stream contentStream = null; if (content.ContentReadAction == ContentReadAction.Stream) { requestBuffer = new byte[blockSize]; contentStream = content.ReadAsStream(); } else { requestBuffer = content.ReadAsByteArray(); } while (totalContentUploaded != contentLength) { contentUploadedThisRound = 0; if (content.ContentReadAction == ContentReadAction.Stream) { int read = 0; while ((read = contentStream.Read(requestBuffer, read, blockSize - read)) > 0) { contentUploadedThisRound += read; } if (contentUploadedThisRound > 0) { stream.Write(requestBuffer, 0, contentUploadedThisRound); } } else { contentUploadedThisRound = blockSize > (requestBuffer.Length - totalContentUploaded) ? (requestBuffer.Length - totalContentUploaded) : blockSize; stream.Write(requestBuffer, totalContentUploaded, contentUploadedThisRound); } totalContentUploaded += contentUploadedThisRound; totalContentUploadedOverall += contentUploadedThisRound; RaiseUploadStatusCallback(uploadStatusCallback, overallContentLength, contentUploadedThisRound, totalContentUploadedOverall); } return(totalContentUploaded); }