From e781bdcd5c90946087ba0b3d580419ba0674a6d0 Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 26 Apr 2016 23:12:45 +0200 Subject: [PATCH] BUG-1949: Fixed imgur issues, especially the delete. --- GreenshotImgurPlugin/ImgurConfiguration.cs | 2 - GreenshotImgurPlugin/ImgurInfo.cs | 70 ++++++++++++++-------- GreenshotImgurPlugin/ImgurUtils.cs | 55 ++++++++++------- 3 files changed, 79 insertions(+), 48 deletions(-) diff --git a/GreenshotImgurPlugin/ImgurConfiguration.cs b/GreenshotImgurPlugin/ImgurConfiguration.cs index 104839352..5392ec265 100644 --- a/GreenshotImgurPlugin/ImgurConfiguration.cs +++ b/GreenshotImgurPlugin/ImgurConfiguration.cs @@ -32,8 +32,6 @@ namespace GreenshotImgurPlugin { /// [IniSection("Imgur", Description="Greenshot Imgur Plugin configuration")] public class ImgurConfiguration : IniSection { - [IniProperty("ImgurApiUrl", Description="Url to Imgur system.", DefaultValue= "http://api.imgur.com/2")] - public string ImgurApiUrl; [IniProperty("ImgurApi3Url", Description = "Url to Imgur system.", DefaultValue = "https://api.imgur.com/3")] public string ImgurApi3Url; diff --git a/GreenshotImgurPlugin/ImgurInfo.cs b/GreenshotImgurPlugin/ImgurInfo.cs index 37e5a3ce8..c43903c04 100644 --- a/GreenshotImgurPlugin/ImgurInfo.cs +++ b/GreenshotImgurPlugin/ImgurInfo.cs @@ -27,7 +27,8 @@ namespace GreenshotImgurPlugin /// /// Description of ImgurInfo. /// - public class ImgurInfo : IDisposable { + public class ImgurInfo : IDisposable + { private static readonly log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(ImgurInfo)); public string Hash @@ -37,9 +38,11 @@ namespace GreenshotImgurPlugin } private string deleteHash; - public string DeleteHash { - get {return deleteHash;} - set { + public string DeleteHash + { + get { return deleteHash; } + set + { deleteHash = value; DeletePage = "https://imgur.com/delete/" + value; } @@ -94,24 +97,29 @@ namespace GreenshotImgurPlugin } private Image image; - public Image Image { - get {return image;} - set { - if (image != null) { + public Image Image + { + get { return image; } + set + { + if (image != null) + { image.Dispose(); } image = value; } } - public ImgurInfo() { + public ImgurInfo() + { } /// /// The public accessible Dispose /// Will call the GarbageCollector to SuppressFinalize, preventing being cleaned twice /// - public void Dispose() { + public void Dispose() + { Dispose(true); GC.SuppressFinalize(this); } @@ -121,15 +129,19 @@ namespace GreenshotImgurPlugin /// When disposing==true all non-managed resources should be freed too! /// /// - protected virtual void Dispose(bool disposing) { - if (disposing) { - if (image != null) { + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (image != null) + { image.Dispose(); } } image = null; } - public static ImgurInfo ParseResponse(string response) { + public static ImgurInfo ParseResponse(string response) + { LOG.Debug(response); // This is actually a hack for BUG-1695 // The problem is the (C) sign, we send it HTML encoded "®" to Imgur and get it HTML encoded in the XML back @@ -142,11 +154,13 @@ namespace GreenshotImgurPlugin response = response.Replace("®", "®"); ImgurInfo imgurInfo = new ImgurInfo(); - try { + try + { XmlDocument doc = new XmlDocument(); doc.LoadXml(response); XmlNodeList nodes = doc.GetElementsByTagName("id"); - if(nodes.Count > 0) { + if (nodes.Count > 0) + { imgurInfo.Hash = nodes.Item(0).InnerText; } nodes = doc.GetElementsByTagName("hash"); @@ -155,19 +169,23 @@ namespace GreenshotImgurPlugin imgurInfo.Hash = nodes.Item(0).InnerText; } nodes = doc.GetElementsByTagName("deletehash"); - if(nodes.Count > 0) { + if (nodes.Count > 0) + { imgurInfo.DeleteHash = nodes.Item(0).InnerText; } nodes = doc.GetElementsByTagName("type"); - if(nodes.Count > 0) { + if (nodes.Count > 0) + { imgurInfo.ImageType = nodes.Item(0).InnerText; } nodes = doc.GetElementsByTagName("title"); - if(nodes.Count > 0) { + if (nodes.Count > 0) + { imgurInfo.Title = nodes.Item(0).InnerText; } nodes = doc.GetElementsByTagName("datetime"); - if(nodes.Count > 0) { + if (nodes.Count > 0) + { // Version 3 has seconds since Epoch double secondsSince; if (double.TryParse(nodes.Item(0).InnerText, out secondsSince)) @@ -198,15 +216,17 @@ namespace GreenshotImgurPlugin imgurInfo.Page = string.Format("https://imgur.com/{0}", imgurInfo.Hash); } nodes = doc.GetElementsByTagName("small_square"); - if(nodes.Count > 0) { + if (nodes.Count > 0) + { imgurInfo.SmallSquare = nodes.Item(0).InnerText; } - nodes = doc.GetElementsByTagName("large_thumbnail"); - if(nodes.Count > 0) + else { - imgurInfo.LargeThumbnail = nodes.Item(0).InnerText.Replace("http:", "https:"); + imgurInfo.SmallSquare = string.Format("http://i.imgur.com/{0}s.png",imgurInfo.Hash); } - } catch(Exception e) { + } + catch (Exception e) + { LOG.ErrorFormat("Could not parse Imgur response due to error {0}, response was: {1}", e.Message, response); } return imgurInfo; diff --git a/GreenshotImgurPlugin/ImgurUtils.cs b/GreenshotImgurPlugin/ImgurUtils.cs index 3bb80e0f8..0e426157d 100644 --- a/GreenshotImgurPlugin/ImgurUtils.cs +++ b/GreenshotImgurPlugin/ImgurUtils.cs @@ -119,7 +119,7 @@ namespace GreenshotImgurPlugin { if (filename != null && Config.AddFilename) { otherParameters.Add("name", filename); } - string responseString; + string responseString = null; if (Config.AnonymousAccess) { // add key, we only use the other parameters for the AnonymousAccess //otherParameters.Add("key", IMGUR_ANONYMOUS_API_KEY); @@ -133,11 +133,17 @@ namespace GreenshotImgurPlugin { ImageOutput.SaveToStream(surfaceToUpload, requestStream, outputSettings); } - using (WebResponse response = webRequest.GetResponse()) { - using (StreamReader reader = new StreamReader(response.GetResponseStream(), true)) { - responseString = reader.ReadToEnd(); - } + using (WebResponse response = webRequest.GetResponse()) + { LogRateLimitInfo(response); + var responseStream = response.GetResponseStream(); + if (responseStream != null) + { + using (StreamReader reader = new StreamReader(responseStream, true)) + { + responseString = reader.ReadToEnd(); + } + } } } catch (Exception ex) { LOG.Error("Upload to imgur gave an exeption: ", ex); @@ -145,20 +151,22 @@ namespace GreenshotImgurPlugin { } } else { - var oauth2Settings = new OAuth2Settings(); - oauth2Settings.AuthUrlPattern = AuthUrlPattern; - oauth2Settings.TokenUrl = TokenUrl; - oauth2Settings.RedirectUrl = "https://imgur.com"; - oauth2Settings.CloudServiceName = "Imgur"; - oauth2Settings.ClientId = ImgurCredentials.CONSUMER_KEY; - oauth2Settings.ClientSecret = ImgurCredentials.CONSUMER_SECRET; - oauth2Settings.AuthorizeMode = OAuth2AuthorizeMode.EmbeddedBrowser; - oauth2Settings.BrowserSize = new Size(680, 880); + var oauth2Settings = new OAuth2Settings + { + AuthUrlPattern = AuthUrlPattern, + TokenUrl = TokenUrl, + RedirectUrl = "https://imgur.com", + CloudServiceName = "Imgur", + ClientId = ImgurCredentials.CONSUMER_KEY, + ClientSecret = ImgurCredentials.CONSUMER_SECRET, + AuthorizeMode = OAuth2AuthorizeMode.EmbeddedBrowser, + BrowserSize = new Size(680, 880), + RefreshToken = Config.RefreshToken, + AccessToken = Config.AccessToken, + AccessTokenExpires = Config.AccessTokenExpires + }; // Copy the settings from the config, which is kept in memory and on the disk - oauth2Settings.RefreshToken = Config.RefreshToken; - oauth2Settings.AccessToken = Config.AccessToken; - oauth2Settings.AccessTokenExpires = Config.AccessTokenExpires; try { @@ -179,6 +187,10 @@ namespace GreenshotImgurPlugin { IniConfig.Save(); } } + if (string.IsNullOrEmpty(responseString)) + { + return null; + } return ImgurInfo.ParseResponse(responseString); } @@ -194,7 +206,8 @@ namespace GreenshotImgurPlugin { LOG.InfoFormat("Retrieving Imgur image for {0} with url {1}", imgurInfo.Hash, imgurInfo.SmallSquare); HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(string.Format(SmallUrlPattern, imgurInfo.Hash), HTTPMethod.GET); webRequest.ServicePoint.Expect100Continue = false; - SetClientId(webRequest); + // Not for getting the thumbnail, in anonymous modus + //SetClientId(webRequest); using (WebResponse response = webRequest.GetResponse()) { LogRateLimitInfo(response); Stream responseStream = response.GetResponseStream(); @@ -212,7 +225,7 @@ namespace GreenshotImgurPlugin { /// /// ImgurInfo public static ImgurInfo RetrieveImgurInfo(string hash, string deleteHash) { - string url = Config.ImgurApiUrl + "/image/" + hash; + string url = Config.ImgurApi3Url + "/image/" + hash + ".xml"; LOG.InfoFormat("Retrieving Imgur info for {0} with url {1}", hash, url); HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(url, HTTPMethod.GET); webRequest.ServicePoint.Expect100Continue = false; @@ -247,8 +260,8 @@ namespace GreenshotImgurPlugin { LOG.InfoFormat("Deleting Imgur image for {0}", imgurInfo.DeleteHash); try { - string url = Config.ImgurApiUrl + "/delete/" + imgurInfo.DeleteHash; - HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(url, HTTPMethod.GET); + string url = Config.ImgurApi3Url + "/image/" + imgurInfo.DeleteHash + ".xml"; + HttpWebRequest webRequest = NetworkHelper.CreateWebRequest(url, HTTPMethod.DELETE); webRequest.ServicePoint.Expect100Continue = false; SetClientId(webRequest); string responseString;