Skip to content

Commit

Permalink
http: fix pipeline regression
Browse files Browse the repository at this point in the history
Always check that socket still has the parser. It may be destroyed
interim, and we may end up with an uncaught exception.

Fix: #3508
PR-URL: nodejs-private/node-private#5
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: James M Snell <[email protected]>
  • Loading branch information
indutny authored and rvagg committed Dec 3, 2015
1 parent 533881f commit 12e70fa
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 2 deletions.
5 changes: 3 additions & 2 deletions lib/_http_server.js
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,7 @@ function connectionListener(socket) {
}
}

if (socket._paused) {
if (socket._paused && socket.parser) {
// onIncoming paused the socket, we should pause the parser as well
debug('pause parser');
socket.parser.pause();
Expand Down Expand Up @@ -445,7 +445,8 @@ function connectionListener(socket) {
// If we previously paused, then start reading again.
if (socket._paused && !needPause) {
socket._paused = false;
socket.parser.resume();
if (socket.parser)
socket.parser.resume();
socket.resume();
}
}
Expand Down
57 changes: 57 additions & 0 deletions test/parallel/test-http-pipeline-regr-3508.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const http = require('http');
const net = require('net');

var once = false;
var first = null;
var second = null;

const chunk = new Buffer(1024);
chunk.fill('X');

var size = 0;

var more;
var done;

var server = http.createServer(function(req, res) {
if (!once)
server.close();
once = true;

if (first === null) {
first = res;
return;
}
if (second === null) {
second = res;
res.write(chunk);
} else {
res.end(chunk);
}
size += res.outputSize;
if (size <= req.socket._writableState.highWaterMark) {
more();
return;
}
done();
}).on('upgrade', function(req, socket) {
second.end(chunk, function() {
socket.end();
});
first.end('hello');
}).listen(common.PORT, function() {
var s = net.connect(common.PORT);
more = function() {
s.write('GET / HTTP/1.1\r\n\r\n');
};
done = function() {
s.write('GET / HTTP/1.1\r\n\r\n' +
'GET / HTTP/1.1\r\nConnection: upgrade\r\nUpgrade: ws\r\n\r\naaa');
};
more();
more();
s.resume();
});

0 comments on commit 12e70fa

Please sign in to comment.