Fix To2047
authorGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Fri, 11 Mar 2011 21:15:59 +0000 (16:15 -0500)
committerGonzalo Paniagua Javier <gonzalo.mono@gmail.com>
Fri, 11 Mar 2011 21:17:12 +0000 (16:17 -0500)
mcs/class/System/System.Net.Mime/ContentType.cs
mcs/class/System/Test/System.Net.Mime/ContentTypeTest.cs

index fd34e6bf437d5415b2cf2acd7acccc86caea6fba..50ffae0ea400a18d62036cdcfdef5165ccb8f7f2 100644 (file)
@@ -204,17 +204,19 @@ namespace System.Net.Mime {
                                return TransferEncoding.QuotedPrintable;
                }
 
+               static char [] hex = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
                internal static string To2047(byte [] bytes)
                {
-                       System.IO.StringWriter writer = new System.IO.StringWriter ();
+                       StringBuilder sb = new StringBuilder ();
                        foreach (byte i in bytes) {
-                               if (i > 127 || i == '\t') {
-                                       writer.Write ("=");
-                                       writer.Write (Convert.ToString (i, 16).ToUpper ());
+                               if (i < 0x21 || i > 0x7E || i == '?' || i == '=' || i == '_') {
+                                       sb.Append ('=');
+                                       sb.Append (hex [(i >> 4) & 0x0f]);
+                                       sb.Append (hex [i & 0x0f]);
                                } else
-                               writer.Write (Convert.ToChar (i));
+                                       sb.Append ((char) i);
                        }
-                       return writer.GetStringBuilder ().ToString ();
+                       return sb.ToString ();
                }
 
                internal static string EncodeSubjectRFC2047 (string s, Encoding enc)
index 6d6f98563e724168142438c33e167fe4b3a90da0..d9e24be0932ea9b0893785bedde3748c2b4741b1 100644 (file)
@@ -162,6 +162,13 @@ namespace MonoTests.System.Net.Mime
                        ct.Parameters.Add ("start", "urn:foo\"bar\"");
                        Assert.AreEqual ("application/octet-stream; start=\"urn:foo\\\"bar\\\"\"", ct.ToString ());
                }
+
+               [Test]
+               public void EncodedChars ()
+               {
+                       ContentType ct = new ContentType ();
+                       ct.Parameters.Add ("ASCII", "This is ASCII");
+               }
        }
 }
 #endif