It will throw an error when both using `server.closeIdleConnections()` & `server.close()`
Version
18.5.0
Platform
Darwin Kernel Version 21.4.0: Fri Mar 18 00:47:26 PDT 2022; root:xnu-8020.101.4~15/RELEASE_ARM64_T8101 x86_64
Subsystem
http
What steps will reproduce the bug?
$ git clone git@github.com:xtx1130/node-idleconection-test.git
$ npm i
$ npm t
When I'm dealing with https://github.com/fastify/fastify/issues/4098, I found a strange behavior in server
:
If both using closeidleConnections
& close
api to deal with server.close
, it will throw an error, but is ok to use one of this. And I have noticed that in this pr:https://github.com/nodejs/node/pull/43522 closeidleConnections
will run in server.close
. If use main branch to run this code without trigger closeidleConnections
it will also throw the same error.
How often does it reproduce? Is there a required condition?
always
What is the expected behavior?
return {"data":"Hello World!"}
What do you see instead?
node:internal/process/esm_loader:91
internalBinding('errors').triggerUncaughtException(
^
RequestError: connect ECONNREFUSED 0.0.0.0:3000
at ClientRequest.<anonymous> (file:///Users/didi/Desktop/fastify-test/fastify-shutdown-regression/fastify-4/node_modules/got/dist/source/core/index.js:760:107)
at Object.onceWrapper (node:events:652:26)
at ClientRequest.emit (node:events:549:35)
at Socket.socketErrorListener (node:_http_client:465:9)
at Socket.emit (node:events:537:28)
at emitErrorNT (node:internal/streams/destroy:151:8)
at emitErrorCloseNT (node:internal/streams/destroy:116:3)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1237:16) {
input: undefined,
code: 'ECONNREFUSED',
timings: {
start: 1657536578532,
socket: 1657536578533,
lookup: undefined,
connect: undefined,
secureConnect: undefined,
upload: undefined,
response: undefined,
end: undefined,
error: 1657536578533,
abort: undefined,
phases: {
wait: 1,
dns: undefined,
tcp: undefined,
tls: undefined,
request: undefined,
firstByte: undefined,
download: undefined,
total: 1
}
},
options: Options {
_unixOptions: undefined,
_internals: {
request: undefined,
agent: { http: undefined, https: undefined, http2: undefined },
h2session: undefined,
decompress: true,
timeout: {
connect: undefined,
lookup: undefined,
read: undefined,
request: undefined,
response: undefined,
secureConnect: undefined,
send: undefined,
socket: undefined
},
prefixUrl: '',
body: undefined,
form: undefined,
json: undefined,
cookieJar: undefined,
ignoreInvalidCookies: false,
searchParams: undefined,
dnsLookup: undefined,
dnsCache: undefined,
context: {},
hooks: {
init: [],
beforeRequest: [],
beforeError: [],
beforeRedirect: [],
beforeRetry: [],
afterResponse: []
},
followRedirect: true,
maxRedirects: 10,
cache: undefined,
throwHttpErrors: true,
username: '',
password: '',
http2: false,
allowGetBody: false,
headers: {
'user-agent': 'got (https://github.com/sindresorhus/got)',
connection: 'close',
'accept-encoding': 'gzip, deflate, br'
},
methodRewriting: false,
dnsLookupIpVersion: undefined,
parseJson: [Function: parse],
stringifyJson: [Function: stringify],
retry: {
limit: 2,
methods: [ 'GET', 'PUT', 'HEAD', 'DELETE', 'OPTIONS', 'TRACE' ],
statusCodes: [
408, 413, 429, 500,
502, 503, 504, 521,
522, 524
],
errorCodes: [
'ETIMEDOUT',
'ECONNRESET',
'EADDRINUSE',
'ECONNREFUSED',
'EPIPE',
'ENOTFOUND',
'ENETUNREACH',
'EAI_AGAIN'
],
maxRetryAfter: undefined,
calculateDelay: [Function: calculateDelay],
backoffLimit: Infinity,
noise: 100
},
localAddress: undefined,
method: 'GET',
createConnection: undefined,
cacheOptions: {
shared: undefined,
cacheHeuristic: undefined,
immutableMinTimeToLive: undefined,
ignoreCargoCult: undefined
},
https: {
alpnProtocols: undefined,
rejectUnauthorized: undefined,
checkServerIdentity: undefined,
certificateAuthority: undefined,
key: undefined,
certificate: undefined,
passphrase: undefined,
pfx: undefined,
ciphers: undefined,
honorCipherOrder: undefined,
minVersion: undefined,
maxVersion: undefined,
signatureAlgorithms: undefined,
tlsSessionLifetime: undefined,
dhparam: undefined,
ecdhCurve: undefined,
certificateRevocationLists: undefined
},
encoding: undefined,
resolveBodyOnly: false,
isStream: false,
responseType: 'text',
url: <ref *1> URL {
[Symbol(context)]: URLContext {
flags: 400,
scheme: 'http:',
username: '',
password: '',
host: '0.0.0.0',
port: 3000,
path: [ 'delay' ],
query: null,
fragment: null
},
[Symbol(query)]: URLSearchParams {
[Symbol(query)]: [],
[Symbol(context)]: [Circular *1]
}
},
pagination: {
transform: [Function: transform],
paginate: [Function: paginate],
filter: [Function: filter],
shouldContinue: [Function: shouldContinue],
countLimit: Infinity,
backoff: 0,
requestLimit: 10000,
stackAllItems: false
},
setHost: true,
maxHeaderSize: undefined
},
_merging: false,
_init: [ { headers: { Connection: 'close' } } ]
}
}
Node.js v18.5.0
Additional information
No response