summaryrefslogtreecommitdiff
path: root/lib/_http_client.js
diff options
context:
space:
mode:
authorRobert Nagy <ronagy@icloud.com>2019-07-15 19:19:12 +0200
committerRich Trott <rtrott@gmail.com>2019-09-15 21:50:03 -0700
commit627bb6bf8716131c942ea8a274390d09d1984923 (patch)
tree433f86be435ab2da6af4b8ed7dad5084ecff9eaa /lib/_http_client.js
parented0e5c8c744439c759343030bd429bc514aef5c0 (diff)
downloadnode-new-627bb6bf8716131c942ea8a274390d09d1984923.tar.gz
http: refactor responseKeepAlive()
This tries to simplify the code and make it easier to understand. Took me a while to get my head around the previous implementation. Also minor perf improvement. PR-URL: https://github.com/nodejs/node/pull/28700 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'lib/_http_client.js')
-rw-r--r--lib/_http_client.js72
1 files changed, 36 insertions, 36 deletions
diff --git a/lib/_http_client.js b/lib/_http_client.js
index 1ab4dc95c5..0c1c9a22f2 100644
--- a/lib/_http_client.js
+++ b/lib/_http_client.js
@@ -594,39 +594,26 @@ function parserOnIncomingClient(res, shouldKeepAlive) {
}
// client
-function responseKeepAlive(res, req) {
+function responseKeepAlive(req) {
const socket = req.socket;
- if (!req.shouldKeepAlive) {
- if (socket.writable) {
- debug('AGENT socket.destroySoon()');
- if (typeof socket.destroySoon === 'function')
- socket.destroySoon();
- else
- socket.end();
- }
- assert(!socket.writable);
- } else {
- debug('AGENT socket keep-alive');
- if (req.timeoutCb) {
- socket.setTimeout(0, req.timeoutCb);
- req.timeoutCb = null;
- }
- socket.removeListener('close', socketCloseListener);
- socket.removeListener('error', socketErrorListener);
- socket.removeListener('drain', ondrain);
- socket.once('error', freeSocketErrorListener);
- // There are cases where _handle === null. Avoid those. Passing null to
- // nextTick() will call getDefaultTriggerAsyncId() to retrieve the id.
- const asyncId = socket._handle ? socket._handle.getAsyncId() : undefined;
- // Mark this socket as available, AFTER user-added end
- // handlers have a chance to run.
- defaultTriggerAsyncIdScope(asyncId, process.nextTick, emitFreeNT, socket);
- }
+ debug('AGENT socket keep-alive');
+ if (req.timeoutCb) {
+ socket.setTimeout(0, req.timeoutCb);
+ req.timeoutCb = null;
+ }
+ socket.removeListener('close', socketCloseListener);
+ socket.removeListener('error', socketErrorListener);
+ socket.once('error', freeSocketErrorListener);
+ // There are cases where _handle === null. Avoid those. Passing null to
+ // nextTick() will call getDefaultTriggerAsyncId() to retrieve the id.
+ const asyncId = socket._handle ? socket._handle.getAsyncId() : undefined;
+ // Mark this socket as available, AFTER user-added end
+ // handlers have a chance to run.
+ defaultTriggerAsyncIdScope(asyncId, process.nextTick, emitFreeNT, socket);
}
function responseOnEnd() {
- const res = this;
const req = this.req;
if (req.socket && req.timeoutCb) {
@@ -634,19 +621,32 @@ function responseOnEnd() {
}
req._ended = true;
- if (!req.shouldKeepAlive || req.finished)
- responseKeepAlive(res, req);
+
+ if (!req.shouldKeepAlive) {
+ const socket = req.socket;
+ if (socket.writable) {
+ debug('AGENT socket.destroySoon()');
+ if (typeof socket.destroySoon === 'function')
+ socket.destroySoon();
+ else
+ socket.end();
+ }
+ assert(!socket.writable);
+ } else if (req.finished) {
+ // We can assume `req.finished` means all data has been written since:
+ // - `'responseOnEnd'` means we have been assigned a socket.
+ // - when we have a socket we write directly to it without buffering.
+ // - `req.finished` means `end()` has been called and no further data.
+ // can be written
+ responseKeepAlive(req);
+ }
}
function requestOnPrefinish() {
const req = this;
- const res = this.res;
-
- if (!req.shouldKeepAlive)
- return;
- if (req._ended)
- responseKeepAlive(res, req);
+ if (req.shouldKeepAlive && req._ended)
+ responseKeepAlive(req);
}
function emitFreeNT(socket) {