2010-03-06 Marek Habersack <mhabersack@novell.com>
authorMarek Habersack <grendel@twistedcode.net>
Sat, 6 Mar 2010 02:19:39 +0000 (02:19 -0000)
committerMarek Habersack <grendel@twistedcode.net>
Sat, 6 Mar 2010 02:19:39 +0000 (02:19 -0000)
* HttpUtility.cs: decode entities which use hexadecimal
encoding. Fixes bug #585992. Patch from Sebastien Morin
<smsisko@gmail.com>, thanks!

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

mcs/class/System.Web/System.Web/ChangeLog
mcs/class/System.Web/System.Web/HttpUtility.cs
mcs/class/System.Web/Test/System.Web/HttpUtilityTest.cs

index 9c75a9bfc22daac93c96eea1f4ebc5753db3c3c9..1d0354a8da0653cacd59928d9111a676b2a2c3e5 100644 (file)
@@ -1,3 +1,9 @@
+2010-03-06  Marek Habersack  <mhabersack@novell.com>
+
+       * HttpUtility.cs: decode entities which use hexadecimal
+       encoding. Fixes bug #585992. Patch from Sebastien Morin
+       <smsisko@gmail.com>, thanks!
+
 2010-03-04  Marek Habersack  <mhabersack@novell.com>
 
        * HttpRuntime.cs: do less work in the static constructor. Most of
index d9afcf73a59753d43f53883ec5875cf65be68f8a..1ee591ed41a91dbdf3ecf2ce4be113d4c8ea5b6f 100644 (file)
@@ -843,6 +843,7 @@ namespace System.Web {
                        // 3 -> '#' found after '&' and getting numbers
                        int state = 0;
                        int number = 0;
+                       bool is_hex_value = false;
                        bool have_trailing_digits = false;
        
                        for (int i = 0; i < len; i++) {
@@ -878,6 +879,7 @@ namespace System.Web {
                                                entity.Length = 0;
                                        } else {
                                                number = 0;
+                                               is_hex_value = false;
                                                if (c != '#') {
                                                        state = 2;
                                                } else {
@@ -908,9 +910,14 @@ namespace System.Web {
                                                state = 0;
                                                entity.Length = 0;
                                                have_trailing_digits = false;
+                                       } else if (is_hex_value &&  Uri.IsHexDigit(c)) {
+                                               number = number * 16 + Uri.FromHex(c);
+                                               have_trailing_digits = true;
                                        } else if (Char.IsDigit (c)) {
                                                number = number * 10 + ((int) c - '0');
                                                have_trailing_digits = true;
+                                       } else if (number == 0 && (c == 'x' || c == 'X')) {
+                                               is_hex_value = true;
                                        } else {
                                                state = 2;
                                                if (have_trailing_digits) {
index 21d199a9670d28efaeceb66f339d8754abbe5f96..58b5cfa1ec61b7e313015c721285b900d32597fb 100644 (file)
@@ -345,6 +345,15 @@ namespace MonoTests.System.Web {
                        Assert.AreEqual ("\xE9", HttpUtility.HtmlDecode ("&#233;"));
                }
 
+               [Test (Description="Bug #585992")]
+               public void Decode2 ()
+               {
+                       string encodedSource = "&#169; == &#xA9; == &#XA9; and &#915; == &#x393; == &#X393;";
+                       string utf8Result = "© == © == © and Γ == Γ == Γ";
+
+                       Assert.AreEqual (utf8Result, HttpUtility.HtmlDecode (encodedSource), "#A1");
+               }
+               
                [Test]
                public void RoundTrip ()
                {