OSDN Git Service

クエリの構築に HttpUtility.ParseQueryString() を使用している箇所を MyCommon.BuildQueryString() に置き換え...
authorKimura Youichi <kim.upsilon@bucyou.net>
Sat, 24 May 2014 04:17:29 +0000 (13:17 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sat, 24 May 2014 07:43:27 +0000 (16:43 +0900)
HttpUtility.ParseQueryString() を使用してクエリを構築した場合に、
\rマルチバイト文字が「%u6d32」のような不適切な形にエスケープされてしまう問題への対処。

参照: https://twitter.com/KishSoup/status/468058259950026752

OpenTween/Bing.cs
OpenTween/Resources/ChangeLog.txt
OpenTween/ShortUrl.cs
OpenTween/Thumbnail/Services/FoursquareCheckin.cs
OpenTween/Thumbnail/Services/Tinami.cs

index 3d57cc4..559cbfe 100644 (file)
@@ -181,15 +181,18 @@ namespace OpenTween
         /// <exception cref="HttpRequestException"/>
         public async Task<string> TranslateAsync(string text, string langFrom, string langTo)
         {
-            var param = HttpUtility.ParseQueryString(string.Empty);
-            param["Text"] = "'" + text + "'";
-            param["To"] = "'" + langTo + "'";
-            param["$format"] = "Raw";
+            var param = new Dictionary<string, string>
+            {
+                {"Text", "'" + text + "'"},
+                {"To", "'" + langTo + "'"},
+                {"$format", "Raw"},
+            };
 
             if (langFrom != null)
                 param["From"] = "'" + langFrom + "'";
 
-            var request = new HttpRequestMessage(HttpMethod.Get, TranslateUri + "?" + param);
+            var uri = new Uri(TranslateUri + "?" + MyCommon.BuildQueryString(param));
+            var request = new HttpRequestMessage(HttpMethod.Get, uri);
             request.Headers.Authorization = CreateBasicAuthHeaderValue(ApplicationSettings.AzureMarketplaceKey, ApplicationSettings.AzureMarketplaceKey);
 
             using (var response = await this.http.SendAsync(request).ConfigureAwait(false))
index 43c1fc5..af1b5be 100644 (file)
@@ -4,6 +4,7 @@
  * FIX: 発言詳細欄から右クリックで日本語ハッシュタグを固定すると、エンコード状態のハッシュタグが登録される問題を修正
  * FIX: PublicSearchタブでの検索時に Err:Unauthorized(GetSearch) が表示される問題の回避策を追加
  * FIX: サムネイル画像の読み込み中に別のツイートに選択を移動した際に動作が固まる現象の回避 (thx @_1t_, @Tan90909090, @suzushin!)
+ * FIX: 日本語等を含むツイートでBing翻訳機能を使用すると文字化けする問題を修正 (thx @KishSoup!)
 
 ==== Ver 1.2.0(2014/05/18)
  * このバージョン以降のOpenTweenは .NET Framework 4.5.1 が必要となります
index bacda3e..297aed3 100644 (file)
@@ -401,14 +401,17 @@ namespace OpenTween
             if (string.IsNullOrEmpty(this.BitlyId) || string.IsNullOrEmpty(this.BitlyKey))
                 return srcUri;
 
-            var query = HttpUtility.ParseQueryString(string.Empty);
-            query["login"] = this.BitlyId;
-            query["apiKey"] = this.BitlyKey;
-            query["format"] = "txt";
-            query["domain"] = domain;
-            query["longUrl"] = srcUri.OriginalString;
-
-            using (var response = await this.http.GetAsync("https://api-ssl.bitly.com/v3/shorten?" + query).ConfigureAwait(false))
+            var query = new Dictionary<string, string>
+            {
+                {"login", this.BitlyId},
+                {"apiKey", this.BitlyKey},
+                {"format", "txt"},
+                {"domain", domain},
+                {"longUrl", srcUri.OriginalString},
+            };
+
+            var uri = new Uri("https://api-ssl.bitly.com/v3/shorten?" + MyCommon.BuildQueryString(query));
+            using (var response = await this.http.GetAsync(uri).ConfigureAwait(false))
             {
                 response.EnsureSuccessStatusCode();
 
@@ -428,11 +431,14 @@ namespace OpenTween
             if ("http://ux.nx/xxxxxx".Length > srcUri.OriginalString.Length)
                 return srcUri;
 
-            var query = HttpUtility.ParseQueryString(string.Empty);
-            query["format"] = "plain";
-            query["url"] = srcUri.OriginalString;
+            var query = new Dictionary<string, string>
+            {
+                {"format", "plain"},
+                {"url", srcUri.OriginalString},
+            };
 
-            using (var response = await this.http.GetAsync("http://ux.nu/api/short?" + query).ConfigureAwait(false))
+            var uri = new Uri("http://ux.nu/api/short?" + MyCommon.BuildQueryString(query));
+            using (var response = await this.http.GetAsync(uri).ConfigureAwait(false))
             {
                 response.EnsureSuccessStatusCode();
 
index c98bb03..4ae2f26 100644 (file)
@@ -20,6 +20,7 @@
 // Boston, MA 02110-1301, USA.
 
 using System;
+using System.Collections.Generic;
 using System.Net.Http;
 using System.Runtime.Serialization.Json;
 using System.Text.RegularExpressions;
@@ -65,15 +66,17 @@ namespace OpenTween.Thumbnail.Services
                 // Foursquare のベニュー情報を取得
                 // 参照: https://developer.foursquare.com/docs/venues/venues
 
-                var query = HttpUtility.ParseQueryString(string.Empty);
-                query["client_id"] = ApplicationSettings.FoursquareClientId;
-                query["client_secret"] = ApplicationSettings.FoursquareClientSecret;
-                query["v"] = "20140419"; // https://developer.foursquare.com/overview/versioning
+                var query = new Dictionary<string, string>
+                {
+                    {"client_id", ApplicationSettings.FoursquareClientId},
+                    {"client_secret", ApplicationSettings.FoursquareClientSecret},
+                    {"v", "20140419"}, // https://developer.foursquare.com/overview/versioning
+                };
 
                 if (signatureGroup.Success)
                     query["signature"] = signatureGroup.Value;
 
-                var apiUrl = new Uri(ApiBase + "/checkins/" + checkinIdGroup.Value + "?" + query);
+                var apiUrl = new Uri(ApiBase + "/checkins/" + checkinIdGroup.Value + "?" + MyCommon.BuildQueryString(query));
 
                 using (var response = await this.http.GetAsync(apiUrl, token).ConfigureAwait(false))
                 {
index 22ef1df..df7c569 100644 (file)
@@ -81,11 +81,13 @@ namespace OpenTween.Thumbnail.Services
 
         protected virtual async Task<XDocument> FetchContentInfoApiAsync(string contentId, CancellationToken token)
         {
-            var query = HttpUtility.ParseQueryString(string.Empty);
-            query["api_key"] = ApplicationSettings.TINAMIApiKey;
-            query["cont_id"] = contentId;
+            var query = new Dictionary<string, string>
+            {
+                {"api_key", ApplicationSettings.TINAMIApiKey},
+                {"cont_id", contentId},
+            };
 
-            var apiUrl = "http://api.tinami.com/content/info?" + query;
+            var apiUrl = new Uri("http://api.tinami.com/content/info?" + MyCommon.BuildQueryString(query));
 
             using (var response = await this.http.GetAsync(apiUrl, token).ConfigureAwait(false))
             {