Skip to content

Commit 9e69281

Browse files
committed
Merge pull request molnarg#153 from julien-f/forward-events
Forward `listening` and `error` events.
2 parents 20abdce + a46455f commit 9e69281

2 files changed

Lines changed: 63 additions & 0 deletions

File tree

lib/http.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,36 @@ exports.IncomingRequest = IncomingRequest;
396396
exports.OutgoingResponse = OutgoingResponse;
397397
exports.ServerResponse = OutgoingResponse; // for API compatibility
398398

399+
// Forward events `event` on `source` to all listeners on `target`.
400+
//
401+
// Note: The calling context is `source`.
402+
function forwardEvent(event, source, target) {
403+
function forward() {
404+
var listeners = target.listeners(event);
405+
406+
var n = listeners.length;
407+
408+
// Special case for `error` event with no listeners.
409+
if (n === 0 && event === 'error') {
410+
var args = [event];
411+
args.push.apply(args, arguments);
412+
413+
target.emit.apply(target, args);
414+
return;
415+
}
416+
417+
for (var i = 0; i < n; ++i) {
418+
listeners[i].apply(source, arguments);
419+
}
420+
}
421+
422+
source.on(event, forward);
423+
424+
// A reference to the function is necessary to be able to stop
425+
// forwarding.
426+
return forward;
427+
}
428+
399429
// Server class
400430
// ------------
401431

@@ -430,6 +460,9 @@ function Server(options) {
430460
}
431461
});
432462
this._server.on('request', this.emit.bind(this, 'request'));
463+
464+
forwardEvent('error', this._server, this);
465+
forwardEvent('listening', this._server, this);
433466
}
434467

435468
// HTTP2 over plain TCP

test/http.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,36 @@ describe('http.js', function() {
3939
}).to.throw(Error);
4040
});
4141
});
42+
describe('method `listen()`', function () {
43+
it('should emit `listening` event', function (done) {
44+
var server = http2.createServer(serverOptions);
45+
46+
server.on('listening', function () {
47+
server.close();
48+
49+
done();
50+
})
51+
52+
server.listen(0);
53+
});
54+
it('should emit `error` on failure', function (done) {
55+
var server = http2.createServer(serverOptions);
56+
57+
// This TCP server is used to explicitly take a port to make
58+
// server.listen() fails.
59+
var net = require('net').createServer();
60+
61+
server.on('error', function () {
62+
net.close()
63+
64+
done();
65+
});
66+
67+
net.listen(0, function () {
68+
server.listen(this.address().port);
69+
});
70+
});
71+
});
4272
describe('property `timeout`', function() {
4373
it('should be a proxy for the backing HTTPS server\'s `timeout` property', function() {
4474
var server = new http2.Server(serverOptions);

0 commit comments

Comments
 (0)