0
0
mirror of https://github.com/nodejs/node.git synced 2024-12-01 16:10:02 +01:00
nodejs/test/simple/test-http-upgrade.js
Micheil Smith aee226b243 Fixing the 1 byte off error in http.Server's upgradeHead
(And fix up some style issues)
2010-05-01 18:05:53 -07:00

162 lines
3.7 KiB
JavaScript

require("../common");
var sys = require("sys");
var net = require("net");
var http = require("http");
var requests_recv = 0;
var requests_sent = 0;
var request_upgradeHead = null;
function createTestServer(){
return new testServer();
};
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\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"){
socket.end();
} else {
socket.write(data, "utf8");
}
};
});
};
sys.inherits(testServer, http.Server);
function testClient(){
var conn = net.createConnection(PORT);
conn.setEncoding("utf8");
return conn;
}
function writeReq(socket, data, encoding){
requests_sent++;
socket.write(data);
};
/*-----------------------------------------------
connection: Upgrade with listener
-----------------------------------------------*/
function test_upgrade_with_listener(_server){
var conn = new testClient();
var state = 0;
conn.addListener("connect", function () {
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();
_server.removeAllListeners("upgrade");
test_upgrade_no_listener();
});
};
/*-----------------------------------------------
connection: Upgrade, no listener
-----------------------------------------------*/
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");
});
conn.addListener("end", function(){
test_upgrade_no_listener_ended = true;
conn.end();
});
conn.addListener("close", function(){
test_standard_http();
});
};
/*-----------------------------------------------
connection: normal
-----------------------------------------------*/
function test_standard_http(){
var conn = new testClient();
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();
});
};
var server = createTestServer();
server.addListener("listening", function(){
// All tests get chained after this:
test_upgrade_with_listener(server);
});
server.listen(PORT);
/*-----------------------------------------------
Fin.
-----------------------------------------------*/
process.addListener("exit", function () {
assert.equal(3, requests_recv);
assert.equal(3, requests_sent);
assert.ok(test_upgrade_no_listener_ended);
});