bug 661036 - websockets allowed prohibited space character in protocol header, with test update r=biesi r=bsmith

This commit is contained in:
Patrick McManus 2011-06-16 14:27:11 -04:00
parent 27a34348cd
commit b012dc160e
3 changed files with 59 additions and 51 deletions

View File

@ -1065,7 +1065,7 @@ nsWebSocket::SetProtocol(const nsString& aProtocol)
PRUint32 length = aProtocol.Length();
PRUint32 i;
for (i = 0; i < length; ++i) {
if (aProtocol[i] < static_cast<PRUnichar>(0x0020) ||
if (aProtocol[i] < static_cast<PRUnichar>(0x0021) ||
aProtocol[i] > static_cast<PRUnichar>(0x007E)) {
return NS_ERROR_DOM_SYNTAX_ERR;
}

View File

@ -9,30 +9,30 @@ def web_socket_do_extra_handshake(request):
# must set request.ws_protocol to the selected version from ws_requested_protocols
request.ws_protocol = request.ws_requested_protocols[0]
if request.ws_protocol == "test 2.1":
if request.ws_protocol == "test-2.1":
time.sleep(5)
pass
elif request.ws_protocol == "test 9":
elif request.ws_protocol == "test-9":
time.sleep(5)
pass
elif request.ws_protocol == "test 10":
elif request.ws_protocol == "test-10":
time.sleep(5)
pass
elif request.ws_protocol == "test 19":
raise ValueError('Aborting (test 19)')
elif request.ws_protocol == "test 20" or request.ws_protocol == "test 17":
elif request.ws_protocol == "test-19":
raise ValueError('Aborting (test-19)')
elif request.ws_protocol == "test-20" or request.ws_protocol == "test-17":
time.sleep(10)
pass
elif request.ws_protocol == "test 22":
elif request.ws_protocol == "test-22":
time.sleep(60)
pass
else:
pass
def web_socket_transfer_data(request):
if request.ws_protocol == "test 2.1" or request.ws_protocol == "test 2.2":
if request.ws_protocol == "test-2.1" or request.ws_protocol == "test-2.2":
msgutil.close_connection(request)
elif request.ws_protocol == "test 6":
elif request.ws_protocol == "test-6":
resp = "wrong message"
if msgutil.receive_message(request) == "1":
resp = "2"
@ -46,7 +46,7 @@ def web_socket_transfer_data(request):
resp = "あいうえお"
msgutil.send_message(request, resp.decode('utf-8'))
msgutil.close_connection(request)
elif request.ws_protocol == "test 7":
elif request.ws_protocol == "test-7":
try:
while not request.client_terminated:
msgutil.receive_message(request)
@ -59,29 +59,29 @@ def web_socket_transfer_data(request):
msgutil.send_message(request, "server data")
time.sleep(30)
msgutil.close_connection(request, True)
elif request.ws_protocol == "test 10":
elif request.ws_protocol == "test-10":
msgutil.close_connection(request)
elif request.ws_protocol == "test 11":
elif request.ws_protocol == "test-11":
resp = "wrong message"
if msgutil.receive_message(request) == "client data":
resp = "server data"
msgutil.send_message(request, resp.decode('utf-8'))
msgutil.close_connection(request)
elif request.ws_protocol == "test 12":
elif request.ws_protocol == "test-12":
msgutil.close_connection(request)
elif request.ws_protocol == "test 13":
elif request.ws_protocol == "test-13":
# first one binary message containing the byte 0x61 ('a')
request.connection.write('\xff\x01\x61')
# after a bad utf8 message
request.connection.write('\x01\x61\xff')
msgutil.close_connection(request)
elif request.ws_protocol == "test 14":
elif request.ws_protocol == "test-14":
msgutil.close_connection(request)
msgutil.send_message(request, "server data")
elif request.ws_protocol == "test 15":
elif request.ws_protocol == "test-15":
msgutil.close_connection(request, True)
return
elif request.ws_protocol == "test 17" or request.ws_protocol == "test 21":
elif request.ws_protocol == "test-17" or request.ws_protocol == "test-21":
time.sleep(5)
resp = "wrong message"
if msgutil.receive_message(request) == "client data":
@ -90,7 +90,7 @@ def web_socket_transfer_data(request):
time.sleep(5)
msgutil.close_connection(request)
time.sleep(5)
elif request.ws_protocol == "test 20":
elif request.ws_protocol == "test-20":
msgutil.send_message(request, "server data")
msgutil.close_connection(request)
while not request.client_terminated:

View File

@ -189,9 +189,9 @@ function test1()
// is empty
function test2()
{
var ws1 = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 2.1");
var ws1 = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-2.1");
current_test--; // CreateTestWS incremented this
var ws2 = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 2.2");
var ws2 = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-2.2");
var ws2CanConnect = false;
@ -204,7 +204,7 @@ function test2()
ws2.onopen = function()
{
ok(ws2CanConnect, "shouldn't connect yet in test 2!");
ok(ws2CanConnect, "shouldn't connect yet in test-2!");
doTest(3);
}
}
@ -224,10 +224,10 @@ function test4()
{
try {
var ws = CreateTestWS("file_websocket");
ok(false, "test 4 failed");
ok(false, "test-4 failed");
}
catch (e) {
ok(true, "test 4 failed");
ok(true, "test-4 failed");
}
doTest(5);
}
@ -249,12 +249,20 @@ function test5()
catch (e) {
ok(true, "couldn't accept any not printable ASCII character in the protocol parameter");
}
current_test--; // CreateTestWS incremented this
try {
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 5");
ok(false, "U+0020 not acceptable in protocol parameter");
}
catch (e) {
ok(true, "U+0020 not acceptable in protocol parameter");
}
doTest(6);
}
function test6()
{
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 6");
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-6");
var counter = 1;
ws.onopen = function()
{
@ -263,7 +271,7 @@ function test6()
ws.onmessage = function(e)
{
if (counter == 5) {
ok(e.data == "あいうえお", "test 6 counter 5 data ok");
ok(e.data == "あいうえお", "test-6 counter 5 data ok");
ws.close();
doTest(7);
} else {
@ -286,7 +294,7 @@ function test7()
current_test++;
doTest(8);
// var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 7");
// var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-7");
// ws.onopen = function()
// {
// ws.close();
@ -300,7 +308,7 @@ function test7()
function test8()
{
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 8");
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-8");
ws.onopen = function()
{
ws.close();
@ -314,7 +322,7 @@ function test8()
function test9()
{
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 9");
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-9");
ws.onopen = shouldNotOpen;
ws.onclose = function(e)
{
@ -327,7 +335,7 @@ function test9()
function test10()
{
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 10");
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-10");
ws.onclose = shouldCloseCleanly;
try {
@ -345,25 +353,25 @@ function test10()
function test11()
{
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 11");
ok(ws.readyState == 0, "create bad readyState in test 11!");
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-11");
ok(ws.readyState == 0, "create bad readyState in test-11!");
ws.onopen = function()
{
ok(ws.readyState == 1, "open bad readyState in test 11!");
ok(ws.readyState == 1, "open bad readyState in test-11!");
ws.send("client data");
}
ws.onmessage = function(e)
{
ok(e.data == "server data", "bad received message in test 11!");
ok(e.data == "server data", "bad received message in test-11!");
ws.close();
// this ok() is disabled due to a race condition - it state may have
// advanced through 2 (closing) and into 3 (closed) before it is evald
// ok(ws.readyState == 2, "onmessage bad readyState in test 11!");
// ok(ws.readyState == 2, "onmessage bad readyState in test-11!");
}
ws.onclose = function(e)
{
ok(ws.readyState == 3, "onclose bad readyState in test 11!");
ok(ws.readyState == 3, "onclose bad readyState in test-11!");
shouldCloseCleanly(e);
doTest(12);
}
@ -371,7 +379,7 @@ function test11()
function test12()
{
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 12");
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-12");
ws.onopen = function()
{
try {
@ -384,7 +392,7 @@ function test12()
}
ws.close();
// there isnt really a server implementation of test 12, so just
// there isnt really a server implementation of test-12, so just
// ignore an error
ws.onerror = function()
{
@ -400,7 +408,7 @@ function test13()
// protocol stack typically closes down after reporting a protocol level error - trying
// to resync is too dangerous
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 13");
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-13");
ws._timesCalledOnError = 0;
ws.onerror = function()
{
@ -415,7 +423,7 @@ function test13()
function test14()
{
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 14");
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-14");
ws.onmessage = function()
{
ok(false, "shouldn't received message after the server sent the close frame");
@ -429,7 +437,7 @@ function test14()
function test15()
{
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 15");
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-15");
ws.onclose = function(e)
{
shouldCloseNotCleanly(e);
@ -445,7 +453,7 @@ function test15()
function test16()
{
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 16");
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-16");
ws.onopen = function()
{
ws.close();
@ -469,7 +477,7 @@ var status_test17 = "not started";
window._test17 = function()
{
var local_ws = new WebSocket("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 17");
var local_ws = new WebSocket("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-17");
local_ws._testNumber = "local17";
local_ws._testNumber = current_test++;
@ -489,14 +497,14 @@ window._test17 = function()
local_ws.onmessage = function(e)
{
ok(e.data == "server data", "Bad message in test 17");
ok(e.data == "server data", "Bad message in test-17");
status_test17 = "got message";
forcegc();
};
local_ws.onclose = function(e)
{
ok(status_test17 == "got message", "Didn't got message in test 17!");
ok(status_test17 == "got message", "Didn't got message in test-17!");
shouldCloseCleanly(e);
status_test17 = "closed";
forcegc();
@ -531,7 +539,7 @@ function test18()
function test19()
{
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 19");
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-19");
ws.onopen = shouldNotOpen;
ws.onclose = function(e)
{
@ -542,7 +550,7 @@ function test19()
window._test20 = function()
{
var local_ws = new WebSocket("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 20");
var local_ws = new WebSocket("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-20");
local_ws._testNumber = "local20";
local_ws._testNumber = current_test++;
@ -571,7 +579,7 @@ var timeoutTest21;
window._test21 = function()
{
var local_ws = new WebSocket("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 21");
var local_ws = new WebSocket("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-21");
local_ws._testNumber = current_test++;
local_ws.onopen = function(e)
@ -579,7 +587,7 @@ window._test21 = function()
e.target.send("client data");
timeoutTest21 = setTimeout(function()
{
ok(false, "Didn't received message on test 21!");
ok(false, "Didn't received message on test-21!");
}, 15000);
forcegc();
e.target.onopen = null;
@ -594,7 +602,7 @@ window._test21 = function()
local_ws.onmessage = function(e)
{
clearTimeout(timeoutTest21);
ok(e.data == "server data", "Bad message in test 21");
ok(e.data == "server data", "Bad message in test-21");
forcegc();
e.target.onmessage = null;
forcegc();
@ -618,7 +626,7 @@ function test21()
function test22()
{
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test 22");
var ws = CreateTestWS("ws://mochi.test:8888/tests/content/base/test/file_websocket", "test-22");
ws.onopen = shouldNotOpen;
ws.onclose = function(e)
{