@@ -18,25 +18,25 @@ var CLIENT;
18
18
var PORT ;
19
19
20
20
describe ( 'body reader' , function ( ) {
21
- describe ( 'gzip content encoding' , function ( ) {
22
- beforeEach ( function ( done ) {
23
- SERVER = restify . createServer ( {
24
- dtrace : helper . dtrace ,
25
- log : helper . getLog ( 'server' )
26
- } ) ;
21
+ beforeEach ( function ( done ) {
22
+ SERVER = restify . createServer ( {
23
+ dtrace : helper . dtrace ,
24
+ log : helper . getLog ( 'server' )
25
+ } ) ;
27
26
28
- SERVER . listen ( 0 , '127.0.0.1' , function ( ) {
29
- PORT = SERVER . address ( ) . port ;
27
+ SERVER . listen ( 0 , '127.0.0.1' , function ( ) {
28
+ PORT = SERVER . address ( ) . port ;
30
29
31
- done ( ) ;
32
- } ) ;
30
+ done ( ) ;
33
31
} ) ;
32
+ } ) ;
34
33
35
- afterEach ( function ( done ) {
36
- CLIENT . close ( ) ;
37
- SERVER . close ( done ) ;
38
- } ) ;
34
+ afterEach ( function ( done ) {
35
+ CLIENT . close ( ) ;
36
+ SERVER . close ( done ) ;
37
+ } ) ;
39
38
39
+ describe ( 'gzip content encoding' , function ( ) {
40
40
it ( 'should parse gzip encoded content' , function ( done ) {
41
41
SERVER . use ( restify . plugins . bodyParser ( ) ) ;
42
42
@@ -187,4 +187,112 @@ describe('body reader', function() {
187
187
req . write ( postData ) ;
188
188
} ) ;
189
189
} ) ;
190
+
191
+ it ( 'should not add a listener for each call on same socket' , done => {
192
+ SERVER . use ( restify . plugins . bodyParser ( ) ) ;
193
+
194
+ let serverReq , serverRes , serverReqSocket ;
195
+ SERVER . post ( '/meals' , function ( req , res , next ) {
196
+ serverReq = req ;
197
+ serverRes = res ;
198
+ serverReqSocket = req . socket ;
199
+ res . send ( ) ;
200
+ next ( ) ;
201
+ } ) ;
202
+
203
+ CLIENT = restifyClients . createJsonClient ( {
204
+ url : 'http://127.0.0.1:' + PORT ,
205
+ retry : false ,
206
+ agent : new http . Agent ( { keepAlive : true } )
207
+ } ) ;
208
+
209
+ CLIENT . post ( '/meals' , { breakfast : 'pancakes' } , ( err , _ , res ) => {
210
+ assert . ifError ( err ) ;
211
+ assert . equal ( res . statusCode , 200 ) ;
212
+
213
+ const firstReqSocket = serverReqSocket ;
214
+ const numReqListeners = listenerCount ( serverReq ) ;
215
+ const numResListeners = listenerCount ( serverRes ) ;
216
+ const numReqSocketListeners = listenerCount ( serverReq . socket ) ;
217
+
218
+ // Without setImmediate, the second request will not reuse the socket.
219
+ setImmediate ( ( ) => {
220
+ CLIENT . post ( '/meals' , { lunch : 'salad' } , ( err2 , __ , res2 ) => {
221
+ assert . ifError ( err2 ) ;
222
+ assert . equal ( res2 . statusCode , 200 ) ;
223
+ assert . equal (
224
+ serverReqSocket ,
225
+ firstReqSocket ,
226
+ 'This test should issue two requests that share the ' +
227
+ 'same socket.'
228
+ ) ;
229
+ // The number of listeners on each emitter should not have
230
+ // increased since the first request.
231
+ assert . equal ( listenerCount ( serverReq ) , numReqListeners ) ;
232
+ assert . equal ( listenerCount ( serverRes ) , numResListeners ) ;
233
+ assert . equal (
234
+ listenerCount ( serverReq . socket ) ,
235
+ numReqSocketListeners
236
+ ) ;
237
+ done ( ) ;
238
+ } ) ;
239
+ } ) ;
240
+ } ) ;
241
+ } ) ;
242
+
243
+ it ( 'should call next for each successful request on same socket' , done => {
244
+ let nextCallCount = 0 ;
245
+ SERVER . use ( restify . plugins . bodyParser ( ) ) ;
246
+ SERVER . use ( ( req , res , next ) => {
247
+ nextCallCount += 1 ;
248
+ next ( ) ;
249
+ } ) ;
250
+
251
+ let serverReqSocket ;
252
+ SERVER . post ( '/meals' , function ( req , res , next ) {
253
+ res . send ( ) ;
254
+ next ( ) ;
255
+ } ) ;
256
+
257
+ CLIENT = restifyClients . createJsonClient ( {
258
+ url : 'http://127.0.0.1:' + PORT ,
259
+ retry : false ,
260
+ agent : new http . Agent ( { keepAlive : true } )
261
+ } ) ;
262
+
263
+ CLIENT . post ( '/meals' , { breakfast : 'waffles' } , ( err , _ , res ) => {
264
+ assert . ifError ( err ) ;
265
+ assert . equal ( res . statusCode , 200 ) ;
266
+ const firstReqSocket = serverReqSocket ;
267
+ assert . equal ( nextCallCount , 1 ) ;
268
+
269
+ // Without setImmediate, the second request will not reuse the socket.
270
+ setImmediate ( ( ) => {
271
+ CLIENT . post ( '/meals' , { lunch : 'candy' } , ( err2 , __ , res2 ) => {
272
+ assert . ifError ( err2 ) ;
273
+ assert . equal ( res2 . statusCode , 200 ) ;
274
+ assert . equal (
275
+ serverReqSocket ,
276
+ firstReqSocket ,
277
+ 'This test should issue two requests that share the ' +
278
+ 'same socket.'
279
+ ) ;
280
+ assert . equal ( nextCallCount , 2 ) ;
281
+ done ( ) ;
282
+ } ) ;
283
+ } ) ;
284
+ } ) ;
285
+ } ) ;
190
286
} ) ;
287
+
288
+ /**
289
+ * @param {EventEmitter } emitter - An emitter
290
+ * @returns {number } - The total number of listeners across all events
291
+ */
292
+ function listenerCount ( emitter ) {
293
+ let numListeners = 0 ;
294
+ for ( const eventName of emitter . eventNames ( ) ) {
295
+ numListeners += emitter . listenerCount ( eventName ) ;
296
+ }
297
+ return numListeners ;
298
+ }
0 commit comments