2009-12-21 Fumitoshi Ukai <ukai@chromium.org>
authorukai@chromium.org <ukai@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 22 Dec 2009 04:47:46 +0000 (04:47 +0000)
committerukai@chromium.org <ukai@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 22 Dec 2009 04:47:46 +0000 (04:47 +0000)
        Reviewed by Alexey Proskuryakov.

        Invalid url should raise SYNTAX_ERR exception.
        https://bugs.webkit.org/show_bug.cgi?id=32700

        * websocket/tests/bad-sub-protocol-expected.txt: add CONSOLE MESSAGEs
        * websocket/tests/script-tests/url-parsing.js: add invalid url tests.
          Also changed url from ws://127.0.0.1/ to ws://127.0.0.1:8880/websocket/tests/simple to make it sure no errors on console message for these tests by not receiving unexpected response from 127.0.0.1:80
        * websocket/tests/url-parsing-expected.txt:
2009-12-21  Fumitoshi Ukai  <ukai@chromium.org>

        Reviewed by Alexey Proskuryakov.

        Invalid url should raise SYNTAX_ERR exception.
        https://bugs.webkit.org/show_bug.cgi?id=32700

        Check url is valid in WebSocket::connect.
        Also log the detailed reason of websocket failures to console.

        * websockets/WebSocket.cpp:
        (WebCore::encodeProtocolString):
        (WebCore::WebSocket::connect):

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

LayoutTests/ChangeLog
LayoutTests/websocket/tests/bad-sub-protocol-expected.txt
LayoutTests/websocket/tests/script-tests/url-parsing.js
LayoutTests/websocket/tests/url-parsing-expected.txt
WebCore/ChangeLog
WebCore/websockets/WebSocket.cpp

index f5d15e2..34895f9 100644 (file)
@@ -1,3 +1,15 @@
+2009-12-21  Fumitoshi Ukai  <ukai@chromium.org>
+
+        Reviewed by Alexey Proskuryakov.
+
+        Invalid url should raise SYNTAX_ERR exception.
+        https://bugs.webkit.org/show_bug.cgi?id=32700
+
+        * websocket/tests/bad-sub-protocol-expected.txt: add CONSOLE MESSAGEs
+        * websocket/tests/script-tests/url-parsing.js: add invalid url tests.
+          Also changed url from ws://127.0.0.1/ to ws://127.0.0.1:8880/websocket/tests/simple to make it sure no errors on console message for these tests by not receiving unexpected response from 127.0.0.1:80
+        * websocket/tests/url-parsing-expected.txt:
+
 2009-12-21  Dirk Pranke  <dpranke@chromium.org>
 
         Reviewed by Adam Barth.
index 0c2fcde..fd88400 100644 (file)
@@ -1,3 +1,14 @@
+CONSOLE MESSAGE: line 0: Wrong protocol for WebSocket ''
+CONSOLE MESSAGE: line 0: Wrong protocol for WebSocket '\u0000'
+CONSOLE MESSAGE: line 0: Wrong protocol for WebSocket '\u0009'
+CONSOLE MESSAGE: line 0: Wrong protocol for WebSocket '\u001B'
+CONSOLE MESSAGE: line 0: Wrong protocol for WebSocket '\u007F'
+CONSOLE MESSAGE: line 0: Wrong protocol for WebSocket '\u0080'
+CONSOLE MESSAGE: line 0: Wrong protocol for WebSocket '\u3042'
+CONSOLE MESSAGE: line 0: Wrong protocol for WebSocket '\uFFFF'
+CONSOLE MESSAGE: line 0: Wrong protocol for WebSocket ''
+CONSOLE MESSAGE: line 0: Wrong protocol for WebSocket '\uFFFE'
+CONSOLE MESSAGE: line 0: Wrong protocol for WebSocket '\uD840\uDC0B'
 Test WebSocket bad sub-protocol names.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
index 6fdb037..c46d9e1 100644 (file)
@@ -1,16 +1,22 @@
 description("Test WebSocket URL parsing.");
 
+// Invalid url will fail to be parsed.
+shouldThrow('new WebSocket("ws://javascript:a")');
+
 // Can't use relative URLs - because spec says so, and because the scheme is different anyway.
 shouldThrow('new WebSocket("/applet")');
 
+// Non ws URL is not allowed.
+shouldThrow('new WebSocket("javascript:a")');
+
 // UA is allowed to block access to some ports, which we do.
 shouldThrow('new WebSocket("ws://127.0.0.1:25/")');
 
-// This is what we currently do, but not what the spec says (as of Editor's Draft 1 December 2009).
-shouldBe('(new WebSocket("ws://127.0.0.1/a/../")).URL', '"ws://127.0.0.1/"');
-
-shouldBe('(new WebSocket("ws://127.0.0.1/path?")).URL', '"ws://127.0.0.1/path?"');
-shouldBe('(new WebSocket("ws://127.0.0.1/path?k=v")).URL', '"ws://127.0.0.1/path?k=v"');
+// Resolve the url string using the resolve a Web address algorithm.
+// Use 127.0.0.1:8880 and existing ws handler to make sure we don't receive unexpected response (so no console message appears)
+shouldBe('(new WebSocket("ws://127.0.0.1:8880/a/../websocket/tests/simple")).URL', '"ws://127.0.0.1:8880/websocket/tests/simple"');
+shouldBe('(new WebSocket("ws://127.0.0.1:8880/websocket/tests/simple?")).URL', '"ws://127.0.0.1:8880/websocket/tests/simple?"');
+shouldBe('(new WebSocket("ws://127.0.0.1:8880/websocket/tests/simple?k=v")).URL', '"ws://127.0.0.1:8880/websocket/tests/simple?k=v"');
 
 // draft-hixie-thewebsocketprotocol-60 says If /url/ has a <fragment>
 // component, then fail the parsing Web Socket URLs, so throw a SYNTAX_ERR
index 80d7557..cbf44c3 100644 (file)
@@ -1,12 +1,20 @@
+CONSOLE MESSAGE: line 0: Invalid url for WebSocket ws://javascript:a
+CONSOLE MESSAGE: line 0: Wrong url scheme for WebSocket http://127.0.0.1:8880/applet
+CONSOLE MESSAGE: line 0: Wrong url scheme for WebSocket javascript:a
+CONSOLE MESSAGE: line 0: WebSocket port 25 blocked
+CONSOLE MESSAGE: line 0: URL has fragment component ws://127.0.0.1/path#
+CONSOLE MESSAGE: line 0: URL has fragment component ws://127.0.0.1/path#fragment
 Test WebSocket URL parsing.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
+PASS new WebSocket("ws://javascript:a") threw exception Error: SYNTAX_ERR: DOM Exception 12.
 PASS new WebSocket("/applet") threw exception Error: SYNTAX_ERR: DOM Exception 12.
+PASS new WebSocket("javascript:a") threw exception Error: SYNTAX_ERR: DOM Exception 12.
 PASS new WebSocket("ws://127.0.0.1:25/") threw exception Error: SECURITY_ERR: DOM Exception 18.
-PASS (new WebSocket("ws://127.0.0.1/a/../")).URL is "ws://127.0.0.1/"
-PASS (new WebSocket("ws://127.0.0.1/path?")).URL is "ws://127.0.0.1/path?"
-PASS (new WebSocket("ws://127.0.0.1/path?k=v")).URL is "ws://127.0.0.1/path?k=v"
+PASS (new WebSocket("ws://127.0.0.1:8880/a/../websocket/tests/simple")).URL is "ws://127.0.0.1:8880/websocket/tests/simple"
+PASS (new WebSocket("ws://127.0.0.1:8880/websocket/tests/simple?")).URL is "ws://127.0.0.1:8880/websocket/tests/simple?"
+PASS (new WebSocket("ws://127.0.0.1:8880/websocket/tests/simple?k=v")).URL is "ws://127.0.0.1:8880/websocket/tests/simple?k=v"
 PASS new WebSocket("ws://127.0.0.1/path#") threw exception Error: SYNTAX_ERR: DOM Exception 12.
 PASS new WebSocket("ws://127.0.0.1/path#fragment") threw exception Error: SYNTAX_ERR: DOM Exception 12.
 PASS successfullyParsed is true
index bf59b0a..af9f17b 100644 (file)
@@ -1,3 +1,17 @@
+2009-12-21  Fumitoshi Ukai  <ukai@chromium.org>
+
+        Reviewed by Alexey Proskuryakov.
+
+        Invalid url should raise SYNTAX_ERR exception.
+        https://bugs.webkit.org/show_bug.cgi?id=32700
+
+        Check url is valid in WebSocket::connect.
+        Also log the detailed reason of websocket failures to console.
+
+        * websockets/WebSocket.cpp:
+        (WebCore::encodeProtocolString):
+        (WebCore::WebSocket::connect):
+
 2009-12-21  Anders Carlsson  <andersca@apple.com>
 
         Reviewed by Sam Weinig.
index ee78174..bd62cfa 100644 (file)
 #include "Logging.h"
 #include "MessageEvent.h"
 #include "ScriptExecutionContext.h"
+#include "StringBuilder.h"
 #include "WebSocketChannel.h"
 #include <wtf/StdLibExtras.h>
 
 namespace WebCore {
 
-static bool isValidProtocolString(const WebCore::String& protocol)
+static bool isValidProtocolString(const String& protocol)
 {
     if (protocol.isNull())
         return true;
@@ -62,6 +63,20 @@ static bool isValidProtocolString(const WebCore::String& protocol)
     return true;
 }
 
+static String encodeProtocolString(const String& protocol)
+{
+    StringBuilder builder;
+    for (size_t i = 0; i < protocol.length(); i++) {
+        if (protocol[i] < 0x20 || protocol[i] > 0x7E)
+            builder.append(String::format("\\u%04X", protocol[i]));
+        else if (protocol[i] == 0x5c)
+            builder.append("\\\\");
+        else
+            builder.append(protocol[i]);
+    }
+    return builder.toString();
+}
+
 #if USE(V8)
 
 static bool webSocketsAvailable = false;
@@ -101,26 +116,33 @@ void WebSocket::connect(const KURL& url, const String& protocol, ExceptionCode&
     m_url = url;
     m_protocol = protocol;
 
+    if (!m_url.isValid()) {
+        scriptExecutionContext()->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Invalid url for WebSocket " + url.string(), 0, scriptExecutionContext()->securityOrigin()->toString());
+        m_state = CLOSED;
+        ec = SYNTAX_ERR;
+        return;
+    }
+
     if (!m_url.protocolIs("ws") && !m_url.protocolIs("wss")) {
-        LOG(Network, "Wrong url scheme for WebSocket %s", url.string().utf8().data());
+        scriptExecutionContext()->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Wrong url scheme for WebSocket " + url.string(), 0, scriptExecutionContext()->securityOrigin()->toString());
         m_state = CLOSED;
         ec = SYNTAX_ERR;
         return;
     }
     if (m_url.hasFragmentIdentifier()) {
-        LOG(Network, "URL has fragment component %s", url.string().utf8().data());
+        scriptExecutionContext()->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "URL has fragment component " + url.string(), 0, scriptExecutionContext()->securityOrigin()->toString());
         m_state = CLOSED;
         ec = SYNTAX_ERR;
         return;
     }
     if (!isValidProtocolString(m_protocol)) {
-        LOG(Network, "Wrong protocol for WebSocket %s", m_protocol.utf8().data());
+        scriptExecutionContext()->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, "Wrong protocol for WebSocket '" + encodeProtocolString(m_protocol) + "'", 0, scriptExecutionContext()->securityOrigin()->toString());
         m_state = CLOSED;
         ec = SYNTAX_ERR;
         return;
     }
     if (!portAllowed(url)) {
-        LOG(Network, "WebSocket port %d blocked", url.port());
+        scriptExecutionContext()->addMessage(ConsoleDestination, JSMessageSource, LogMessageType, ErrorMessageLevel, String::format("WebSocket port %d blocked", url.port()), 0, scriptExecutionContext()->securityOrigin()->toString());
         m_state = CLOSED;
         ec = SECURITY_ERR;
         return;