Skip to content

http2: trailers or response to be emitted? #41251

Description

@szmarczak

Version

v17.3.0

Platform

Linux pop-os 5.15.5-76051505-generic #202111250933~1638201579~21.04~09f1aa7-Ubuntu SMP Tue Nov 30 02: x86_64 x86_64 x86_64 GNU/Linux

Subsystem

http2

What steps will reproduce the bug?

const http2 = require('http2');

const server = http2.createServer((request, response) => {
    response.writeContinue();
    response.end(); // Make it end('') and it emits `response` instead
});

server.listen(() => {
    const { port } = server.address();

    const session = http2.connect(`http://localhost:${port}`);
    const request = session.request({
        ':path': '/',
        ':method': 'GET',
    });

    request.on('response', (headers) => {
        console.log('got response', headers);
    });

    request.on('headers', () => {
        console.log('got headers');
    });

    request.on('trailers', (trailers) => {
        console.log('got trailers', trailers);
    });

    request.end();
    request.resume();

    request.on('end', () => {
        session.close();
        server.close();
    });
});

How often does it reproduce? Is there a required condition?

Always.

What is the expected behavior?

got headers
got response [Object: null prototype] {
  ':status': 200,
  date: 'Mon, 20 Dec 2021 08:27:48 GMT',
  [Symbol(nodejs.http2.sensitiveHeaders)]: []
}

What do you see instead?

got headers
+got trailers [Object: null prototype] {
  ':status': 200,
  date: 'Mon, 20 Dec 2021 08:27:48 GMT',
  [Symbol(nodejs.http2.sensitiveHeaders)]: []
}

Additional information

I'm not sure if this is the expected behavior. HTTP/1 for comparison (trailers are empty):

    const http = require('http');

    const server = http.createServer((request, response) => {
        response.writeContinue();
        response.end();
    });

    server.listen(() => {
        const { port } = server.address();

        const request = http.get(`http://localhost:${port}`, response => {
            response.resume();

            response.on('end', () => {
                console.log(response.trailers, response.rawTrailers);

                server.close();
            });
        });

        request.on('information', () => {
            console.log('information');
        });
    });
information
{} []

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    http2Issues and PRs related to the http2 subsystem.linuxIssues and PRs related to the Linux platform.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions