private async Task <byte[]> UploadAttachment(CancellationToken token, string method, string url, Stream data, long dataSize, IOutputStreamFactory outputStreamFactory, IProgressListener listener) { // buffer payload in memory... MemoryStream tmpStream = new MemoryStream(); DigestingOutputStream outputStream = outputStreamFactory.CreateFor(tmpStream); StreamContent streamContent = new StreamContent(tmpStream); data.CopyTo(outputStream); outputStream.Flush(); tmpStream.Position = 0; // ... and upload it! var request = new HttpRequestMessage(HttpMethod.Put, url) { Content = new StreamContent(tmpStream) }; request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); request.Headers.ConnectionClose = true; HttpClient client = Util.CreateHttpClient(); HttpResponseMessage response = await client.SendAsync(request, token); if (response.StatusCode != HttpStatusCode.OK) { throw new IOException($"Bad response: {response.StatusCode} {await response.Content.ReadAsStringAsync()}"); } return(outputStream.GetTransmittedDigest()); }
/// <summary> /// /// </summary> /// <param name="stream"></param> /// <param name="context"></param> /// <returns></returns> /// <exception cref="OperationCanceledException"></exception> protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) { DigestingOutputStream outputStream = outputStreamFactory.CreateFor(stream); byte[] buffer = new byte[8192]; int read; long total = 0; while ((read = inputStream.Read(buffer, 0, buffer.Length)) != 0) { if (cancellationToken.IsCancellationRequested) { throw new OperationCanceledException("Canceled!", cancellationToken); } outputStream.Write(buffer, 0, read); total += read; if (progressListener != null) { progressListener.OnAttachmentProgress(contentLength, total); } } outputStream.Flush(); digest = outputStream.GetTransmittedDigest(); return(Task.CompletedTask); }