Skip to content

Commit aee226b

Browse files
miksagory
authored andcommitted
Fixing the 1 byte off error in http.Server's upgradeHead
(And fix up some style issues)
1 parent 67fb0ec commit aee226b

2 files changed

Lines changed: 39 additions & 25 deletions

File tree

lib/http.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -519,11 +519,11 @@ function flushMessageQueue (socket, queue) {
519519

520520
function Server (requestListener) {
521521
net.Server.call(this);
522-
522+
523523
if(requestListener){
524524
this.addListener("request", requestListener);
525525
}
526-
526+
527527
this.addListener("connection", connectionListener);
528528
}
529529
sys.inherits(Server, net.Server);
@@ -562,11 +562,15 @@ function connectionListener (socket) {
562562
if (parser.incoming && parser.incoming.upgrade) {
563563
socket.ondata = null;
564564
socket.onend = null;
565-
565+
566566
var req = parser.incoming;
567-
req.upgradeHead = d.slice(start + bytesParsed, end);
567+
568+
// This is start + byteParsed + 1 due to the error of getting \n
569+
// in the upgradeHead from the closing lines of the headers
570+
var upgradeHead = d.slice(start + bytesParsed + 1, end);
571+
568572
if(self.listeners("upgrade").length > 0) {
569-
self.emit('upgrade', req, req.socket, req.upgradeHead);
573+
self.emit('upgrade', req, req.socket, upgradeHead);
570574
} else {
571575
socket.end();
572576
}

test/simple/test-http-upgrade.js

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ var http = require("http");
77

88
var requests_recv = 0;
99
var requests_sent = 0;
10+
var request_upgradeHead = null;
1011

1112
function createTestServer(){
1213
return new testServer();
@@ -15,25 +16,26 @@ function createTestServer(){
1516
function testServer(){
1617
var server = this;
1718
http.Server.call(server, function(){});
18-
19+
1920
server.addListener("connection", function(){
2021
requests_recv++;
2122
});
22-
23+
2324
server.addListener("request", function(req, res){
2425
res.writeHead(200, {"Content-Type": "text/plain"});
2526
res.write("okay");
2627
res.end();
2728
});
28-
29+
2930
server.addListener("upgrade", function(req, socket, upgradeHead){
30-
socket.write([
31-
"HTTP/1.1 101 Web Socket Protocol Handshake",
32-
"Upgrade: WebSocket",
33-
"Connection: Upgrade",
34-
"\r\n"
35-
].join("\r\n"), "utf8");
36-
31+
socket.write( "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"
32+
+ "Upgrade: WebSocket\r\n"
33+
+ "Connection: Upgrade\r\n"
34+
+ "\r\n\r\n"
35+
);
36+
37+
request_upgradeHead = upgradeHead;
38+
3739
socket.ondata = function(d, start, end){
3840
var data = d.toString('utf8', start, end);
3941
if(data == "kill"){
@@ -66,23 +68,30 @@ function writeReq(socket, data, encoding){
6668
function test_upgrade_with_listener(_server){
6769
var conn = new testClient();
6870
var state = 0;
69-
71+
7072
conn.addListener("connect", function () {
71-
writeReq(conn, "GET / HTTP/1.1\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\n\r\n");
73+
writeReq( conn
74+
, "GET / HTTP/1.1\r\n"
75+
+ "Upgrade: WebSocket\r\n"
76+
+ "Connection: Upgrade\r\n"
77+
+ "\r\n"
78+
+ "WjN}|M(6"
79+
);
7280
});
73-
81+
7482
conn.addListener("data", function(data){
7583
state++;
76-
84+
7785
if(state == 1){
7886
assert.equal("HTTP/1.1 101", data.substr(0, 12));
87+
assert.equal("WjN}|M(6", request_upgradeHead.toString("utf8"));
7988
conn.write("test", "utf8");
8089
} else if(state == 2) {
8190
assert.equal("test", data);
8291
conn.write("kill", "utf8");
8392
}
8493
});
85-
94+
8695
conn.addListener("end", function(){
8796
assert.equal(2, state);
8897
conn.end();
@@ -98,7 +107,7 @@ var test_upgrade_no_listener_ended = false;
98107

99108
function test_upgrade_no_listener(){
100109
var conn = new testClient();
101-
110+
102111
conn.addListener("connect", function () {
103112
writeReq(conn, "GET / HTTP/1.1\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\n\r\n");
104113
});
@@ -107,7 +116,7 @@ function test_upgrade_no_listener(){
107116
test_upgrade_no_listener_ended = true;
108117
conn.end();
109118
});
110-
119+
111120
conn.addListener("close", function(){
112121
test_standard_http();
113122
});
@@ -121,12 +130,12 @@ function test_standard_http(){
121130
conn.addListener("connect", function () {
122131
writeReq(conn, "GET / HTTP/1.1\r\n\r\n");
123132
});
124-
133+
125134
conn.addListener("data", function(data){
126135
assert.equal("HTTP/1.1 200", data.substr(0, 12));
127136
conn.end();
128137
});
129-
138+
130139
conn.addListener("close", function(){
131140
server.close();
132141
});
@@ -138,6 +147,7 @@ server.addListener("listening", function(){
138147
// All tests get chained after this:
139148
test_upgrade_with_listener(server);
140149
});
150+
141151
server.listen(PORT);
142152

143153

@@ -148,4 +158,4 @@ process.addListener("exit", function () {
148158
assert.equal(3, requests_recv);
149159
assert.equal(3, requests_sent);
150160
assert.ok(test_upgrade_no_listener_ended);
151-
});
161+
});

0 commit comments

Comments
 (0)