@@ -4,6 +4,7 @@ const Http = require('http');
4
4
const Net = require ( 'net' ) ;
5
5
const Stream = require ( 'stream' ) ;
6
6
const Url = require ( 'url' ) ;
7
+ const Events = require ( 'events' ) ;
7
8
8
9
const Boom = require ( '@hapi/boom' ) ;
9
10
const Code = require ( '@hapi/code' ) ;
@@ -275,45 +276,57 @@ describe('Request', () => {
275
276
276
277
describe ( 'active()' , ( ) => {
277
278
278
- it ( 'exits handler early when request is no longer active' , async ( ) => {
279
+ it ( 'exits handler early when request is no longer active' , { retry : true } , async ( flags ) => {
280
+
281
+ let testComplete = false ;
282
+
283
+ const onCleanup = [ ] ;
284
+ flags . onCleanup = async ( ) => {
285
+
286
+ testComplete = true ;
287
+
288
+ for ( const cleanup of onCleanup ) {
289
+ await cleanup ( ) ;
290
+ }
291
+ } ;
279
292
280
293
const server = Hapi . server ( ) ;
281
- const team = new Teamwork . Team ( ) ;
282
- const team2 = new Teamwork . Team ( ) ;
294
+ const leaveHandlerTeam = new Teamwork . Team ( ) ;
283
295
284
- let rounds = 0 ;
285
296
server . route ( {
286
297
method : 'GET' ,
287
298
path : '/' ,
288
299
options : {
289
300
handler : async ( request , h ) => {
290
301
291
- team2 . attend ( ) ;
292
- for ( let i = 0 ; i < 100 ; ++ i ) {
293
- ++ rounds ;
294
- await Hoek . wait ( 10 ) ;
302
+ req . abort ( ) ;
295
303
296
- if ( ! request . active ( ) ) {
297
- break ;
298
- }
304
+ while ( request . active ( ) && ! testComplete ) {
305
+ await Hoek . wait ( 10 ) ;
299
306
}
300
307
301
- team . attend ( ) ;
308
+ leaveHandlerTeam . attend ( {
309
+ active : request . active ( ) ,
310
+ testComplete
311
+ } ) ;
312
+
302
313
return null ;
303
314
}
304
315
}
305
316
} ) ;
306
317
307
318
await server . start ( ) ;
319
+ onCleanup . unshift ( ( ) => server . stop ( ) ) ;
308
320
309
- const req = Http . get ( server . info . uri , ( res ) => { } ) ;
321
+ const req = Http . get ( server . info . uri , Hoek . ignore ) ;
310
322
req . on ( 'error' , Hoek . ignore ) ;
311
- await team2 . work ;
312
- req . abort ( ) ;
313
- await server . stop ( ) ;
314
323
315
- await team . work ;
316
- expect ( rounds ) . to . be . below ( 10 ) ;
324
+ const note = await leaveHandlerTeam . work ;
325
+
326
+ expect ( note ) . to . equal ( {
327
+ active : false ,
328
+ testComplete : false
329
+ } ) ;
317
330
} ) ;
318
331
} ) ;
319
332
@@ -847,10 +860,10 @@ describe('Request', () => {
847
860
848
861
describe ( '_postCycle()' , ( ) => {
849
862
850
- it ( 'skips onPreResponse when validation terminates request' , async ( ) => {
863
+ it ( 'skips onPreResponse when validation terminates request' , { retry : true } , async ( flags ) => {
851
864
852
865
const server = Hapi . server ( ) ;
853
- const team = new Teamwork . Team ( ) ;
866
+ const abortedReqTeam = new Teamwork . Team ( ) ;
854
867
855
868
let called = false ;
856
869
server . ext ( 'onPreResponse' , ( request , h ) => {
@@ -863,28 +876,38 @@ describe('Request', () => {
863
876
method : 'GET' ,
864
877
path : '/' ,
865
878
options : {
866
- handler : ( ) => null ,
879
+ handler : ( request ) => {
880
+
881
+ // Stash raw so that we can access it on response validation
882
+ Object . assign ( request . app , request . raw ) ;
883
+
884
+ return null ;
885
+ } ,
867
886
response : {
868
887
status : {
869
- 200 : async ( ) => {
888
+ 200 : async ( _ , { context } ) => {
870
889
871
890
req . abort ( ) ;
872
- await Hoek . wait ( 10 ) ;
873
- team . attend ( ) ;
891
+
892
+ const raw = context . app . request ;
893
+ await Events . once ( raw . req , 'aborted' ) ;
894
+
895
+ abortedReqTeam . attend ( ) ;
874
896
}
875
897
}
876
898
}
877
899
}
878
900
} ) ;
879
901
880
902
await server . start ( ) ;
903
+ flags . onCleanup = ( ) => server . stop ( ) ;
881
904
882
- const req = Http . get ( server . info . uri , ( res ) => { } ) ;
905
+ const req = Http . get ( server . info . uri , Hoek . ignore ) ;
883
906
req . on ( 'error' , Hoek . ignore ) ;
884
907
885
- await team . work ;
886
- await Hoek . wait ( 100 ) ;
887
- await server . stop ( ) ;
908
+ await abortedReqTeam . work ;
909
+
910
+ await server . events . once ( 'response' ) ;
888
911
889
912
expect ( called ) . to . be . false ( ) ;
890
913
} ) ;
@@ -2279,41 +2302,41 @@ describe('Request', () => {
2279
2302
expect ( res . statusCode ) . to . equal ( 200 ) ;
2280
2303
} ) ;
2281
2304
2282
- it ( 'handles race condition between equal client and server timeouts' , async ( ) => {
2305
+ it ( 'handles race condition between equal client and server timeouts' , async ( flags ) => {
2306
+
2307
+ const onCleanup = [ ] ;
2308
+ flags . onCleanup = async ( ) => {
2309
+
2310
+ for ( const cleanup of onCleanup ) {
2311
+ await cleanup ( ) ;
2312
+ }
2313
+ } ;
2283
2314
2284
2315
const server = Hapi . server ( { routes : { timeout : { server : 100 } , payload : { timeout : 100 } } } ) ;
2285
2316
server . route ( { method : 'POST' , path : '/timeout' , options : { handler : Hoek . block } } ) ;
2286
2317
2287
2318
await server . start ( ) ;
2319
+ onCleanup . unshift ( ( ) => server . stop ( ) ) ;
2288
2320
2289
2321
const timer = new Hoek . Bench ( ) ;
2290
2322
const options = {
2291
- hostname : '127.0.0.1 ' ,
2323
+ hostname : 'localhost ' ,
2292
2324
port : server . info . port ,
2293
2325
path : '/timeout' ,
2294
2326
method : 'POST'
2295
2327
} ;
2296
2328
2297
- await new Promise ( async ( resolve ) => {
2329
+ const req = Http . request ( options ) ;
2330
+ onCleanup . unshift ( ( ) => req . destroy ( ) ) ;
2298
2331
2299
- const req = Http . request ( options , ( res ) => {
2332
+ req . write ( '\n' ) ;
2300
2333
2301
- expect ( [ 503 , 408 ] ) . to . contain ( res . statusCode ) ;
2302
- expect ( timer . elapsed ( ) ) . to . be . at . least ( 80 ) ;
2303
- resolve ( ) ;
2304
- } ) ;
2334
+ const [ res ] = await Events . once ( req , 'response' ) ;
2305
2335
2306
- req . on ( 'error' , ( err ) => {
2336
+ expect ( [ 503 , 408 ] ) . to . contain ( res . statusCode ) ;
2337
+ expect ( timer . elapsed ( ) ) . to . be . at . least ( 80 ) ;
2307
2338
2308
- expect ( err ) . to . not . exist ( ) ;
2309
- } ) ;
2310
-
2311
- req . write ( '\n' ) ;
2312
- await Hoek . wait ( 200 ) ;
2313
- req . end ( ) ;
2314
- } ) ;
2315
-
2316
- await server . stop ( { timeout : 1 } ) ;
2339
+ await Events . once ( req , 'close' ) ; // Ensures that req closes without error
2317
2340
} ) ;
2318
2341
} ) ;
2319
2342
0 commit comments