|
|
@ -7,6 +7,7 @@ var http = require("http"); |
|
|
|
|
|
|
|
var requests_recv = 0; |
|
|
|
var requests_sent = 0; |
|
|
|
var request_upgradeHead = null; |
|
|
|
|
|
|
|
function createTestServer(){ |
|
|
|
return new testServer(); |
|
|
@ -15,25 +16,26 @@ function createTestServer(){ |
|
|
|
function testServer(){ |
|
|
|
var server = this; |
|
|
|
http.Server.call(server, function(){}); |
|
|
|
|
|
|
|
|
|
|
|
server.addListener("connection", function(){ |
|
|
|
requests_recv++; |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
server.addListener("request", function(req, res){ |
|
|
|
res.writeHead(200, {"Content-Type": "text/plain"}); |
|
|
|
res.write("okay"); |
|
|
|
res.end(); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
server.addListener("upgrade", function(req, socket, upgradeHead){ |
|
|
|
socket.write([ |
|
|
|
"HTTP/1.1 101 Web Socket Protocol Handshake", |
|
|
|
"Upgrade: WebSocket", |
|
|
|
"Connection: Upgrade", |
|
|
|
"\r\n" |
|
|
|
].join("\r\n"), "utf8"); |
|
|
|
|
|
|
|
socket.write( "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" |
|
|
|
+ "Upgrade: WebSocket\r\n" |
|
|
|
+ "Connection: Upgrade\r\n" |
|
|
|
+ "\r\n\r\n" |
|
|
|
); |
|
|
|
|
|
|
|
request_upgradeHead = upgradeHead; |
|
|
|
|
|
|
|
socket.ondata = function(d, start, end){ |
|
|
|
var data = d.toString('utf8', start, end); |
|
|
|
if(data == "kill"){ |
|
|
@ -66,23 +68,30 @@ function writeReq(socket, data, encoding){ |
|
|
|
function test_upgrade_with_listener(_server){ |
|
|
|
var conn = new testClient(); |
|
|
|
var state = 0; |
|
|
|
|
|
|
|
|
|
|
|
conn.addListener("connect", function () { |
|
|
|
writeReq(conn, "GET / HTTP/1.1\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\n\r\n"); |
|
|
|
writeReq( conn |
|
|
|
, "GET / HTTP/1.1\r\n" |
|
|
|
+ "Upgrade: WebSocket\r\n" |
|
|
|
+ "Connection: Upgrade\r\n" |
|
|
|
+ "\r\n" |
|
|
|
+ "WjN}|M(6" |
|
|
|
); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
conn.addListener("data", function(data){ |
|
|
|
state++; |
|
|
|
|
|
|
|
|
|
|
|
if(state == 1){ |
|
|
|
assert.equal("HTTP/1.1 101", data.substr(0, 12)); |
|
|
|
assert.equal("WjN}|M(6", request_upgradeHead.toString("utf8")); |
|
|
|
conn.write("test", "utf8"); |
|
|
|
} else if(state == 2) { |
|
|
|
assert.equal("test", data); |
|
|
|
conn.write("kill", "utf8"); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
conn.addListener("end", function(){ |
|
|
|
assert.equal(2, state); |
|
|
|
conn.end(); |
|
|
@ -98,7 +107,7 @@ var test_upgrade_no_listener_ended = false; |
|
|
|
|
|
|
|
function test_upgrade_no_listener(){ |
|
|
|
var conn = new testClient(); |
|
|
|
|
|
|
|
|
|
|
|
conn.addListener("connect", function () { |
|
|
|
writeReq(conn, "GET / HTTP/1.1\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\n\r\n"); |
|
|
|
}); |
|
|
@ -107,7 +116,7 @@ function test_upgrade_no_listener(){ |
|
|
|
test_upgrade_no_listener_ended = true; |
|
|
|
conn.end(); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
conn.addListener("close", function(){ |
|
|
|
test_standard_http(); |
|
|
|
}); |
|
|
@ -121,12 +130,12 @@ function test_standard_http(){ |
|
|
|
conn.addListener("connect", function () { |
|
|
|
writeReq(conn, "GET / HTTP/1.1\r\n\r\n"); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
conn.addListener("data", function(data){ |
|
|
|
assert.equal("HTTP/1.1 200", data.substr(0, 12)); |
|
|
|
conn.end(); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
conn.addListener("close", function(){ |
|
|
|
server.close(); |
|
|
|
}); |
|
|
@ -138,6 +147,7 @@ server.addListener("listening", function(){ |
|
|
|
// All tests get chained after this:
|
|
|
|
test_upgrade_with_listener(server); |
|
|
|
}); |
|
|
|
|
|
|
|
server.listen(PORT); |
|
|
|
|
|
|
|
|
|
|
@ -148,4 +158,4 @@ process.addListener("exit", function () { |
|
|
|
assert.equal(3, requests_recv); |
|
|
|
assert.equal(3, requests_sent); |
|
|
|
assert.ok(test_upgrade_no_listener_ended); |
|
|
|
}); |
|
|
|
}); |
|
|
|