Open
Description
Support plan
- is this issue currently blocking your project? (yes/no): no
- is this issue affecting a production system? (yes/no): no
Context
- node version: v16.12.0 / v15.14.0
- module version with issue: 20.2.1
- last module version without issue: n/a
- environment (e.g. node, browser, native): node
- used with (e.g. hapi application, another framework, standalone, ...): n/a
- any other relevant information:
What are you trying to achieve or the steps to reproduce?
It seems like the disconnect
event of requests does only fire for GET requests but not for other HTTP methods starting from nodeJS v16. See also the test script below. With node v15 it fires for all of them. In both versions the finish
event also seems to not trigger for GET. I don't know why there are differences in the bahaviour between http methods in the first place.
const Hapi = require('@hapi/hapi');
const net = require('net');
const { setTimeout } = require('timers/promises');
const check = async (method) => {
console.log(method)
const server = Hapi.server({
port: 8000,
host: '0.0.0.0',
})
server.ext('onRequest', (request, h) => {
request.events.on('disconnect', () => { console.log('disconnect') });
request.events.on('finish', () => { console.log('finish') });
return h.continue;
})
server.route({
method: method,
path: '/test',
handler: async (request, h) => {
await setTimeout(1000);
return h.response();
},
});
await server.start();
const socket = new net.Socket();
socket.connect({
host: server.info.host,
port: server.info.port,
});
await new Promise ((resolve) => {
socket.on('connect', function () {
socket.write(`${method} /test HTTP/1.1\r\n\r\n`, async () => {
socket.destroy();
await setTimeout(100);
await server.stop();
resolve();
});
});
});
console.log('');
}
(async () => {
await check('GET');
await check('POST');
await check('PUT');
await check('DELETE');
})();
What was the result you got?
Node 16:
GET
disconnect
POST
finish
PUT
finish
DELETE
finish
Node 15:
GET
disconnect
POST
finish
disconnect
PUT
finish
disconnect
DELETE
finish
disconnect
What result did you expect?
I expected the disconnect event to fire in all cases.