diff options
author | Anatoli Papirovski <anatoli.papirovski@postmates.com> | 2019-05-30 11:32:51 +0200 |
---|---|---|
committer | Rich Trott <rtrott@gmail.com> | 2019-06-02 10:17:50 +0200 |
commit | 58b1fe7bd11db74cfac2404a1db2f7fefc7a971c (patch) | |
tree | 5d8c586ba120376b96b50daeadea3e0b24faf419 /lib/_http_server.js | |
parent | 6b57a51b5469e1c639bc067373c0a985a9462b9a (diff) | |
download | android-node-v8-58b1fe7bd11db74cfac2404a1db2f7fefc7a971c.tar.gz android-node-v8-58b1fe7bd11db74cfac2404a1db2f7fefc7a971c.tar.bz2 android-node-v8-58b1fe7bd11db74cfac2404a1db2f7fefc7a971c.zip |
http: fix socketOnWrap edge cases
Properly handle prependListener wrapping on http server
socket, in addition to on and addListener.
PR-URL: https://github.com/nodejs/node/pull/27968
Reviewed-By: Yongsheng Zhang <zyszys98@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'lib/_http_server.js')
-rw-r--r-- | lib/_http_server.js | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/lib/_http_server.js b/lib/_http_server.js index 62b58dd2e1..39a49fedc3 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -404,9 +404,10 @@ function connectionListenerInternal(server, socket) { socket.on('resume', onSocketResume); socket.on('pause', onSocketPause); - // Override on to unconsume on `data`, `readable` listeners - socket.on = socketOnWrap; - socket.addListener = socket.on; + // Overrides to unconsume on `data`, `readable` listeners + socket.on = generateSocketListenerWrapper('on'); + socket.addListener = generateSocketListenerWrapper('addListener'); + socket.prependListener = generateSocketListenerWrapper('prependListener'); // We only consume the socket if it has never been consumed before. if (socket._handle && socket._handle.isStreamBase && @@ -754,19 +755,21 @@ function unconsume(parser, socket) { } } -function socketOnWrap(ev, fn) { - const res = net.Socket.prototype.on.call(this, ev, fn); - if (!this.parser) { - this.prependListener = net.Socket.prototype.prependListener; - this.on = net.Socket.prototype.on; - this.addListener = this.on; - return res; - } +function generateSocketListenerWrapper(originalFnName) { + return function socketListenerWrap(ev, fn) { + const res = net.Socket.prototype[originalFnName].call(this, ev, fn); + if (!this.parser) { + this.on = net.Socket.prototype.on; + this.addListener = net.Socket.prototype.addListener; + this.prependListener = net.Socket.prototype.prependListener; + return res; + } - if (ev === 'data' || ev === 'readable') - unconsume(this.parser, this); + if (ev === 'data' || ev === 'readable') + unconsume(this.parser, this); - return res; + return res; + }; } function resetHeadersTimeoutOnReqEnd() { |