summaryrefslogtreecommitdiff
path: root/lib/_http_server.js
diff options
context:
space:
mode:
authorAnatoli Papirovski <anatoli.papirovski@postmates.com>2019-05-30 11:32:51 +0200
committerRich Trott <rtrott@gmail.com>2019-06-02 10:17:50 +0200
commit58b1fe7bd11db74cfac2404a1db2f7fefc7a971c (patch)
tree5d8c586ba120376b96b50daeadea3e0b24faf419 /lib/_http_server.js
parent6b57a51b5469e1c639bc067373c0a985a9462b9a (diff)
downloadandroid-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.js31
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() {