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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions