private async Task ExecuteChunkUploadMessage(HttpRequestMessage requestMessage)
        {
            await TryPauseAsync(CancellationToken);

            requestMessage.AddDefaultHeaders(Client);

            using(var responseMessage = await GetHttpClient().SendAsync(requestMessage, CancellationToken.GetValueOrDefault(System.Threading.CancellationToken.None)))
            {
                string response = await responseMessage.Content.ReadAsStringAsync();
                try
                {
                    var sfResponse = JsonConvert.DeserializeObject<ShareFileApiResponse<string>>(response);
                    if (sfResponse.Error)
                    {
                        throw new UploadException(sfResponse.ErrorMessage, sfResponse.ErrorCode);
                    }
                }
                catch (JsonSerializationException jEx)
                {
                    if (responseMessage.Content != null)
                    {
                        TryProcessFailedUploadResponse(response);
                    }

                    throw new UploadException("StorageCenter error: " + response, -1, jEx);
                }
            }
        }
        private void ExecuteChunkUploadMessage(HttpRequestMessage requestMessage)
        {
            TryPause();

            requestMessage.AddDefaultHeaders(Client);

            using (var responseMessage = GetHttpClient().SendAsync(requestMessage).WaitForTask())
            {
                DeserializeShareFileApiResponse<string>(responseMessage);
                //no exception = success?
            }
        }
        private async Task<UploadResponse> FinishUploadAsync()
        {
            this.MarkProgressComplete();

            var client = GetHttpClient();
            var finishUri = this.GetFinishUriForThreadedUploads();
            var requestMessage = new HttpRequestMessage(HttpMethod.Get, finishUri);

            requestMessage.Headers.Add("Accept", "application/json");
            requestMessage.AddDefaultHeaders(Client);

            var response = await client.SendAsync(requestMessage);

            return await GetUploadResponseAsync(response);
        }
        private UploadResponse FinishUpload()
        {
            MarkProgressComplete();

            var finishUri = GetFinishUriForThreadedUploads();
            var client = GetHttpClient();

            var requestMessage = new HttpRequestMessage(HttpMethod.Get, finishUri);
            requestMessage.Headers.Add("Accept", "application/json");
            requestMessage.AddDefaultHeaders(Client);

            var response = client.SendAsync(requestMessage).WaitForTask();

            return GetUploadResponse(response);
        }
        protected override async Task<UploadResponse> InternalUploadAsync()
        {
            int tryCount = 0;
            Stream stream = File.OpenRead();
            while (true)
            {
                try
                {
                    var httpClient = GetHttpClient();

                    using (var requestMessage = new HttpRequestMessage(
                            HttpMethod.Post,
                            GetChunkUriForStandardUploads()))
                    {
                        using (var streamContent = new StreamContentWithProgress(new NoDisposeStream(stream), OnProgress))
                        {
                            requestMessage.AddDefaultHeaders(Client);
                            streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                            requestMessage.Content = streamContent;

                            var responseMessage =
                                await
                                httpClient.SendAsync(
                                    requestMessage,
                                    CancellationToken.GetValueOrDefault(System.Threading.CancellationToken.None));

                            MarkProgressComplete();

                            return await GetUploadResponseAsync(responseMessage);
                        }
                    }
                }
                catch (Exception)
                {
                    if (tryCount >= 3 || !stream.CanSeek)
                    {
                        throw;
                    }
                    else
                    {
                        tryCount += 1;
                        stream.Seek(0, SeekOrigin.Begin);
                    }
                }
            }
        }
        public override UploadResponse Upload(Dictionary<string, object> transferMetadata = null)
        {
            SetUploadSpecification();

            int tryCount = 0;
            Stream stream = File.OpenRead();
            while (true)
            {
                try
                {
                    var httpClient = GetHttpClient();

                    using (var requestMessage = new HttpRequestMessage(
                            HttpMethod.Post,
                            GetChunkUriForStandardUploads()))
                    {
                        using (var streamContent = new StreamContentWithProgress(new NoDisposeStream(stream), OnProgress))
                        {
                            requestMessage.AddDefaultHeaders(Client);
                            streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
                            requestMessage.Content = streamContent;

                            var responseMessage =
                                httpClient.SendAsync(requestMessage, CancellationToken.None).WaitForTask();

                            MarkProgressComplete();

                            return GetUploadResponse(responseMessage);
                        }
                    }
                }
                catch (Exception)
                {
                    if (tryCount >= 3 || !stream.CanSeek)
                    {
                        throw;
                    }
                    else
                    {
                        tryCount += 1;
                        stream.Seek(0, SeekOrigin.Begin);
                    }
                }
            }
        }