public static HttpWebResponse Execute(Uri uri, Stream requestData, IMutableProgressTracker progress, CancellationToken cancelToken) { // QUICK HACK var requestProgress = new MutableProgressTracker(); var responseProgress = new MutableProgressTracker(); var aggregateProgress = new AggregateProgressTracker(new ProgressTrackerCollection { { requestProgress, TimeEstimates.LongOperation.ProgressWeight }, { responseProgress, TimeEstimates.ShortOperation.ProgressWeight }, }); aggregateProgress.BindTo(progress); try { var request = CreateRequest(uri, @"POST"); request.ContentLength = requestData.Length; using (var requestStream = request.GetRequestStream()) using (var progressStream = new ProgressTrackingStreamWrapper(requestStream, request.ContentLength)) { progressStream.BindTo(requestProgress); requestData.CopyTo(progressStream, cancelToken); } bool canCancel = true; cancelToken.Register(() => { if (canCancel) { request.Abort(); } }); var response = (HttpWebResponse) request.GetResponse(); responseProgress.Progress = 1; // TODO HTTP download Progress canCancel = false; return response; } catch (WebException e) { if (e.Status == WebExceptionStatus.RequestCanceled) { throw new OperationCanceledException(e.Message, e, cancelToken); } throw new OperationCanceledException(e.Message, e, cancelToken); } }
private void UploadData(Stream stream, string fileName, IMutableProgressTracker progress, CancellationToken cancelToken) { using (var client = new FTPSClient()) { try { progress.Status = "Connecting to FTP"; client.Connect(Host, Port, new NetworkCredential(UserName, Password), 0, null, null, 0, 0, 0, Timeout); } catch (TimeoutException e) { throw new CommandCanceledException(this, "Connection to FTP server timed out", e); } catch (IOException e) { throw new CommandCanceledException(this, "Connection to FTP server failed", e); } using (var outStream = client.PutFile(GetRemotePathName(fileName))) using (var outStreamWrapper = new ProgressTrackingStreamWrapper(outStream, stream.Length)) { outStreamWrapper.BindTo(progress); progress.Status = "Uploading file to FTP"; stream.CopyTo(outStreamWrapper, cancelToken); } } }
private static void WritePostData(HttpWebRequest request, MultipartData data, IMutableProgressTracker progress, CancellationToken cancelToken) { var boundary = data.Boundary; request.ContentType = string.Format(@"multipart/form-data; {0}", MultipartHeader.KeyValuePair("boundary", boundary)); request.ContentLength = Utility.GetBoundaryByteCount(boundary) + data.GetByteCount(); using (var requestStream = request.GetRequestStream()) using (var progressStream = new ProgressTrackingStreamWrapper(requestStream, request.ContentLength)) { progressStream.BindTo(progress); Utility.WriteBoundary(progressStream, boundary); data.Write(progressStream, cancelToken); } System.Diagnostics.Debug.Assert(progress.Progress == 1); }