/// <summary> /// Puts the block list. /// </summary> /// <param name="requestState">State of the request.</param> private void PutBlockList(AsyncWebRequestState requestState) { if (!this.cancellationTokens.IsCancellationRequested) { var webRequest = (HttpWebRequest)WebRequestCreator.ClientHttp.Create(this.request.PutBlockBlobListUri()); webRequest.Method = RequestType.Put.ToString(); webRequest.Headers[MsVersionHeader] = Constants.HeaderVersion; requestState.WebRequestState = webRequest; webRequest.BeginGetRequestStream(new AsyncCallback(this.BlockListWriteToStreamCallback), requestState); } }
/// <summary> /// Reads the HTTP response callback. /// </summary> /// <param name="asynchronousResult">The asynchronous result.</param> private void ReadHttpResponseCallback(IAsyncResult asynchronousResult) { if (!this.cancellationTokens.IsCancellationRequested) { AsyncWebRequestState requestState = (AsyncWebRequestState)asynchronousResult.AsyncState; try { HttpWebRequest webRequest = (HttpWebRequest)requestState.WebRequestState; if (webRequest.HaveResponse && asynchronousResult.IsCompleted) { requestState.RequestPayload.IsTransported = true; } } catch (Exception ex) { if (requestState != null) { if (requestState.RequestPayload.RetryCount <= Constants.RetryLimit) { requestState.RequestPayload.RetryCount++; this.UploadFileChunk(requestState.RequestPayload, requestState.FileToUpload); } else { this.cancellationTokens.Cancel(); this.NotifyClient(UploadCompleteReason.ErrorOccurred, ex.Message); } } } lock (this.lockingObject) { if (this.packets.Count > 1) { if (this.IsUploadFinished()) { this.PutBlockList(requestState); } } else { this.NotifyClient(UploadCompleteReason.UploadCommitted); } } } }
/// <summary> /// Blocks the list write to stream callback. /// </summary> /// <param name="asynchronousResult">The asynchronous result.</param> private void BlockListWriteToStreamCallback(IAsyncResult asynchronousResult) { if (!this.cancellationTokens.IsCancellationRequested) { AsyncWebRequestState requestState = (AsyncWebRequestState)asynchronousResult.AsyncState; HttpWebRequest webRequest = (HttpWebRequest)requestState.WebRequestState; Stream requestStream = webRequest.EndGetRequestStream(asynchronousResult); var writer = XmlWriter.Create(requestStream, new XmlWriterSettings() { Encoding = Encoding.UTF8 }); RequestGenerator.UncommittedBlockBlobList(this.packets.Count()).Save(writer); writer.Flush(); requestStream.Close(); requestState.WebRequestState = webRequest; webRequest.BeginGetResponse(new AsyncCallback(this.BlockListReadHttpResponseCallback), requestState); } }
/// <summary> /// Writes to stream callback. /// </summary> /// <param name="asynchronousResult">The asynchronous result.</param> private void WriteToStreamCallback(IAsyncResult asynchronousResult) { if (!this.cancellationTokens.IsCancellationRequested) { AsyncWebRequestState requestState = (AsyncWebRequestState)asynchronousResult.AsyncState; HttpWebRequest webRequest = (HttpWebRequest)requestState.WebRequestState; Stream requestStream = webRequest.EndGetRequestStream(asynchronousResult); requestStream.Write(requestState.RequestPayload.GetPayload(), 0, requestState.RequestPayload.GetPayload().Length); requestStream.Close(); var webRequestState = new AsyncWebRequestState() { WebRequestState = webRequest, RequestPayload = requestState.RequestPayload, FileToUpload = requestState.FileToUpload }; webRequest.BeginGetResponse(new AsyncCallback(this.ReadHttpResponseCallback), webRequestState); } }
/// <summary> /// Uploads the file chunk. /// </summary> /// <param name="requestPayload">The request payload.</param> /// <param name="fileToUpload">The file to upload.</param> /// <param name="blockUri">The block URI.</param> private void UploadFileChunk(DataPacket requestPayload, UserFile fileToUpload, Uri blockUri = null) { if (!this.cancellationTokens.IsCancellationRequested) { if (requestPayload != null && fileToUpload != null) { HttpWebRequest webRequest = (HttpWebRequest)WebRequestCreator.ClientHttp.Create(blockUri == null ? this.request.SASUrl : blockUri); webRequest.Method = RequestType.Put.ToString(); var webRequestState = new AsyncWebRequestState() { WebRequestState = webRequest, RequestPayload = requestPayload, FileToUpload = fileToUpload }; webRequest.BeginGetRequestStream(new AsyncCallback(this.WriteToStreamCallback), webRequestState); } } }
/// <summary> /// Blocks the list read HTTP response callback. /// </summary> /// <param name="asynchronousResult">The asynchronous result.</param> private void BlockListReadHttpResponseCallback(IAsyncResult asynchronousResult) { if (!this.cancellationTokens.IsCancellationRequested) { AsyncWebRequestState requestState = (AsyncWebRequestState)asynchronousResult.AsyncState; try { HttpWebRequest webRequest = (HttpWebRequest)requestState.WebRequestState; HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult); StreamReader reader = new StreamReader(webResponse.GetResponseStream()); reader.ReadToEnd(); reader.Close(); } catch (Exception ex) { this.NotifyClient(UploadCompleteReason.ErrorOccurred, ex.Message); } this.NotifyClient(UploadCompleteReason.UploadCommitted); } }