2008-03-10 Stephane Delcroix <sdelcroix@novell.com>
authorStephane Delcroix <stephane@mono-cvs.ximian.com>
Mon, 10 Mar 2008 09:23:00 +0000 (09:23 -0000)
committerStephane Delcroix <stephane@mono-cvs.ximian.com>
Mon, 10 Mar 2008 09:23:00 +0000 (09:23 -0000)
* Uri.cs: port the changes I did in System.Uri in r97844.

svn path=/trunk/mcs/; revision=97845

mcs/class/corlib/Mono.Security/ChangeLog
mcs/class/corlib/Mono.Security/Uri.cs

index 057e0d9f2c56fab0455ab94cec73b1561ee08e8a..90bc20f234578caee4a87290f955430d53ade18d 100644 (file)
@@ -1,3 +1,7 @@
+2008-03-10  Stephane Delcroix  <sdelcroix@novell.com>
+
+       * Uri.cs: port the changes I did in System.Uri in r97844.
+
 2007-03-11  Zoltan Varga  <vargaz@gmail.com>
 
        * ASN1Convert.cs: Fix a warning.
index bc8e63686ff78070a72c57f84725449e51893650..e9ac8ae299ec3d8f9ab6261687556d05d8eb82b9 100644 (file)
@@ -8,6 +8,7 @@
 //    Ian MacLean (ianm@activestate.com)
 //    Ben Maurer (bmaurer@users.sourceforge.net)
 //    Atsushi Enomoto (atsushi@ximian.com)
+//    Stephane Delcroix  <stephane@delcroix.org>
 //
 // (C) 2001 Garrett Rooney
 // (C) 2003 Ian MacLean
@@ -777,11 +778,9 @@ namespace Mono.Security {
                        if (str == null)
                                return String.Empty;
                        
-                       byte [] data = Encoding.UTF8.GetBytes (str.ToCharArray ());
                        StringBuilder s = new StringBuilder ();
-                       int len = data.Length;  
+                       int len = str.Length;   
                        for (int i = 0; i < len; i++) {
-                               char c = (char) data [i];
                                // reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
                                // mark        = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
                                // control     = <US-ASCII coded characters 00-1F and 7F hexadecimal>
@@ -791,33 +790,34 @@ namespace Mono.Security {
 
                                // check for escape code already placed in str, 
                                // i.e. for encoding that follows the pattern 
-                // "%hexhex" in a string, where "hex" is a digit from 0-9 
+                               // "%hexhex" in a string, where "hex" is a digit from 0-9 
                                // or a letter from A-F (case-insensitive).
-                               if('%'.Equals(c) && IsHexEncoding(str,i))
-                               {
+                               if (IsHexEncoding (str,i)) {
                                        // if ,yes , copy it as is
-                                       s.Append(c);
-                                       s.Append(str[++i]);
-                                       s.Append(str[++i]);
+                                       s.Append(str.Substring (i, 3));
+                                       i += 2;
                                        continue;
                                }
 
-                               if ((c <= 0x20) || (c >= 0x7f) || 
-                                   ("<>%\"{}|\\^`".IndexOf (c) != -1) ||
-                                   (escapeHex && (c == '#')) ||
-                                   (escapeBrackets && (c == '[' || c == ']')) ||
-                                   (escapeReserved && (";/?:@&=+$,".IndexOf (c) != -1))) {
-                                       s.Append (HexEscape (c));
-                                       continue;
+                               byte [] data = Encoding.UTF8.GetBytes (new char[] {str[i]});
+                               int length = data.Length;
+                               for (int j = 0; j < length; j++) {
+                                       char c = (char) data [j];
+                                       if ((c <= 0x20) || (c >= 0x7f) || 
+                                           ("<>%\"{}|\\^`".IndexOf (c) != -1) ||
+                                           (escapeHex && (c == '#')) ||
+                                           (escapeBrackets && (c == '[' || c == ']')) ||
+                                           (escapeReserved && (";/?:@&=+$,".IndexOf (c) != -1))) {
+                                               s.Append (HexEscape (c));
+                                               continue;
+                                       }       
+                                       s.Append (c);
                                }
-                               
-                                       
-                               s.Append (c);
                        }
                        
                        return s.ToString ();
                }
-
+       
                // This method is called from .ctor(). When overriden, we can
                // avoid the "absolute uri" constraints of the .ctor() by
                // overriding with custom code.