Пример #1
0
        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);
        }