From 99e9bbc7c8a2f73de2eccf1c36af53b36fff699b Mon Sep 17 00:00:00 2001 From: Jaex Date: Wed, 25 Jun 2014 00:26:00 +0300 Subject: [PATCH] FTP dispose fix, SFTP stop upload override --- UploadersLib/FileUploaders/FTP.cs | 19 ++-- UploadersLib/FileUploaders/GfycatUploader.cs | 2 +- .../FileUploaders/MediaCrushUploader.cs | 4 +- UploadersLib/FileUploaders/SFTP.cs | 95 +++++++++++-------- UploadersLib/FileUploaders/SendSpace.cs | 8 +- UploadersLib/Uploader.cs | 44 ++++++--- 6 files changed, 104 insertions(+), 68 deletions(-) diff --git a/UploadersLib/FileUploaders/FTP.cs b/UploadersLib/FileUploaders/FTP.cs index b915213e9..1d989fd2e 100644 --- a/UploadersLib/FileUploaders/FTP.cs +++ b/UploadersLib/FileUploaders/FTP.cs @@ -117,10 +117,11 @@ public override UploadResult Upload(Stream stream, string fileName) } finally { + Dispose(); IsUploading = false; } - if (!stopUpload && Errors.Count == 0) + if (!StopUploadRequested && !IsError) { result.URL = Account.GetUriPath(fileName); } @@ -130,9 +131,9 @@ public override UploadResult Upload(Stream stream, string fileName) public override void StopUpload() { - if (IsUploading && !stopUpload) + if (IsUploading && !StopUploadRequested) { - stopUpload = true; + StopUploadRequested = true; Disconnect(); } } @@ -149,7 +150,7 @@ public bool Connect() public void Disconnect() { - if (client != null && client.IsConnected) + if (client != null) { client.Disconnect(); } @@ -412,8 +413,14 @@ public void Dispose() { if (client != null) { - Disconnect(); - client.Dispose(); + try + { + client.Dispose(); + } + catch (Exception e) + { + DebugHelper.WriteException(e); + } } } } diff --git a/UploadersLib/FileUploaders/GfycatUploader.cs b/UploadersLib/FileUploaders/GfycatUploader.cs index 84793e496..4330f89a1 100644 --- a/UploadersLib/FileUploaders/GfycatUploader.cs +++ b/UploadersLib/FileUploaders/GfycatUploader.cs @@ -88,7 +88,7 @@ private void TranscodeFile(string key, UploadResult result) OnProgressChanged(progress); } - while (!stopUpload) + while (!StopUploadRequested) { string statusJson = SendRequest(HttpMethod.GET, "https://upload.gfycat.com/status/" + key); GfycatStatusResponse response = JsonConvert.DeserializeObject(statusJson); diff --git a/UploadersLib/FileUploaders/MediaCrushUploader.cs b/UploadersLib/FileUploaders/MediaCrushUploader.cs index 6616db466..091679036 100644 --- a/UploadersLib/FileUploaders/MediaCrushUploader.cs +++ b/UploadersLib/FileUploaders/MediaCrushUploader.cs @@ -39,7 +39,7 @@ public class MediaCrushUploader : FileUploader { public override UploadResult Upload(Stream stream, string fileName) { - SuppressWebExceptions = true; + ThrowWebExceptions = true; string hash = CreateHash(stream); @@ -73,7 +73,7 @@ public override UploadResult Upload(Stream stream, string fileName) hash = JToken.Parse(result.Response)["hash"].Value(); - while (!stopUpload) + while (!StopUploadRequested) { result.Response = SendRequest(HttpMethod.GET, "https://mediacru.sh/api/" + hash + "/status"); JToken jsonResponse = JToken.Parse(result.Response); diff --git a/UploadersLib/FileUploaders/SFTP.cs b/UploadersLib/FileUploaders/SFTP.cs index 53a815314..9471f01eb 100644 --- a/UploadersLib/FileUploaders/SFTP.cs +++ b/UploadersLib/FileUploaders/SFTP.cs @@ -61,6 +61,45 @@ public SFTP(FTPAccount account) Account = account; } + public override UploadResult Upload(Stream stream, string fileName) + { + UploadResult result = new UploadResult(); + + if (Connect()) + { + fileName = Helpers.GetValidURL(fileName); + string folderPath = Account.GetSubFolderPath(); + string filePath = URLHelpers.CombineURL(folderPath, fileName); + + try + { + IsUploading = true; + UploadStream(stream, filePath); + } + finally + { + Dispose(); + IsUploading = false; + } + + if (!StopUploadRequested && !IsError) + { + result.URL = Account.GetUriPath(fileName); + } + } + + return result; + } + + public override void StopUpload() + { + if (IsUploading && !StopUploadRequested) + { + StopUploadRequested = true; + Disconnect(); + } + } + public bool Connect() { if (client == null) @@ -170,47 +209,23 @@ public List CreateMultiDirectory(string path) return directoryList; } - public override UploadResult Upload(Stream stream, string fileName) + private void UploadStream(Stream stream, string remotePath) { - UploadResult result = new UploadResult(); - - if (Connect()) + try { - fileName = Helpers.GetValidURL(fileName); - string folderPath = Account.GetSubFolderPath(); - string filePath = URLHelpers.CombineURL(folderPath, fileName); - - try + using (SftpFileStream sftpStream = client.OpenWrite(remotePath)) { - IsUploading = true; - UploadStream(stream, filePath); - } - catch (SftpPathNotFoundException) - { - CreateDirectory(folderPath); - UploadStream(stream, filePath); - } - finally - { - IsUploading = false; - } - - Disconnect(); - - if (!stopUpload && Errors.Count == 0) - { - result.URL = Account.GetUriPath(fileName); + TransferData(stream, sftpStream); } } - - return result; - } - - private void UploadStream(Stream stream, string path) - { - using (SftpFileStream sftpStream = client.OpenWrite(path)) + catch (SftpPathNotFoundException) { - TransferData(stream, sftpStream); + CreateDirectory(URLHelpers.GetDirectoryPath(remotePath)); + + using (SftpFileStream sftpStream = client.OpenWrite(remotePath)) + { + TransferData(stream, sftpStream); + } } } @@ -218,8 +233,14 @@ public void Dispose() { if (client != null) { - Disconnect(); - client.Dispose(); + try + { + client.Dispose(); + } + catch (Exception e) + { + DebugHelper.WriteException(e); + } } } } diff --git a/UploadersLib/FileUploaders/SendSpace.cs b/UploadersLib/FileUploaders/SendSpace.cs index 519e19687..8d53c7e62 100644 --- a/UploadersLib/FileUploaders/SendSpace.cs +++ b/UploadersLib/FileUploaders/SendSpace.cs @@ -534,20 +534,14 @@ private void bw_DoWork(object sender, DoWorkEventArgs e) } } - public class ProgressInfo + private class ProgressInfo { public string Status { get; set; } - public string ETA { get; set; } - public string Speed { get; set; } - public string UploadedBytes { get; set; } - public string TotalSize { get; set; } - public string Elapsed { get; set; } - public string Meter { get; set; } public ProgressInfo() diff --git a/UploadersLib/Uploader.cs b/UploadersLib/Uploader.cs index 3a045e84d..bf0f1581d 100644 --- a/UploadersLib/Uploader.cs +++ b/UploadersLib/Uploader.cs @@ -49,9 +49,17 @@ public class Uploader public bool IsUploading { get; protected set; } public int BufferSize { get; set; } public bool AllowReportProgress { get; set; } - public bool SuppressWebExceptions { get; set; } + public bool ThrowWebExceptions { get; set; } - protected bool stopUpload; + public bool IsError + { + get + { + return !StopUploadRequested && Errors != null && Errors.Count > 0; + } + } + + public bool StopUploadRequested { get; protected set; } private HttpWebRequest currentRequest; @@ -61,6 +69,7 @@ public Uploader() IsUploading = false; BufferSize = 8192; AllowReportProgress = true; + ThrowWebExceptions = false; ServicePointManager.DefaultConnectionLimit = 25; ServicePointManager.Expect100Continue = false; @@ -77,14 +86,19 @@ protected void OnProgressChanged(ProgressManager progress) public string ToErrorString() { - return string.Join("\r\n", Errors.ToArray()); + if (IsError) + { + return string.Join(Environment.NewLine, Errors); + } + + return string.Empty; } public virtual void StopUpload() { if (IsUploading) { - stopUpload = true; + StopUploadRequested = true; if (currentRequest != null) { @@ -169,7 +183,7 @@ private HttpWebResponse GetResponse(HttpMethod method, string url, Dictionary 0) + while (!StopUploadRequested && (bytesRead = dataStream.Read(buffer, 0, length)) > 0) { requestStream.Write(buffer, 0, bytesRead); @@ -406,7 +420,7 @@ protected bool TransferData(Stream dataStream, Stream requestStream) } } - return !stopUpload; + return !StopUploadRequested; } private string CreateBoundary()