Skip to content

Commit faeee93

Browse files
committed
invoke all listeners instead of just the first
1 parent 8e87e27 commit faeee93

File tree

2 files changed

+80
-1
lines changed

2 files changed

+80
-1
lines changed

index.js

+20-1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ proto.use = function use(route, fn) {
8686
// wrap sub-apps
8787
if (typeof handle.handle === 'function') {
8888
var server = handle;
89+
8990
server.route = path;
9091
handle = function (req, res, next) {
9192
server.handle(req, res, next);
@@ -94,7 +95,25 @@ proto.use = function use(route, fn) {
9495

9596
// wrap vanilla http.Servers
9697
if (handle instanceof http.Server) {
97-
handle = handle.listeners('request')[0];
98+
var server = handle;
99+
100+
handle = function (req, res, next) {
101+
var listeners = server.listeners('request');
102+
var error;
103+
104+
try {
105+
for (var i = 0; i < listeners.length; i++) {
106+
if (!res.finished) {
107+
listeners[i].call(server, req, res);
108+
}
109+
}
110+
} catch (e) {
111+
error = e;
112+
}
113+
if (!res.finished) {
114+
next(error);
115+
}
116+
};
98117
}
99118

100119
// strip trailing slash

test/server.js

+60
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,25 @@ describe('app', function(){
3131
.expect(200, 'hello, world!', done);
3232
})
3333

34+
it('should invoke all request listeners', function (done) {
35+
var app = connect();
36+
var router = http.createServer();
37+
38+
router.on('request', function (req, res) {
39+
res.write('hello, ');
40+
});
41+
router.on('request', function (req, res) {
42+
res.end('world!');
43+
});
44+
app.use(router);
45+
46+
var server = http.createServer(app);
47+
48+
request(server)
49+
.get('/')
50+
.expect(200, 'hello, world!', done);
51+
})
52+
3453
it('should be a callable function', function(done){
3554
var app = connect();
3655

@@ -92,6 +111,25 @@ describe('app', function(){
92111
.expect(200, 'oh, boom!', done);
93112
})
94113

114+
it('should invoke callback on request listener error', function (done) {
115+
var app = connect();
116+
var router = http.createServer();
117+
118+
router.on('request', function (req, res) {
119+
throw new Error('boom!');
120+
});
121+
app.use(router);
122+
app.use(function (err, req, res, next) {
123+
res.end('oh, ' + err.message);
124+
});
125+
126+
var server = http.createServer(app);
127+
128+
request(server)
129+
.get('/')
130+
.expect(200, 'oh, boom!', done);
131+
})
132+
95133
it('should work as middleware', function(done){
96134
// custom server handler array
97135
var handlers = [connect(), function(req, res, next){
@@ -214,6 +252,28 @@ describe('app', function(){
214252
.expect(200, done);
215253
})
216254

255+
it('should not fire after headers sent in request listener', function (done) {
256+
var app = connect();
257+
var router = http.createServer();
258+
259+
router.on('request', function (req, res) {
260+
res.end('hello');
261+
});
262+
router.on('request', function (req, res) {
263+
res.write('world');
264+
});
265+
app.use(router);
266+
app.use(function (req, res) {
267+
res.end('body');
268+
});
269+
270+
var server = http.createServer(app);
271+
272+
request(app)
273+
.get('/')
274+
.expect(200, 'hello', done);
275+
})
276+
217277
it('shoud have no body for HEAD', function(done){
218278
var app = connect();
219279

0 commit comments

Comments
 (0)