mirror of
https://github.com/nodejs/node.git
synced 2024-11-21 10:59:27 +00:00
http: fix pipeline regression
Always check that socket still has the parser. It may be destroyed interim, and we may end up with an uncaught exception. Fix: https://github.com/nodejs/node/issues/3508 PR-URL: https://github.com/nodejs/node-private/pull/5 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
46af39768d
commit
d332ae4799
@ -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();
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
57
test/parallel/test-http-pipeline-regr-3508.js
Normal file
57
test/parallel/test-http-pipeline-regr-3508.js
Normal file
@ -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();
|
||||
});
|
Loading…
Reference in New Issue
Block a user