From ca7916a8d87709be6051d9e6af1a9c6afdab659f Mon Sep 17 00:00:00 2001 From: sta Date: Sun, 17 Aug 2014 22:45:43 +0900 Subject: [PATCH] Refactored HttpUtility.cs --- websocket-sharp/Net/HttpUtility.cs | 255 ++++++++++++++--------------- 1 file changed, 122 insertions(+), 133 deletions(-) diff --git a/websocket-sharp/Net/HttpUtility.cs b/websocket-sharp/Net/HttpUtility.cs index f79cc488..44ee508c 100644 --- a/websocket-sharp/Net/HttpUtility.cs +++ b/websocket-sharp/Net/HttpUtility.cs @@ -52,52 +52,37 @@ namespace WebSocketSharp.Net { internal sealed class HttpUtility { - #region Private Static Fields + #region Private Fields private static Dictionary _entities; - private static char [] _hexChars = "0123456789abcdef".ToCharArray (); + private static char[] _hexChars = "0123456789abcdef".ToCharArray (); private static object _sync = new object (); #endregion - #region Private Static Properties - - private static Dictionary Entities { - get { - lock (_sync) { - if (_entities == null) - initEntities (); - - return _entities; - } - } - } - - #endregion - #region Private Methods - private static int getChar (byte [] bytes, int offset, int length) + private static int getChar (byte[] bytes, int offset, int length) { - var value = 0; + var val = 0; var end = length + offset; - for (int i = offset; i < end; i++) { - var current = getInt (bytes [i]); + for (var i = offset; i < end; i++) { + var current = getInt (bytes[i]); if (current == -1) return -1; - value = (value << 4) + current; + val = (val << 4) + current; } - return value; + return val; } private static int getChar (string s, int offset, int length) { - var value = 0; + var val = 0; var end = length + offset; - for (int i = offset; i < end; i++) { - var c = s [i]; + for (var i = offset; i < end; i++) { + var c = s[i]; if (c > 127) return -1; @@ -105,17 +90,27 @@ namespace WebSocketSharp.Net if (current == -1) return -1; - value = (value << 4) + current; + val = (val << 4) + current; } - return value; + return val; } - private static char [] getChars (MemoryStream buffer, Encoding encoding) + private static char[] getChars (MemoryStream buffer, Encoding encoding) { return encoding.GetChars (buffer.GetBuffer (), 0, (int) buffer.Length); } + private static Dictionary getEntities () + { + lock (_sync) { + if (_entities == null) + initEntities (); + + return _entities; + } + } + private static int getInt (byte b) { var c = (char) b; @@ -411,16 +406,16 @@ namespace WebSocketSharp.Net var i = (int) c; var idx = i >> 12; - result.WriteByte ((byte) _hexChars [idx]); + result.WriteByte ((byte) _hexChars[idx]); idx = (i >> 8) & 0x0F; - result.WriteByte ((byte) _hexChars [idx]); + result.WriteByte ((byte) _hexChars[idx]); idx = (i >> 4) & 0x0F; - result.WriteByte ((byte) _hexChars [idx]); + result.WriteByte ((byte) _hexChars[idx]); idx = i & 0x0F; - result.WriteByte ((byte) _hexChars [idx]); + result.WriteByte ((byte) _hexChars[idx]); return; } @@ -450,14 +445,15 @@ namespace WebSocketSharp.Net } var idx = ((int) c) >> 4; - result.WriteByte ((byte) _hexChars [idx]); + result.WriteByte ((byte) _hexChars[idx]); idx = ((int) c) & 0x0F; - result.WriteByte ((byte) _hexChars [idx]); - } - else { - result.WriteByte ((byte) c); + result.WriteByte ((byte) _hexChars[idx]); + + return; } + + result.WriteByte ((byte) c); } private static void urlPathEncodeChar (char c, Stream result) @@ -468,29 +464,36 @@ namespace WebSocketSharp.Net result.WriteByte ((byte) '%'); var i = ((int) b) >> 4; - result.WriteByte ((byte) _hexChars [i]); + result.WriteByte ((byte) _hexChars[i]); i = ((int) b) & 0x0F; - result.WriteByte ((byte) _hexChars [i]); + result.WriteByte ((byte) _hexChars[i]); } + + return; } - else if (c == ' ') { + + if (c == ' ') { result.WriteByte ((byte) '%'); result.WriteByte ((byte) '2'); result.WriteByte ((byte) '0'); + + return; } - else { - result.WriteByte ((byte) c); - } + + result.WriteByte ((byte) c); } private static void writeCharBytes (IList buffer, char c, Encoding encoding) { - if (c > 255) - foreach (var b in encoding.GetBytes (new [] { c })) + if (c > 255) { + foreach (var b in encoding.GetBytes (new[] { c })) buffer.Add (b); - else - buffer.Add ((byte) c); + + return; + } + + buffer.Add ((byte) c); } #endregion @@ -503,7 +506,7 @@ namespace WebSocketSharp.Net if (requestUri == null || requestUri.Length == 0 || host == null || host.Length == 0) return null; - string scheme = null; + string schm = null; string path = null; if (requestUri.StartsWith ("/")) { path = requestUri; @@ -511,8 +514,8 @@ namespace WebSocketSharp.Net else if (requestUri.MaybeUri ()) { Uri uri; var valid = Uri.TryCreate (requestUri, UriKind.Absolute, out uri) && - (((scheme = uri.Scheme).StartsWith ("http") && !websocketRequest) || - (scheme.StartsWith ("ws") && websocketRequest)); + (((schm = uri.Scheme).StartsWith ("http") && !websocketRequest) || + (schm.StartsWith ("ws") && websocketRequest)); if (!valid) return null; @@ -527,14 +530,14 @@ namespace WebSocketSharp.Net host = requestUri; } - if (scheme == null) - scheme = (websocketRequest ? "ws" : "http") + (secure ? "s" : String.Empty); + if (schm == null) + schm = (websocketRequest ? "ws" : "http") + (secure ? "s" : String.Empty); var colon = host.IndexOf (':'); if (colon == -1) - host = String.Format ("{0}:{1}", host, scheme == "http" || scheme == "ws" ? 80 : 443); + host = String.Format ("{0}:{1}", host, schm == "http" || schm == "ws" ? 80 : 443); - var url = String.Format ("{0}://{1}{2}", scheme, host, path); + var url = String.Format ("{0}://{1}{2}", schm, host, path); Uri res; if (!Uri.TryCreate (url, UriKind.Absolute, out res)) @@ -558,10 +561,10 @@ namespace WebSocketSharp.Net internal static NameValueCollection ParseQueryStringInternally (string query, Encoding encoding) { int len; - if (query == null || (len = query.Length) == 0 || (len == 1 && query [0] == '?')) + if (query == null || (len = query.Length) == 0 || (len == 1 && query[0] == '?')) return new NameValueCollection (1); - if (query [0] == '?') + if (query[0] == '?') query = query.Substring (1); var res = new QueryStringCollection (); @@ -585,16 +588,15 @@ namespace WebSocketSharp.Net } internal static string UrlDecodeInternally ( - byte [] bytes, int offset, int count, Encoding encoding) + byte[] bytes, int offset, int count, Encoding encoding) { var output = new StringBuilder (); using (var acc = new MemoryStream ()) { var end = count + offset; - - int xchar; - for (int i = offset; i < end; i++) { - if (bytes [i] == '%' && i + 2 < count && bytes [i + 1] != '%') { - if (bytes [i + 1] == (byte) 'u' && i + 5 < end) { + for (var i = offset; i < end; i++) { + if (bytes[i] == '%' && i + 2 < count && bytes[i + 1] != '%') { + int xchar; + if (bytes[i + 1] == (byte) 'u' && i + 5 < end) { if (acc.Length > 0) { output.Append (getChars (acc, encoding)); acc.SetLength (0); @@ -621,10 +623,12 @@ namespace WebSocketSharp.Net acc.SetLength (0); } - if (bytes [i] == '+') + if (bytes[i] == '+') { output.Append (' '); - else - output.Append ((char) bytes [i]); + continue; + } + + output.Append ((char) bytes[i]); } if (acc.Length > 0) @@ -634,12 +638,12 @@ namespace WebSocketSharp.Net return output.ToString (); } - internal static byte [] UrlDecodeToBytesInternally (byte [] bytes, int offset, int count) + internal static byte[] UrlDecodeToBytesInternally (byte[] bytes, int offset, int count) { using (var res = new MemoryStream ()) { var end = offset + count; - for (int i = offset; i < end; i++) { - var c = (char) bytes [i]; + for (var i = offset; i < end; i++) { + var c = (char) bytes[i]; if (c == '+') { c = ' '; } @@ -659,19 +663,19 @@ namespace WebSocketSharp.Net } } - internal static byte [] UrlEncodeToBytesInternally (byte [] bytes, int offset, int count) + internal static byte[] UrlEncodeToBytesInternally (byte[] bytes, int offset, int count) { using (var res = new MemoryStream ()) { var end = offset + count; - for (int i = offset; i < end; i++) - urlEncodeChar ((char) bytes [i], res, false); + for (var i = offset; i < end; i++) + urlEncodeChar ((char) bytes[i], res, false); res.Close (); return res.ToArray (); } } - internal static byte [] UrlEncodeUnicodeToBytesInternally (string s) + internal static byte[] UrlEncodeUnicodeToBytesInternally (string s) { using (var res = new MemoryStream ()) { foreach (var c in s) @@ -702,8 +706,7 @@ namespace WebSocketSharp.Net ? "<" : c == '>' ? ">" - : c.ToString () - ); + : c.ToString ()); return output.ToString (); } @@ -738,6 +741,7 @@ namespace WebSocketSharp.Net // 2 -> between '&' and ';' but no '#' // 3 -> '#' found after '&' and getting numbers var state = 0; + var number = 0; var haveTrailingDigits = false; foreach (var c in s) { @@ -788,8 +792,9 @@ namespace WebSocketSharp.Net entity.Append (c); if (c == ';') { var key = entity.ToString (); - if (key.Length > 1 && Entities.ContainsKey (key.Substring (1, key.Length - 2))) - key = Entities [key.Substring (1, key.Length - 2)].ToString (); + var entities = getEntities (); + if (key.Length > 1 && entities.ContainsKey (key.Substring (1, key.Length - 2))) + key = entities[key.Substring (1, key.Length - 2)].ToString (); output.Append (key); state = 0; @@ -941,10 +946,7 @@ namespace WebSocketSharp.Net if (query == null) throw new ArgumentNullException ("query"); - if (encoding == null) - throw new ArgumentNullException ("encoding"); - - return ParseQueryStringInternally (query, encoding); + return ParseQueryStringInternally (query, encoding ?? Encoding.UTF8); } public static string UrlDecode (string s) @@ -960,14 +962,13 @@ namespace WebSocketSharp.Net if (encoding == null) encoding = Encoding.UTF8; - var len = s.Length; var buff = new List (); - - int xchar; - for (int i = 0; i < len; i++) { - var c = s [i]; - if (c == '%' && i + 2 < len && s [i + 1] != '%') { - if (s [i + 1] == 'u' && i + 5 < len) { + var len = s.Length; + for (var i = 0; i < len; i++) { + var c = s[i]; + if (c == '%' && i + 2 < len && s[i + 1] != '%') { + int xchar; + if (s[i + 1] == 'u' && i + 5 < len) { // Unicode hex sequence. xchar = getChar (s, i + 2, 4); if (xchar != -1) { @@ -989,31 +990,28 @@ namespace WebSocketSharp.Net continue; } - if (c == '+') + if (c == '+') { writeCharBytes (buff, ' ', encoding); - else - writeCharBytes (buff, c, encoding); + continue; + } + + writeCharBytes (buff, c, encoding); } return encoding.GetString (buff.ToArray ()); } - public static string UrlDecode (byte [] bytes, Encoding encoding) + public static string UrlDecode (byte[] bytes, Encoding encoding) { - if (bytes == null) - return null; - - var len = bytes.Length; - if (len == 0) - return String.Empty; - - if (encoding == null) - encoding = Encoding.UTF8; - - return UrlDecodeInternally (bytes, 0, len, encoding); + int len; + return bytes == null + ? null + : (len = bytes.Length) == 0 + ? String.Empty + : UrlDecodeInternally (bytes, 0, len, encoding ?? Encoding.UTF8); } - public static string UrlDecode (byte [] bytes, int offset, int count, Encoding encoding) + public static string UrlDecode (byte[] bytes, int offset, int count, Encoding encoding) { if (bytes == null) return null; @@ -1028,13 +1026,10 @@ namespace WebSocketSharp.Net if (count < 0 || count > len - offset) throw new ArgumentOutOfRangeException ("count"); - if (encoding == null) - encoding = Encoding.UTF8; - - return UrlDecodeInternally (bytes, offset, count, encoding); + return UrlDecodeInternally (bytes, offset, count, encoding ?? Encoding.UTF8); } - public static byte [] UrlDecodeToBytes (byte [] bytes) + public static byte[] UrlDecodeToBytes (byte[] bytes) { int len; return bytes != null && (len = bytes.Length) > 0 @@ -1042,34 +1037,31 @@ namespace WebSocketSharp.Net : bytes; } - public static byte [] UrlDecodeToBytes (string s) + public static byte[] UrlDecodeToBytes (string s) { return UrlDecodeToBytes (s, Encoding.UTF8); } - public static byte [] UrlDecodeToBytes (string s, Encoding encoding) + public static byte[] UrlDecodeToBytes (string s, Encoding encoding) { if (s == null) return null; if (s.Length == 0) - return new byte [0]; + return new byte[0]; - if (encoding == null) - encoding = Encoding.UTF8; - - var bytes = encoding.GetBytes (s); + var bytes = (encoding ?? Encoding.UTF8).GetBytes (s); return UrlDecodeToBytesInternally (bytes, 0, bytes.Length); } - public static byte [] UrlDecodeToBytes (byte [] bytes, int offset, int count) + public static byte[] UrlDecodeToBytes (byte[] bytes, int offset, int count) { int len; if (bytes == null || (len = bytes.Length) == 0) return bytes; if (count == 0) - return new byte [0]; + return new byte[0]; if (offset < 0 || offset >= len) throw new ArgumentOutOfRangeException ("offset"); @@ -1080,7 +1072,7 @@ namespace WebSocketSharp.Net return UrlDecodeToBytesInternally (bytes, offset, count); } - public static string UrlEncode (byte [] bytes) + public static string UrlEncode (byte[] bytes) { int len; return bytes == null @@ -1119,13 +1111,13 @@ namespace WebSocketSharp.Net encoding = Encoding.UTF8; // Avoided GetByteCount call. - var bytes = new byte [encoding.GetMaxByteCount (len)]; + var bytes = new byte[encoding.GetMaxByteCount (len)]; var realLen = encoding.GetBytes (s, 0, len, bytes, 0); return Encoding.ASCII.GetString (UrlEncodeToBytesInternally (bytes, 0, realLen)); } - public static string UrlEncode (byte [] bytes, int offset, int count) + public static string UrlEncode (byte[] bytes, int offset, int count) { var encoded = UrlEncodeToBytes (bytes, offset, count); return encoded == null @@ -1135,7 +1127,7 @@ namespace WebSocketSharp.Net : Encoding.ASCII.GetString (encoded); } - public static byte [] UrlEncodeToBytes (byte [] bytes) + public static byte[] UrlEncodeToBytes (byte[] bytes) { int len; return bytes != null && (len = bytes.Length) > 0 @@ -1143,34 +1135,31 @@ namespace WebSocketSharp.Net : bytes; } - public static byte [] UrlEncodeToBytes (string s) + public static byte[] UrlEncodeToBytes (string s) { return UrlEncodeToBytes (s, Encoding.UTF8); } - public static byte [] UrlEncodeToBytes (string s, Encoding encoding) + public static byte[] UrlEncodeToBytes (string s, Encoding encoding) { if (s == null) return null; if (s.Length == 0) - return new byte [0]; + return new byte[0]; - if (encoding == null) - encoding = Encoding.UTF8; - - var bytes = encoding.GetBytes (s); + var bytes = (encoding ?? Encoding.UTF8).GetBytes (s); return UrlEncodeToBytesInternally (bytes, 0, bytes.Length); } - public static byte [] UrlEncodeToBytes (byte [] bytes, int offset, int count) + public static byte[] UrlEncodeToBytes (byte[] bytes, int offset, int count) { int len; if (bytes == null || (len = bytes.Length) == 0) return bytes; if (count == 0) - return new byte [0]; + return new byte[0]; if (offset < 0 || offset >= len) throw new ArgumentOutOfRangeException ("offset"); @@ -1188,12 +1177,12 @@ namespace WebSocketSharp.Net : s; } - public static byte [] UrlEncodeUnicodeToBytes (string s) + public static byte[] UrlEncodeUnicodeToBytes (string s) { return s == null ? null : s.Length == 0 - ? new byte [0] + ? new byte[0] : UrlEncodeUnicodeToBytesInternally (s); }