From 8bc947e1f9a38f4aa7accbd58c4e8bb8cc0bc0af Mon Sep 17 00:00:00 2001 From: Kimura Youichi Date: Sat, 24 May 2014 11:36:27 +0900 Subject: [PATCH] =?utf8?q?HttpConnection.CreateQueryString=20=E3=82=92MyCo?= =?utf8?q?mmon=E3=82=AF=E3=83=A9=E3=82=B9=E3=81=AB=E7=A7=BB=E5=8B=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit HttpConnection クラスを使用しない HttpClient 等でのリクエストにも利用できる状態にするため --- OpenTween/Connection/HttpConnection.cs | 42 ++--------------------------- OpenTween/Connection/HttpConnectionOAuth.cs | 2 +- OpenTween/Connection/HttpOAuthApiProxy.cs | 2 +- OpenTween/MyCommon.cs | 40 +++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 42 deletions(-) diff --git a/OpenTween/Connection/HttpConnection.cs b/OpenTween/Connection/HttpConnection.cs index a36156fd..f3419dab 100644 --- a/OpenTween/Connection/HttpConnection.cs +++ b/OpenTween/Connection/HttpConnection.cs @@ -102,7 +102,7 @@ namespace OpenTween UriBuilder ub = new UriBuilder(requestUri.AbsoluteUri); if (param != null && (method == "GET" || method == "DELETE" || method == "HEAD")) { - ub.Query = CreateQueryString(param); + ub.Query = MyCommon.BuildQueryString(param); } HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(ub.Uri); @@ -119,7 +119,7 @@ namespace OpenTween //POST/PUTメソッドの場合は、ボディデータとしてクエリ構成して書き込み using (StreamWriter writer = new StreamWriter(webReq.GetRequestStream())) { - writer.Write(CreateQueryString(param)); + writer.Write(MyCommon.BuildQueryString(param)); } } //cookie設定 @@ -520,22 +520,6 @@ namespace OpenTween } /// - ///クエリコレクションをkey=value形式の文字列に構成して戻す - /// - ///クエリ、またはポストデータとなるkey-valueコレクション - protected string CreateQueryString(IDictionary param) - { - if (param == null || param.Count == 0) return string.Empty; - - StringBuilder query = new StringBuilder(); - foreach (string key in param.Keys) - { - query.AppendFormat("{0}={1}&", QueryEncode(key), QueryEncode(param[key])); - } - return query.ToString(0, query.Length - 1); - } - - /// ///クエリ形式(key1=value1&key2=value2&...)の文字列をkey-valueコレクションに詰め直し /// ///クエリ文字列 @@ -576,28 +560,6 @@ namespace OpenTween return sb.ToString(); } - /// - ///2バイト文字も考慮したクエリ用エンコード - /// - ///エンコードする文字列 - ///エンコード結果文字列 - protected string QueryEncode(string stringToEncode) - { - // .NET 4.5+: Reserved characters のうち、Uriクラスによってエスケープ強制解除されてしまうものも最初から Unreserved として扱う - const string UnreservedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~!'()*:"; - StringBuilder sb = new StringBuilder(); - byte[] bytes = Encoding.UTF8.GetBytes(stringToEncode); - - foreach (byte b in bytes) - { - if (UnreservedChars.IndexOf((char)b) != -1) - sb.Append((char)b); - else - sb.AppendFormat("%{0:X2}", b); - } - return sb.ToString(); - } - #region "InstanceTimeout" /// ///通信タイムアウト時間(ms) diff --git a/OpenTween/Connection/HttpConnectionOAuth.cs b/OpenTween/Connection/HttpConnectionOAuth.cs index d9a040bc..cf37bced 100644 --- a/OpenTween/Connection/HttpConnectionOAuth.cs +++ b/OpenTween/Connection/HttpConnectionOAuth.cs @@ -531,7 +531,7 @@ namespace OpenTween // パラメタをソート済みディクショナリに詰替(OAuthの仕様) SortedDictionary< string, string > sorted = new SortedDictionary< string, string >( parameter ); // URLエンコード済みのクエリ形式文字列に変換 - string paramString = this.CreateQueryString( sorted ); + string paramString = MyCommon.BuildQueryString( sorted ); // アクセス先URLの整形 string url = string.Format( "{0}://{1}{2}", uri.Scheme, uri.Host, uri.AbsolutePath ); // 署名のベース文字列生成(&区切り)。クエリ形式文字列は再エンコードする diff --git a/OpenTween/Connection/HttpOAuthApiProxy.cs b/OpenTween/Connection/HttpOAuthApiProxy.cs index 99b90aa8..df3f0a44 100644 --- a/OpenTween/Connection/HttpOAuthApiProxy.cs +++ b/OpenTween/Connection/HttpOAuthApiProxy.cs @@ -56,7 +56,7 @@ namespace OpenTween //パラメタをソート済みディクショナリに詰替(OAuthの仕様) SortedDictionary sorted = new SortedDictionary(parameter); //URLエンコード済みのクエリ形式文字列に変換 - string paramString = CreateQueryString(sorted); + string paramString = MyCommon.BuildQueryString(sorted); //アクセス先URLの整形 string url = string.Format("{0}://{1}{2}", uri.Scheme, uri.Host, uri.AbsolutePath); //本来のアクセス先URLに再設定(api.twitter.com固定) diff --git a/OpenTween/MyCommon.cs b/OpenTween/MyCommon.cs index 91799ea7..cb0adc1a 100644 --- a/OpenTween/MyCommon.cs +++ b/OpenTween/MyCommon.cs @@ -1009,5 +1009,45 @@ namespace OpenTween return client; } + + /// + /// 指定された IDictionary を元にクエリ文字列を生成します + /// + /// 生成するクエリの key-value コレクション + public static string BuildQueryString(IDictionary param) + { + if (param == null || param.Count == 0) + return string.Empty; + + var query = param + .Where(x => x.Value != null) + .Select(x => EscapeQueryString(x.Key) + '=' + EscapeQueryString(x.Value)); + + return string.Join("&", query); + } + + // .NET 4.5+: Reserved characters のうち、Uriクラスによってエスケープ強制解除されてしまうものも最初から Unreserved として扱う + private static readonly HashSet UnreservedChars = + new HashSet("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~!'()*:"); + + /// + /// 2バイト文字も考慮したクエリ用エンコード + /// + /// エンコードする文字列 + /// エンコード結果文字列 + public static string EscapeQueryString(string stringToEncode) + { + var sb = new StringBuilder(stringToEncode.Length * 2); + + foreach (var b in Encoding.UTF8.GetBytes(stringToEncode)) + { + if (UnreservedChars.Contains((char)b)) + sb.Append((char)b); + else + sb.AppendFormat("%{0:X2}", b); + } + + return sb.ToString(); + } } } -- 2.11.0