@@ -310,4 +310,108 @@ describe('Security Fixes', () => {
310310 await service . close ( )
311311 } )
312312 } )
313+
314+ describe ( 'SEC-005: Out-of-range error status codes fall back to 500' , ( ) => {
315+ let server
316+ const service = require ( '../index' ) ( {
317+ errorHandler ( err , req , res ) {
318+ res . send ( err )
319+ }
320+ } )
321+
322+ service . get ( '/hello' , ( req , res ) => {
323+ res . send ( 'world' )
324+ } )
325+
326+ service . get ( '/error-code-99' , ( req , res ) => {
327+ const err = new Error ( 'Low code' )
328+ err . code = 99
329+ throw err
330+ } )
331+
332+ service . get ( '/error-status-huge' , ( req , res ) => {
333+ const err = new Error ( 'Huge status' )
334+ err . status = 12345
335+ throw err
336+ } )
337+
338+ service . get ( '/error-float-code' , ( req , res ) => {
339+ const err = new Error ( 'Float code' )
340+ err . code = 200.5
341+ throw err
342+ } )
343+
344+ it ( 'should start service' , async ( ) => {
345+ server = await service . start ( ~ ~ process . env . PORT )
346+ } )
347+
348+ it ( 'should return 500 instead of crashing when err.code is out of range' , async ( ) => {
349+ await request ( server )
350+ . get ( '/error-code-99' )
351+ . expect ( 500 )
352+ . then ( ( response ) => {
353+ expect ( response . body . code ) . to . equal ( 500 )
354+ } )
355+ } )
356+
357+ it ( 'should return 500 instead of crashing when err.status exceeds 999' , async ( ) => {
358+ await request ( server )
359+ . get ( '/error-status-huge' )
360+ . expect ( 500 )
361+ . then ( ( response ) => {
362+ expect ( response . body . code ) . to . equal ( 500 )
363+ } )
364+ } )
365+
366+ it ( 'should return 500 instead of crashing when err.code is not an integer' , async ( ) => {
367+ await request ( server )
368+ . get ( '/error-float-code' )
369+ . expect ( 500 )
370+ . then ( ( response ) => {
371+ expect ( response . body . code ) . to . equal ( 500 )
372+ } )
373+ } )
374+
375+ it ( 'server should still be alive and responsive after out-of-range errors' , async ( ) => {
376+ await request ( server )
377+ . get ( '/hello' )
378+ . expect ( 200 )
379+ . then ( ( response ) => {
380+ expect ( response . text ) . to . equal ( 'world' )
381+ } )
382+ } )
383+
384+ it ( 'should successfully terminate the service' , async ( ) => {
385+ await service . close ( )
386+ } )
387+ } )
388+
389+ describe ( 'SEC-005b: Default error handler also survives out-of-range codes' , ( ) => {
390+ let server
391+ const service = require ( '../index' ) ( )
392+
393+ service . get ( '/error-bad-code' , ( req , res ) => {
394+ const err = new Error ( 'boom' )
395+ err . code = 99
396+ throw err
397+ } )
398+
399+ it ( 'should start service' , async ( ) => {
400+ server = await service . start ( ~ ~ process . env . PORT )
401+ } )
402+
403+ it ( 'should return 500 with generic message and keep the process alive' , async ( ) => {
404+ await request ( server )
405+ . get ( '/error-bad-code' )
406+ . expect ( 500 )
407+ . then ( ( response ) => {
408+ expect ( response . body . code ) . to . equal ( 500 )
409+ expect ( response . body . message ) . to . equal ( 'Internal Server Error' )
410+ } )
411+ } )
412+
413+ it ( 'should successfully terminate the service' , async ( ) => {
414+ await service . close ( )
415+ } )
416+ } )
313417} )
0 commit comments