From 6e9c4ebcd3fdbed8e540ba615d406baeebdf1ed4 Mon Sep 17 00:00:00 2001 From: Jaex Date: Mon, 14 Dec 2015 13:16:07 +0200 Subject: [PATCH] fixed #1138: Ugly workaround for Imgur related token expire issues --- .../FileUploaders/MediaCrushUploader.cs | 2 +- ShareX.UploadersLib/ImageUploaders/Imgur.cs | 23 ++++++++++++++++++- ShareX.UploadersLib/Uploader.cs | 22 ++++++++++++------ 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/ShareX.UploadersLib/FileUploaders/MediaCrushUploader.cs b/ShareX.UploadersLib/FileUploaders/MediaCrushUploader.cs index dfe3eee63..82996042d 100644 --- a/ShareX.UploadersLib/FileUploaders/MediaCrushUploader.cs +++ b/ShareX.UploadersLib/FileUploaders/MediaCrushUploader.cs @@ -53,7 +53,7 @@ public MediaCrushUploader(string apiURL) public override UploadResult Upload(Stream stream, string fileName) { - ThrowWebExceptions = true; + WebExceptionThrow = true; string hash = CreateHash(stream); diff --git a/ShareX.UploadersLib/ImageUploaders/Imgur.cs b/ShareX.UploadersLib/ImageUploaders/Imgur.cs index 989b960ce..fe8ec3822 100644 --- a/ShareX.UploadersLib/ImageUploaders/Imgur.cs +++ b/ShareX.UploadersLib/ImageUploaders/Imgur.cs @@ -25,7 +25,9 @@ You should have received a copy of the GNU General Public License using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using ShareX.HelpersLib; using ShareX.UploadersLib.HelperClasses; +using System; using System.Collections.Generic; using System.Collections.Specialized; using System.ComponentModel; @@ -58,9 +60,12 @@ public sealed class Imgur : ImageUploader, IOAuth2 public bool DirectLink { get; set; } public bool UseGIFV { get; set; } + private bool refreshTokenOnError; + public Imgur(OAuth2Info oauth) { AuthInfo = oauth; + refreshTokenOnError = true; } public string GetAuthorizationURL() @@ -200,6 +205,7 @@ public override UploadResult Upload(Stream stream, string fileName) headers.Add("Authorization", "Client-ID " + AuthInfo.Client_ID); } + WebExceptionReturnResponse = true; UploadResult result = UploadData(stream, "https://api.imgur.com/3/image", fileName, "image", args, headers); if (!string.IsNullOrEmpty(result.Response)) @@ -260,7 +266,22 @@ public override UploadResult Upload(Stream stream, string fileName) } else { - HandleErrors(imgurResponse); + ImgurErrorData errorData = ((JObject)imgurResponse.data).ToObject(); + + if (errorData != null) + { + if (refreshTokenOnError && errorData.error.Equals("The access token provided is invalid.", StringComparison.InvariantCultureIgnoreCase) && RefreshAccessToken()) + { + DebugHelper.WriteLine("Imgur access token refreshed, reuploading image."); + + refreshTokenOnError = false; + return Upload(stream, fileName); + } + + string errorMessage = string.Format("Imgur upload failed: ({0}) {1}", imgurResponse.status, errorData.error); + Errors.Clear(); + Errors.Add(errorMessage); + } } } } diff --git a/ShareX.UploadersLib/Uploader.cs b/ShareX.UploadersLib/Uploader.cs index ce577fc52..09feb73f1 100644 --- a/ShareX.UploadersLib/Uploader.cs +++ b/ShareX.UploadersLib/Uploader.cs @@ -50,7 +50,8 @@ public class Uploader public bool IsUploading { get; protected set; } public int BufferSize { get; set; } public bool AllowReportProgress { get; set; } - public bool ThrowWebExceptions { get; set; } + public bool WebExceptionReturnResponse { get; set; } + public bool WebExceptionThrow { get; set; } public bool IsError { @@ -67,10 +68,8 @@ public bool IsError public Uploader() { Errors = new List(); - IsUploading = false; BufferSize = 8192; AllowReportProgress = true; - ThrowWebExceptions = false; ServicePointManager.DefaultConnectionLimit = 25; ServicePointManager.Expect100Continue = false; @@ -215,7 +214,7 @@ private HttpWebResponse GetResponse(HttpMethod method, string url, Dictionary