@@ -301,6 +301,95 @@ describe('compression()', function () {
301301 . expect ( 200 , done )
302302 } )
303303
304+ it ( 'should support removeListener("drain"); stream present' , function ( done ) {
305+ // compression doesn't proxy listenerCount() to the compression stream, so
306+ // instead watch for a MaxListenersExceededWarning
307+ var hasWarned = false
308+ var onWarning = function ( warning ) {
309+ hasWarned = true
310+ }
311+ process . on ( 'warning' , onWarning )
312+ var server = createServer ( { threshold : 0 } , function ( req , res ) {
313+ res . setHeader ( 'Content-Type' , 'text/plain' )
314+ var len = bytes ( '40kb' )
315+ var buf = Buffer . alloc ( len , '.' )
316+ res . write ( buf )
317+ // (12 is greater than the default number of max listeners)
318+ for ( var times = 0 ; times < 12 ; times ++ ) {
319+ var listener = function ( ) { }
320+ res . on ( 'drain' , listener )
321+ res . removeListener ( 'drain' , listener )
322+ }
323+ res . end ( )
324+ } )
325+
326+ request ( server )
327+ . get ( '/' )
328+ . set ( 'Accept-Encoding' , 'gzip' )
329+ . expect ( function ( ) {
330+ process . removeListener ( 'warning' , onWarning )
331+ assert . ok ( ! hasWarned )
332+ } )
333+ . expect ( 200 , done )
334+ } )
335+
336+ it ( 'should support removeListener("drain"); buffered' , function ( done ) {
337+ // Variant of above test for scenario when the listener is buffered (stream
338+ // is not yet present)
339+ var hasWarned = false
340+ var onWarning = function ( warning ) {
341+ hasWarned = true
342+ }
343+ process . on ( 'warning' , onWarning )
344+ var server = createServer ( { threshold : 0 } , function ( req , res ) {
345+ res . setHeader ( 'Content-Type' , 'text/plain' )
346+ for ( var times = 0 ; times < 12 ; times ++ ) {
347+ var listener = function ( ) { }
348+ res . on ( 'drain' , listener )
349+ res . removeListener ( 'drain' , listener )
350+ }
351+ res . end ( )
352+ } )
353+
354+ request ( server )
355+ . get ( '/' )
356+ . set ( 'Accept-Encoding' , 'gzip' )
357+ . expect ( function ( ) {
358+ process . removeListener ( 'warning' , onWarning )
359+ assert . ok ( ! hasWarned )
360+ } )
361+ . expect ( 200 , done )
362+ } )
363+
364+ it ( 'should support removeListener("drain"); multiple bindings of same listener, buffered' , function ( done ) {
365+ // Variant of above test for scenario when the listener is buffered (stream
366+ // is not yet present)
367+ var hasWarned = false
368+ var onWarning = function ( warning ) {
369+ hasWarned = true
370+ }
371+ process . on ( 'warning' , onWarning )
372+ var server = createServer ( { threshold : 0 } , function ( req , res ) {
373+ res . setHeader ( 'Content-Type' , 'text/plain' )
374+ for ( var times = 0 ; times < 12 ; times ++ ) {
375+ var listener = function ( ) { }
376+ res . on ( 'drain' , listener )
377+ res . on ( 'drain' , listener )
378+ res . removeListener ( 'drain' , listener )
379+ }
380+ res . end ( )
381+ } )
382+
383+ request ( server )
384+ . get ( '/' )
385+ . set ( 'Accept-Encoding' , 'gzip' )
386+ . expect ( function ( ) {
387+ process . removeListener ( 'warning' , onWarning )
388+ assert . ok ( ! hasWarned )
389+ } )
390+ . expect ( 200 , done )
391+ } )
392+
304393 describe ( 'threshold' , function ( ) {
305394 it ( 'should not compress responses below the threshold size' , function ( done ) {
306395 var server = createServer ( { threshold : '1kb' } , function ( req , res ) {
0 commit comments