Reviewed by Mark and Olliver.
authorkmccullo <kmccullo@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 6 Jun 2007 02:32:15 +0000 (02:32 +0000)
committerkmccullo <kmccullo@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 6 Jun 2007 02:32:15 +0000 (02:32 +0000)
        - http://bugs.webkit.org/show_bug.cgi?id=13352  REGRESSION: Gmail hangs on send message.
        - Now we don't hang, but we do so by avoiding certain legitimate characters, the evangelism bug for this is: <rdar://problem/5252577> gmail does not accept legal characters in the form boundary

        * html/HTMLFormElement.cpp:
        (WebCore::getUniqueBoundaryString):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@22013 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/WebCore.xcodeproj/project.pbxproj
WebCore/html/HTMLFormElement.cpp

index 00d19b974c09d88d2cd8651982f1c353de670647..34adb59141c866b6374615335a861fbf64ac4606 100644 (file)
@@ -1,3 +1,13 @@
+2007-06-05  Kevin McCullough  <kmccullough@apple.com>
+
+        Reviewed by Mark and Olliver.
+
+        - http://bugs.webkit.org/show_bug.cgi?id=13352  REGRESSION: Gmail hangs on send message.
+        - Now we don't hang, but we do so by avoiding certain legitimate characters, the evangelism bug for this is: <rdar://problem/5252577> gmail does not accept legal characters in the form boundary
+
+        * html/HTMLFormElement.cpp:
+        (WebCore::getUniqueBoundaryString):
+
 2007-06-05  Anders Carlsson  <andersca@apple.com>
 
         Build fix.
index 22a4808ece84a11c3299683997c8c8835d42824a..86f9f5b4e2c778d9479943228326ea3bf557bf89 100644 (file)
                0867D690FE84028FC02AAC07 /* Project object */ = {
                        isa = PBXProject;
                        buildConfigurationList = 149C284308902B11008A9EFC /* Build configuration list for PBXProject "WebCore" */;
+                       compatibilityVersion = "Xcode 2.4";
                        hasScannedForEncodings = 1;
                        knownRegions = (
                                English,
                        productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
                        projectDirPath = "";
                        projectRoot = "";
+                       shouldCheckCompatibility = 1;
                        targets = (
                                93F198A508245E59001E9ABC /* WebCore */,
                                DD041FBE09D9DDBE0010AF2A /* Derived Sources */,
index a7ad6b8d8a4ca8958d56906872dcd4754e08fec2..a7fad39781a8fc34d8e55d4e131cde29cd298785 100644 (file)
@@ -365,25 +365,51 @@ void HTMLFormElement::submit()
 // Returns a 0-terminated C string in the vector.
 static void getUniqueBoundaryString(Vector<char>& boundary)
 {
+    // The RFC 2046 spec says the AlphaNumeric characters plus the following characters
+    // are legal for boundaries:  '()+_,-./:=?
+    // However the following characters, though legal, cause some sites to fail:
+    // (),./:=
+    // http://bugs.webkit.org/show_bug.cgi?id=13352
+    static const char AlphaNumericEncMap[64] =
+    {
+      0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
+      0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
+      0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
+      0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
+      0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E,
+      0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
+      0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33,
+      0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x41
+      // FIXME <rdar://problem/5252577> gmail does not accept legal characters in the form boundary
+      // As stated above, some legal characters cause, sites to fail. Specifically
+      // the / character which was the last character in the above array. I have
+      // replaced the last character with another character already in the array
+      // (notice the first and last values are both 0x41, A). Instead of picking
+      // another unique legal character for boundary strings that, because it has
+      // never been tested, may or may not break other sites, I simply
+      // replaced / with A.  This means A is twice as likely to occur in our boundary
+      // strings than any other character but I think this is fine for the time being.
+      // The FIXME here is about restoring the / character once the aforementioned
+      // radar has been resolved.
+    };
+
     // Start with an informative prefix.
     const char boundaryPrefix[] = "----WebKitFormBoundary";
     boundary.append(boundaryPrefix, strlen(boundaryPrefix));
 
-    // Append 16 characters of base 64 randomness.
+    // Append 16 random 7bit ascii AlphaNumeric characters.
     Vector<char> randomBytes;
-    for (int i = 0; i < 3; ++i) {
+
+    for (int i = 0; i < 4; ++i) {
         int randomness = randomNumber();
-        randomBytes.append(static_cast<char>(randomness >> 24));
-        randomBytes.append(static_cast<char>(randomness >> 16));
-        randomBytes.append(static_cast<char>(randomness >> 8));
-        randomBytes.append(static_cast<char>(randomness));
+        randomBytes.append(AlphaNumericEncMap[(randomness >> 24) & 0x3F]);
+        randomBytes.append(AlphaNumericEncMap[(randomness >> 16) & 0x3F]);
+        randomBytes.append(AlphaNumericEncMap[(randomness >> 8) & 0x3F]);
+        randomBytes.append(AlphaNumericEncMap[randomness & 0x3F]);
     }
-    Vector<char> randomBase64;
-    base64Encode(randomBytes, randomBase64);
-    boundary.append(randomBase64);
 
-    // Add a 0 at the end so we can use this as a C-style string.
-    boundary.append(0);
+    boundary.append(randomBytes);
+    boundary.append(0); // Add a 0 at the end so we can use this as a C-style string.
 }
 
 void HTMLFormElement::submit(Event* event, bool activateSubmitButton)