From 4bf079b1a2fded2df3c2b89ae7d8ace25c97dbe4 Mon Sep 17 00:00:00 2001 From: sta Date: Fri, 30 May 2014 16:19:23 +0900 Subject: [PATCH] Fix for query string --- websocket-sharp/Net/HttpListenerRequest.cs | 30 +---------------- websocket-sharp/Net/HttpUtility.cs | 32 ++++++++++++++++++- .../WebSockets/TcpListenerWebSocketContext.cs | 31 ++---------------- 3 files changed, 34 insertions(+), 59 deletions(-) diff --git a/websocket-sharp/Net/HttpListenerRequest.cs b/websocket-sharp/Net/HttpListenerRequest.cs index 6e6661b4..41521947 100644 --- a/websocket-sharp/Net/HttpListenerRequest.cs +++ b/websocket-sharp/Net/HttpListenerRequest.cs @@ -334,7 +334,7 @@ namespace WebSocketSharp.Net /// public NameValueCollection QueryString { get { - return _queryString ?? (_queryString = createQueryString (_url.Query)); + return _queryString ?? (_queryString = HttpUtility.ParseQueryStringSimply (_url.Query)); } } @@ -454,34 +454,6 @@ namespace WebSocketSharp.Net #region Private Methods - private static NameValueCollection createQueryString (string query) - { - if (query == null || query.Length == 0) - return new NameValueCollection (1); - - var res = new NameValueCollection (); - if (query [0] == '?') - query = query.Substring (1); - - var components = query.Split ('&'); - foreach (var component in components) { - var i = component.IndexOf ('='); - if (i > -1) { - var name = HttpUtility.UrlDecode (component.Substring (0, i)); - var val = component.Length > i + 1 - ? HttpUtility.UrlDecode (component.Substring (i + 1)) - : String.Empty; - - res.Add (name, val); - } - else { - res.Add (null, HttpUtility.UrlDecode (component)); - } - } - - return res; - } - private static bool tryCreateVersion (string version, out Version result) { result = null; diff --git a/websocket-sharp/Net/HttpUtility.cs b/websocket-sharp/Net/HttpUtility.cs index 4e14ecae..a4b52e4c 100644 --- a/websocket-sharp/Net/HttpUtility.cs +++ b/websocket-sharp/Net/HttpUtility.cs @@ -1038,7 +1038,7 @@ namespace WebSocketSharp.Net var len = query.Length; if (len == 0 || (len == 1 && query [0] == '?')) - return new NameValueCollection (); + return new NameValueCollection (1); if (query [0] == '?') query = query.Substring (1); @@ -1052,6 +1052,36 @@ namespace WebSocketSharp.Net return res; } + // Used by HttpListenerRequest and TcpListenerWebSocketContext. + public static NameValueCollection ParseQueryStringSimply (string query) + { + int len; + if (query == null || (len = query.Length) == 0 || (len == 1 && query [0] == '?')) + return new NameValueCollection (1); + + if (query [0] == '?') + query = query.Substring (1); + + var res = new QueryStringCollection (); + var components = query.Split ('&'); + foreach (var component in components) { + var i = component.IndexOf ('='); + if (i > -1) { + var name = UrlDecode (component.Substring (0, i), Encoding.UTF8); + var val = component.Length > i + 1 + ? UrlDecode (component.Substring (i + 1), Encoding.UTF8) + : String.Empty; + + res.Add (name, val); + } + else { + res.Add (null, UrlDecode (component, Encoding.UTF8)); + } + } + + return res; + } + public static string UrlDecode (string s) { return UrlDecode (s, Encoding.UTF8); diff --git a/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs b/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs index 48d428bd..aa0d9364 100644 --- a/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs +++ b/websocket-sharp/Net/WebSockets/TcpListenerWebSocketContext.cs @@ -189,7 +189,8 @@ namespace WebSocketSharp.Net.WebSockets public override NameValueCollection QueryString { get { return _queryString ?? - (_queryString = createQueryString (_uri != null ? _uri.Query : null)); + (_queryString = + HttpUtility.ParseQueryStringSimply (_uri != null ? _uri.Query : null)); } } @@ -309,34 +310,6 @@ namespace WebSocketSharp.Net.WebSockets #region Private Methods - private static NameValueCollection createQueryString (string query) - { - if (query == null || query.Length == 0) - return new NameValueCollection (1); - - var res = new NameValueCollection (); - if (query [0] == '?') - query = query.Substring (1); - - var components = query.Split ('&'); - foreach (var component in components) { - var i = component.IndexOf ('='); - if (i > -1) { - var name = HttpUtility.UrlDecode (component.Substring (0, i)); - var val = component.Length > i + 1 - ? HttpUtility.UrlDecode (component.Substring (i + 1)) - : String.Empty; - - res.Add (name, val); - } - else { - res.Add (null, HttpUtility.UrlDecode (component)); - } - } - - return res; - } - private static Uri createRequestUrl (HandshakeRequest request, bool secure) { var host = request.Headers ["Host"];