2008-08-13 Thiago Macieira <tjmaciei@trolltech.com>
authorhausmann@webkit.org <hausmann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Aug 2008 09:11:23 +0000 (09:11 +0000)
committerhausmann@webkit.org <hausmann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Aug 2008 09:11:23 +0000 (09:11 +0000)
        Reviewed by Simon.

        Fix encoding of [ and ] in the host part of the URL

        Until QUrl is fixed (making QUrl's tolerant parser more tolerant), we have to
        add this workaround to the QUrl <> WebCore::KURL conversion operator so that it
        doesn't encode [ and ] when they are found in the host part. That is, the
        following URL:
        http://[::1]/
        is valid and should not be reencoded to:
        http://%5b::1%5d/

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

WebCore/ChangeLog
WebCore/platform/qt/KURLQt.cpp
WebKit/qt/ChangeLog
WebKit/qt/tests/qwebframe/tst_qwebframe.cpp

index 005802d544a29c8f2032b9b57bc53f1ca8a25b22..da97d032d8d146a82b8a84972f85791bf07e13d0 100644 (file)
@@ -1,3 +1,20 @@
+2008-08-13  Thiago Macieira  <tjmaciei@trolltech.com>
+
+        Reviewed by Simon.
+
+        Fix encoding of [ and ] in the host part of the URL
+
+        Until QUrl is fixed (making QUrl's tolerant parser more tolerant), we have to
+        add this workaround to the QUrl <> WebCore::KURL conversion operator so that it
+        doesn't encode [ and ] when they are found in the host part. That is, the
+        following URL:
+        http://[::1]/
+        is valid and should not be reencoded to:
+        http://%5b::1%5d/
+
+        * platform/qt/KURLQt.cpp:
+        (WebCore::KURL::operator QUrl):
+
 2008-08-12  Mihnea Ovidenie  <mihnea@adobe.com>
 
         Fix for https://bugs.webkit.org/show_bug.cgi?id=19891
 2008-08-12  Mihnea Ovidenie  <mihnea@adobe.com>
 
         Fix for https://bugs.webkit.org/show_bug.cgi?id=19891
index 350b97bd4e065b5e98d3fc4e1f8c40bead2c0659..51f5422f76cb708d77a08b0ce5abbdb6f4aff1c8 100644 (file)
@@ -43,22 +43,36 @@ KURL::operator QUrl() const
     QByteArray ba;
     ba.reserve(length);
 
     QByteArray ba;
     ba.reserve(length);
 
+    int path = -1;
+    int host = m_string.find("://");
+    if (host != -1) {
+        host += 3;
+
+        path = m_string.find('/', host);
+    }
+
     for (unsigned i = 0; i < length; ++i) {
         const char chr = static_cast<char>(m_string[i]);
 
         switch (chr) {
     for (unsigned i = 0; i < length; ++i) {
         const char chr = static_cast<char>(m_string[i]);
 
         switch (chr) {
+            encode:
             case '{':
             case '}':
             case '|':
             case '\\':
             case '^':
             case '{':
             case '}':
             case '|':
             case '\\':
             case '^':
-            case '[':
-            case ']':
             case '`':
                 ba.append('%');
                 ba.append(toHex((chr & 0xf0) >> 4));
                 ba.append(toHex(chr & 0xf));
                 break;
             case '`':
                 ba.append('%');
                 ba.append(toHex((chr & 0xf0) >> 4));
                 ba.append(toHex(chr & 0xf));
                 break;
+            case '[':
+            case ']':
+                // special case: if this is the host part, don't encode
+                // otherwise, encode
+                if (host == -1 || (path != -1 && i >= path))
+                    goto encode;
+                // fall through
             default:
                 ba.append(chr);
                 break;
             default:
                 ba.append(chr);
                 break;
index 7e4405818c20e23f4582733f7c63e5dcd9f85bfe..73501ef968b606a116f606ca4c266e1075fd33d8 100644 (file)
@@ -1,3 +1,21 @@
+2008-08-13  Thiago Macieira  <tjmaciei@trolltech.com>
+
+        Reviewed by Simon.
+
+        Fix encoding of [ and ] in the host part of the URL
+
+        Until QUrl is fixed (making QUrl's tolerant parser more tolerant), we have to
+        add this workaround to the QUrl <> WebCore::KURL conversion operator so that it
+        doesn't encode [ and ] when they are found in the host part. That is, the
+        following URL:
+        http://[::1]/
+        is valid and should not be reencoded to:
+        http://%5b::1%5d/
+
+        This change adds the automatic test for it.
+
+        * tests/qwebframe/tst_qwebframe.cpp:
+
 2008-08-12  Urs Wolfer  <uwolfer@kde.org>
 
         Reviewed by Simon.
 2008-08-12  Urs Wolfer  <uwolfer@kde.org>
 
         Reviewed by Simon.
index d29a224068dad1de7dd52c85643577af7847f0c5..8b549e480b849d50d4147cb9221744ba23513112 100644 (file)
@@ -26,6 +26,7 @@
 #include <qwebframe.h>
 #include <qwebhistory.h>
 #include <QRegExp>
 #include <qwebframe.h>
 #include <qwebhistory.h>
 #include <QRegExp>
+#include <QNetworkRequest>
 //TESTED_CLASS=
 //TESTED_FILES=
 
 //TESTED_CLASS=
 //TESTED_FILES=
 
@@ -563,6 +564,7 @@ private slots:
     void progressSignal();
     void domCycles();
     void setHtml();
     void progressSignal();
     void domCycles();
     void setHtml();
+    void ipv6HostEncoding();
 private:
     QString  evalJS(const QString&s) {
         // Convert an undefined return variant to the string "undefined"
 private:
     QString  evalJS(const QString&s) {
         // Convert an undefined return variant to the string "undefined"
@@ -2060,5 +2062,37 @@ void tst_QWebFrame::setHtml()
     QCOMPARE(m_view->page()->mainFrame()->toHtml(), html);
 }
 
     QCOMPARE(m_view->page()->mainFrame()->toHtml(), html);
 }
 
+class TestNetworkManager : public QNetworkAccessManager
+{
+public:
+    TestNetworkManager(QObject* parent) : QNetworkAccessManager(parent) {}
+
+    QList<QUrl> requestedUrls;
+
+protected:
+    virtual QNetworkReply* createRequest(Operation op, const QNetworkRequest &request, QIODevice* outgoingData) {
+        requestedUrls.append(request.url());
+        QNetworkRequest redirectedRequest = request;
+        redirectedRequest.setUrl(QUrl("data:text/html,<p>hello"));
+        return QNetworkAccessManager::createRequest(op, redirectedRequest, outgoingData);
+    }
+};
+
+void tst_QWebFrame::ipv6HostEncoding()
+{
+    TestNetworkManager* networkManager = new TestNetworkManager(m_page);
+    m_page->setNetworkAccessManager(networkManager);
+    networkManager->requestedUrls.clear();
+
+    QUrl baseUrl = QUrl::fromEncoded("http://[::1]/index.html");
+    m_view->setHtml("<p>Hi", baseUrl);
+    m_view->page()->mainFrame()->evaluateJavaScript("var r = new XMLHttpRequest();"
+            "r.open('GET', 'http://[::1]/test.xml', false);"
+            "r.send(null);"
+            );
+    QCOMPARE(networkManager->requestedUrls.count(), 1);
+    QCOMPARE(networkManager->requestedUrls.at(0), QUrl::fromEncoded("http://[::1]/test.xml"));
+}
+
 QTEST_MAIN(tst_QWebFrame)
 #include "tst_qwebframe.moc"
 QTEST_MAIN(tst_QWebFrame)
 #include "tst_qwebframe.moc"