Skip to content

Some http2 errors are not captured #28895

@szmarczak

Description

@szmarczak
const http2 = require('http2');

try {
    const session = http2.connect('https://example.com', {
        settings: {
            maxFrameSize: 1
        }
    });
    
    session.on('error', error => {
        console.log('Captured an error.');
    });
} catch (error) {
    console.log('Captured an error.');
}

See it on RunKit.

Actual behavior

internal/http2/util.js:521
      throw new ERR_HTTP2_INVALID_SETTING_VALUE.RangeError(
      ^

RangeError [ERR_HTTP2_INVALID_SETTING_VALUE]: Invalid value for setting "maxFrameSize": 1
    at ClientHttp2Session.settings (internal/http2/core.js:1156:5)
    at ClientHttp2Session.setupHandle (internal/http2/core.js:861:8)
    at Object.onceWrapper (events.js:291:20)
    at TLSSocket.emit (events.js:203:13)
    at TLSSocket.onConnectSecure (_tls_wrap.js:1346:10)
    at TLSSocket.emit (events.js:203:13)
    at TLSSocket._finishInit (_tls_wrap.js:792:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:606:12) {
  actual: 1,
  min: 16384,
  max: 16777215
}

Expected behavior

Captured an error.

Possible solution

It's thrown from here:

socket.once(connectEvent, setupFn);

I think it needs to be like:

      socket.once(connectEvent, () => {
        try {
          setupFn();
        } catch (error) {
          socket.destroy(error);
        }
      });

Metadata

Metadata

Assignees

No one assigned

    Labels

    http2Issues or PRs related to the http2 subsystem.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions