Skip to content

Commit

Permalink
http2: reject failed http2.connect when used with promisify
Browse files Browse the repository at this point in the history
PR-URL: #53475
Reviewed-By: Tim Perry <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Marco Ippolito <[email protected]>
  • Loading branch information
ehsankhfr authored and targos committed Jun 20, 2024
1 parent 15df4ed commit 41100b6
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 4 deletions.
13 changes: 9 additions & 4 deletions lib/internal/http2/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -1034,7 +1034,7 @@ function setupHandle(socket, type, options) {
// If the session has been destroyed, go ahead and emit 'connect',
// but do nothing else. The various on('connect') handlers set by
// core will check for session.destroyed before progressing, this
// ensures that those at l`east get cleared out.
// ensures that those at least get cleared out.
if (this.destroyed) {
process.nextTick(emit, this, 'connect', this, socket);
return;
Expand Down Expand Up @@ -2126,7 +2126,7 @@ class Http2Stream extends Duplex {
}

[kProceed]() {
assert.fail('Implementors MUST implement this. Please report this as a ' +
assert.fail('Implementers MUST implement this. Please report this as a ' +
'bug in Node.js');
}

Expand Down Expand Up @@ -3380,8 +3380,13 @@ function connect(authority, options, listener) {
ObjectDefineProperty(connect, promisify.custom, {
__proto__: null,
value: (authority, options) => {
return new Promise((resolve) => {
const server = connect(authority, options, () => resolve(server));
return new Promise((resolve, reject) => {
const server = connect(authority, options, () => {
server.removeListener('error', reject);
return resolve(server);
});

server.once('error', reject);
});
},
});
Expand Down
24 changes: 24 additions & 0 deletions test/parallel/test-http2-client-promisify-connect-error.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
'use strict';

const common = require('../common');

if (!common.hasCrypto)
common.skip('missing crypto');
const assert = require('assert');
const http2 = require('http2');
const util = require('util');

const server = http2.createServer();

server.listen(0, common.mustCall(() => {
const port = server.address().port;
server.close(() => {
const connect = util.promisify(http2.connect);
connect(`http://localhost:${port}`)
.then(common.mustNotCall('Promise should not be resolved'))
.catch(common.mustCall((err) => {
assert(err instanceof Error);
assert.strictEqual(err.code, 'ECONNREFUSED');
}));
});
}));

0 comments on commit 41100b6

Please sign in to comment.