From 756c8d940368f1c7ad88a460f1b4497d6cf392ba Mon Sep 17 00:00:00 2001 From: RKrom Date: Wed, 10 Oct 2012 18:21:09 +0000 Subject: [PATCH] Refactoring to make Picasa work, added Upload to the IBinaryContainer. git-svn-id: http://svn.code.sf.net/p/greenshot/code/trunk@2135 7dccd23d-a4a3-4e1f-8c07-b4c1b4018ab4 --- GreenshotImgurPlugin/ImgurUtils.cs | 2 +- GreenshotPlugin/Controls/OAuthLoginForm.cs | 1 + GreenshotPlugin/Core/ImageOutput.cs | 10 ++-- GreenshotPlugin/Core/NetworkHelper.cs | 23 ++++++++++ GreenshotPlugin/Core/OAuthHelper.cs | 53 ++++++++++++++-------- 5 files changed, 66 insertions(+), 23 deletions(-) diff --git a/GreenshotImgurPlugin/ImgurUtils.cs b/GreenshotImgurPlugin/ImgurUtils.cs index 504aa8b9a..2e95b1896 100644 --- a/GreenshotImgurPlugin/ImgurUtils.cs +++ b/GreenshotImgurPlugin/ImgurUtils.cs @@ -169,7 +169,7 @@ namespace GreenshotImgurPlugin { uploadParameters.Add("name", filename); } uploadParameters.Add("image", new ImageContainer(image, outputSettings, filename)); - responseString = oAuth.MakeRequest(HTTPMethod.POST, apiUrl, uploadParameters, null, null); + responseString = oAuth.MakeRequest(HTTPMethod.POST, apiUrl, uploadParameters, null); } catch (Exception ex) { LOG.Error("Upload to imgur gave an exeption: ", ex); throw ex; diff --git a/GreenshotPlugin/Controls/OAuthLoginForm.cs b/GreenshotPlugin/Controls/OAuthLoginForm.cs index 0212a1e14..54a0a6e38 100644 --- a/GreenshotPlugin/Controls/OAuthLoginForm.cs +++ b/GreenshotPlugin/Controls/OAuthLoginForm.cs @@ -84,6 +84,7 @@ namespace GreenshotPlugin.Controls { if (browser.Url.ToString().StartsWith(callbackUrl)) { string queryParams = browser.Url.Query; if (queryParams.Length > 0) { + queryParams = NetworkHelper.UrlDecode(queryParams); //Store the Token and Token Secret IDictionary qs = NetworkHelper.ParseQueryString(queryParams); if (qs.ContainsKey("oauth_token") && qs["oauth_token"] != null) { diff --git a/GreenshotPlugin/Core/ImageOutput.cs b/GreenshotPlugin/Core/ImageOutput.cs index 58d2d9698..8a289d048 100644 --- a/GreenshotPlugin/Core/ImageOutput.cs +++ b/GreenshotPlugin/Core/ImageOutput.cs @@ -99,9 +99,13 @@ namespace GreenshotPlugin.Core { default: // Problem with non-seekable streams most likely doesn't happen with Windows 7 (OS Version 6.1 and later) // http://stackoverflow.com/questions/8349260/generic-gdi-error-on-one-machine-but-not-the-other - if (!stream.CanSeek && (Environment.OSVersion.Version.Major < 6 || (Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor == 1))) { - useMemoryStream = true; - LOG.Warn("Using memorystream prevent an issue with saving to a non seekable stream."); + if (!stream.CanSeek) { + int majorVersion = Environment.OSVersion.Version.Major; + int minorVersion = Environment.OSVersion.Version.Minor; + if (majorVersion < 6 || (majorVersion == 6 && minorVersion == 0)) { + useMemoryStream = true; + LOG.Warn("Using memorystream prevent an issue with saving to a non seekable stream."); + } } imageFormat = ImageFormat.Png; break; diff --git a/GreenshotPlugin/Core/NetworkHelper.cs b/GreenshotPlugin/Core/NetworkHelper.cs index 0dbbb6bf4..4113986eb 100644 --- a/GreenshotPlugin/Core/NetworkHelper.cs +++ b/GreenshotPlugin/Core/NetworkHelper.cs @@ -291,6 +291,7 @@ namespace GreenshotPlugin.Core { void WriteToStream(Stream formDataStream); string ToBase64String(Base64FormattingOptions formattingOptions); byte[] ToByteArray(); + void Upload(HttpWebRequest webRequest); } /// @@ -361,6 +362,17 @@ namespace GreenshotPlugin.Core { // Write the file data directly to the Stream, rather than serializing it to a string. dataStream.Write(file, 0, fileSize); } + + /// + /// Upload the file to the webrequest + /// + /// + public void Upload(HttpWebRequest webRequest) { + webRequest.ContentType = contentType; + using (var requestStream = webRequest.GetRequestStream()) { + WriteToStream(requestStream); + } + } } /// @@ -426,5 +438,16 @@ namespace GreenshotPlugin.Core { // Write the file data directly to the Stream, rather than serializing it to a string. ImageOutput.SaveToStream(image, dataStream, outputSettings); } + + /// + /// Upload the image to the webrequest + /// + /// + public void Upload(HttpWebRequest webRequest) { + webRequest.ContentType = "image/" + outputSettings.Format.ToString(); + using (var requestStream = webRequest.GetRequestStream()) { + WriteToStream(requestStream); + } + } } } diff --git a/GreenshotPlugin/Core/OAuthHelper.cs b/GreenshotPlugin/Core/OAuthHelper.cs index 485fba707..4f1d3b212 100644 --- a/GreenshotPlugin/Core/OAuthHelper.cs +++ b/GreenshotPlugin/Core/OAuthHelper.cs @@ -76,7 +76,12 @@ namespace GreenshotPlugin.Core { private bool useHTTPHeadersForAuthorization = true; private IDictionary accessTokenResponseParameters = null; private IDictionary requestTokenResponseParameters = null; + private IDictionary requestTokenParameters = new Dictionary(); + public IDictionary RequestTokenParameters { + get { return requestTokenParameters; } + } + /// /// Parameters of the last called getAccessToken /// @@ -100,7 +105,7 @@ namespace GreenshotPlugin.Core { private Size _browserSize = new Size(864, 587); private string loginTitle = "Authorize Greenshot access"; - #region PublicPropertiies + #region PublicProperties public string RequestTokenUrl { get; set; } public string AuthorizeUrl { get; set; } public string AccessTokenUrl { get; set; } @@ -260,10 +265,14 @@ namespace GreenshotPlugin.Core { private String getRequestToken() { string ret = null; IDictionary parameters = new Dictionary(); + foreach(var value in requestTokenParameters) { + parameters.Add(value); + } Sign(HTTPMethod.POST, RequestTokenUrl, parameters); - string response = MakeRequest(HTTPMethod.POST, RequestTokenUrl, parameters, null, null); - LOG.DebugFormat("Request token response: {0}", response); + string response = MakeRequest(HTTPMethod.POST, RequestTokenUrl, parameters, null); if (response.Length > 0) { + response = NetworkHelper.UrlDecode(response); + LOG.DebugFormat("Request token response: {0}", response); requestTokenResponseParameters = NetworkHelper.ParseQueryString(response); if (requestTokenResponseParameters.ContainsKey(OAUTH_TOKEN_KEY)) { this.Token = requestTokenResponseParameters[OAUTH_TOKEN_KEY]; @@ -311,9 +320,10 @@ namespace GreenshotPlugin.Core { IDictionary parameters = new Dictionary(); Sign(HTTPMethod.POST, AccessTokenUrl, parameters); - string response = MakeRequest(HTTPMethod.POST, AccessTokenUrl, parameters, null, null); - LOG.DebugFormat("Access token response: {0}", response); + string response = MakeRequest(HTTPMethod.POST, AccessTokenUrl, parameters, null); if (response.Length > 0) { + response = NetworkHelper.UrlDecode(response); + LOG.DebugFormat("Access token response: {0}", response); accessTokenResponseParameters = NetworkHelper.ParseQueryString(response); if (accessTokenResponseParameters.ContainsKey(OAUTH_TOKEN_KEY) && accessTokenResponseParameters[OAUTH_TOKEN_KEY] != null) { this.Token = accessTokenResponseParameters[OAUTH_TOKEN_KEY]; @@ -345,7 +355,13 @@ namespace GreenshotPlugin.Core { LOG.Debug("User didn't authenticate!"); return false; } - return getAccessToken() != null; + try { + System.Threading.Thread.Sleep(1000); + return getAccessToken() != null; + } catch (Exception ex) { + LOG.Error(ex); + throw ex; + } } /// @@ -366,7 +382,7 @@ namespace GreenshotPlugin.Core { /// /// public string MakeOAuthRequest(HTTPMethod method, string requestURL, IDictionary parameters) { - return MakeOAuthRequest(method, requestURL, parameters, null, null); + return MakeOAuthRequest(method, requestURL, parameters, null); } /// @@ -375,10 +391,9 @@ namespace GreenshotPlugin.Core { /// GET or POST /// The full url, including the querystring. /// Parameters for the request - /// contenttype for the postdata /// Data to post (MemoryStream) /// The web server response. - public string MakeOAuthRequest(HTTPMethod method, string requestURL, IDictionary parameters, string contentType, IBinaryContainer postData) { + public string MakeOAuthRequest(HTTPMethod method, string requestURL, IDictionary parameters, IBinaryContainer postData) { if (parameters == null) { parameters = new Dictionary(); } @@ -393,7 +408,7 @@ namespace GreenshotPlugin.Core { } try { Sign(method, requestURL, parameters); - return MakeRequest(method, requestURL, parameters, contentType, postData); + return MakeRequest(method, requestURL, parameters, postData); } catch (WebException wEx) { lastException = wEx; if (wEx.Response != null) { @@ -479,10 +494,9 @@ namespace GreenshotPlugin.Core { /// /// /// - /// /// IBinaryParameter /// Response from server - public string MakeRequest(HTTPMethod method, string requestURL, IDictionary parameters, string contentType, IBinaryContainer postData) { + public string MakeRequest(HTTPMethod method, string requestURL, IDictionary parameters, IBinaryContainer postData) { if (parameters == null) { throw new ArgumentNullException("parameters"); } @@ -546,13 +560,10 @@ namespace GreenshotPlugin.Core { requestStream.Write(data, 0, data.Length); } } + } else if (postData != null) { + postData.Upload(webRequest); } else { - webRequest.ContentType = contentType; - if (postData != null) { - using (var requestStream = webRequest.GetRequestStream()) { - postData.WriteToStream(requestStream); - } - } + webRequest.ContentLength = 0; } string responseData = WebResponseGet(webRequest); @@ -574,7 +585,11 @@ namespace GreenshotPlugin.Core { using (StreamReader reader = new StreamReader(webRequest.GetResponse().GetResponseStream(), true)) { responseData = reader.ReadToEnd(); } - } catch (Exception e) { + } catch (WebException e) { + HttpWebResponse response = (HttpWebResponse)e.Response; + using (Stream responseStream = response.GetResponseStream()) { + LOG.ErrorFormat("HTTP error {0} with content: {1}", response.StatusCode, new StreamReader(responseStream).ReadToEnd()); + } throw e; }