From ea15d71c162f3c20a7a501c3b959fa5eb0e559e0 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Fri, 11 Sep 2015 14:04:26 -0700 Subject: [PATCH] http_server: fix resume after socket close MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Socket resume may happen on a next tick, and in following scenario: 1. `socket.resume()` 2. `socket._handle.close()` 3. `socket._handle = null;` The `_resume` will be invoked with empty `._handle` property. There is nothing bad about it, and we should just ignore the `resume`/`pause` events in this case. Same applies to the unconsuming of socket on adding `data` and/or `readable` event listeners. Fix: https://github.com/nodejs/node/issues/2821 PR-URL: https://github.com/nodejs/node/pull/2824 Reviewed-By: Сковорода Никита Андреевич Reviewed-By: Colin Ihrig Reviewed-By: Jeremiah Senkpiel --- lib/_http_server.js | 8 +++++--- test/parallel/test-http-regr-gh-2821.js | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 test/parallel/test-http-regr-gh-2821.js diff --git a/lib/_http_server.js b/lib/_http_server.js index 16460fca35..7acc108638 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -512,11 +512,13 @@ function connectionListener(socket) { exports._connectionListener = connectionListener; function onSocketResume() { - this._handle.readStart(); + if (this._handle) + this._handle.readStart(); } function onSocketPause() { - this._handle.readStop(); + if (this._handle) + this._handle.readStop(); } function socketOnWrap(ev, fn) { @@ -526,7 +528,7 @@ function socketOnWrap(ev, fn) { return res; } - if (ev === 'data' || ev === 'readable') + if (this._handle && (ev === 'data' || ev === 'readable')) this.parser.unconsume(this._handle._externalStream); return res; diff --git a/test/parallel/test-http-regr-gh-2821.js b/test/parallel/test-http-regr-gh-2821.js new file mode 100644 index 0000000000..4fdef2369b --- /dev/null +++ b/test/parallel/test-http-regr-gh-2821.js @@ -0,0 +1,24 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const http = require('http'); + +const server = http.createServer(function(req, res) { + res.writeHead(200); + res.end(); + + server.close(); +}); + +server.listen(common.PORT, function() { + + const req = http.request({ + method: 'POST', + port: common.PORT + }); + + const payload = new Buffer(16390); + payload.fill('Й'); + req.write(payload); + req.end(); +});