@@ -400,9 +400,9 @@ module.exports = async (request, response, config = {}, methods = {}) => {
400
400
response . end ( ) ;
401
401
}
402
402
403
- const relativePath = applyRewrites ( decodedPath , config . rewrites ) ;
404
-
403
+ let relativePath = applyRewrites ( decodedPath , config . rewrites ) ;
405
404
let absolutePath = path . join ( current , relativePath ) ;
405
+
406
406
let stats = null ;
407
407
408
408
try {
@@ -416,52 +416,74 @@ module.exports = async (request, response, config = {}, methods = {}) => {
416
416
}
417
417
}
418
418
419
- if ( ! stats || stats . isDirectory ( ) ) {
420
- if ( cleanUrl ) {
421
- try {
422
- const related = await findRelated ( current , relativePath , handlers . stat ) ;
419
+ if ( ( ! stats || stats . isDirectory ( ) ) && cleanUrl ) {
420
+ try {
421
+ const related = await findRelated ( current , relativePath , handlers . stat ) ;
423
422
424
- if ( related ) {
425
- ( { stats, absolutePath} = related ) ;
426
- }
427
- } catch ( err ) {
428
- if ( err . code !== 'ENOENT' ) {
429
- response . statusCode = 500 ;
430
- response . end ( err . message ) ;
423
+ if ( related ) {
424
+ ( { stats, absolutePath} = related ) ;
425
+ }
426
+ } catch ( err ) {
427
+ if ( err . code !== 'ENOENT' ) {
428
+ response . statusCode = 500 ;
429
+ response . end ( err . message ) ;
431
430
432
- return ;
433
- }
431
+ return ;
434
432
}
435
433
}
434
+ }
436
435
437
- if ( ! stats ) {
438
- response . statusCode = 404 ;
439
- response . end ( 'Not Found' ) ;
436
+ if ( stats && stats . isDirectory ( ) ) {
437
+ let directory = null ;
438
+
439
+ try {
440
+ directory = await renderDirectory ( current , relativePath , absolutePath , handlers , config ) ;
441
+ } catch ( err ) {
442
+ response . statusCode = 500 ;
443
+ response . end ( err . message ) ;
440
444
441
445
return ;
442
446
}
443
- }
444
447
445
- const headers = await getHeaders ( config . headers , relativePath , stats ) ;
448
+ if ( directory ) {
449
+ response . statusCode = 200 ;
450
+ response . end ( directory ) ;
446
451
447
- if ( stats . isFile ( ) ) {
448
- response . writeHead ( 200 , headers ) ;
449
- handlers . createReadStream ( absolutePath ) . pipe ( response ) ;
452
+ return ;
453
+ }
450
454
451
- return ;
455
+ // The directory listing is disabled, so we want to
456
+ // render a 404 error.
457
+ stats = null ;
452
458
}
453
459
454
- let directory = null ;
460
+ if ( ! stats ) {
461
+ response . statusCode = 404 ;
455
462
456
- try {
457
- directory = await renderDirectory ( current , relativePath , absolutePath , handlers , config ) ;
458
- } catch ( err ) {
459
- response . statusCode = 500 ;
460
- response . end ( err . message ) ;
463
+ const errorPage = '404.html' ;
464
+ const errorPageFull = path . join ( current , errorPage ) ;
461
465
462
- return ;
466
+ try {
467
+ stats = await handlers . stat ( errorPage ) ;
468
+ } catch ( err ) {
469
+ if ( err . code !== 'ENOENT' ) {
470
+ response . statusCode = 500 ;
471
+ response . end ( err . message ) ;
472
+
473
+ return ;
474
+ }
475
+ }
476
+
477
+ if ( ! stats ) {
478
+ response . end ( 'Not Found' ) ;
479
+ return ;
480
+ }
481
+ absolutePath = errorPageFull ;
482
+ relativePath = errorPage ;
463
483
}
464
484
465
- response . statusCode = directory ? 200 : 404 ;
466
- response . end ( directory || 'Not Found' ) ;
485
+ const headers = await getHeaders ( config . headers , relativePath , stats ) ;
486
+
487
+ response . writeHead ( 200 , headers ) ;
488
+ handlers . createReadStream ( absolutePath ) . pipe ( response ) ;
467
489
} ;
0 commit comments