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 <info@bnoordhuis.nl>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
indutny authored and rvagg committed Dec 3, 2015
1 parent e2b6d45 commit dfc6f4a
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 @@ -372,7 +372,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 @@ -411,7 +411,8 @@ function connectionListener(socket) {
// If we previously paused, then start reading again.
if (socket._paused) {
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 dfc6f4a

Please sign in to comment.