Skip to content

No request hook triggered on closed socket #4534

@OppoOskar

Description

@OppoOskar

Prerequisites

  • I have written a descriptive issue title
  • I have searched existing issues to ensure the bug has not already been reported

Fastify version

4.12.0

Plugin version

No response

Node.js version

16.15.0

Operating system

Linux

Operating system version (i.e. 20.04, 11.3, 10)

Fedora 36

Description

No error/timeout hook is triggered if socket is closed.

When intentionally killing the socket of a request no fastify request hook (other than onSend) is triggered.

Steps to Reproduce

Basic server, logging when hooks are triggered

// CommonJs
const fastify = require("fastify")({
    logger: true,
});

let requestStarted;

const getSecondsSinceRequestStarted = () => {
    return (new Date(Date.now())).getSeconds()-requestStarted.getSeconds();
}

fastify.get("/", async (request, reply) => {
    requestStarted = new Date(Date.now());
    console.log(getSecondsSinceRequestStarted(),"s : Request recieved");
    request.raw.on("close", (data) => {
        console.log(getSecondsSinceRequestStarted(),"s : node event close");
    });
    await new Promise((resolve) => setTimeout(resolve, 5 * 1000));
    return { hello: "world" };
});

fastify.addHook("onError", async () => {
    console.log(getSecondsSinceRequestStarted(),"s : onError");
});
fastify.addHook("onResponse", async () => {
    console.log(getSecondsSinceRequestStarted(),"s : onResponse");
});
fastify.addHook("onSend", async (data, test) => {
    console.log(getSecondsSinceRequestStarted(),"s : onSend");
});
fastify.addHook("onTimeout", async () => {
    console.log(getSecondsSinceRequestStarted(),"s : onTimeout");
});

const start = async () => {
    try {
        await fastify.listen({ port: 1111 });
    } catch (err) {
        fastify.log.error(err);
        process.exit(1);
    }
};
start();

Seperate small script intentionally killing the socket before request is finsihed

const http = require("http");

const start = async () => {
    const res = http.get({ hostname: "localhost", port: 1111, path: "/" });
    await new Promise((resolve) => setTimeout(resolve, 1 * 1000));  
    console.log("Destroying socket");
    res.destroy();
}

start();

Stdout of fastify server

0 s : Request recieved
1 s : node event close
5 s : onSend

Expected Behavior

Some request hook other than onSend triggering.

Metadata

Metadata

Assignees

No one assigned

    Labels

    semver-minorIssue or PR that should land as semver minor

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions