Skip to content

Commit 36a2583

Browse files
committed
Automatically try to render 404.html for not-found routes
1 parent a690b65 commit 36a2583

File tree

1 file changed

+55
-33
lines changed

1 file changed

+55
-33
lines changed

src/index.js

Lines changed: 55 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -400,9 +400,9 @@ module.exports = async (request, response, config = {}, methods = {}) => {
400400
response.end();
401401
}
402402

403-
const relativePath = applyRewrites(decodedPath, config.rewrites);
404-
403+
let relativePath = applyRewrites(decodedPath, config.rewrites);
405404
let absolutePath = path.join(current, relativePath);
405+
406406
let stats = null;
407407

408408
try {
@@ -416,52 +416,74 @@ module.exports = async (request, response, config = {}, methods = {}) => {
416416
}
417417
}
418418

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);
423422

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);
431430

432-
return;
433-
}
431+
return;
434432
}
435433
}
434+
}
436435

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);
440444

441445
return;
442446
}
443-
}
444447

445-
const headers = await getHeaders(config.headers, relativePath, stats);
448+
if (directory) {
449+
response.statusCode = 200;
450+
response.end(directory);
446451

447-
if (stats.isFile()) {
448-
response.writeHead(200, headers);
449-
handlers.createReadStream(absolutePath).pipe(response);
452+
return;
453+
}
450454

451-
return;
455+
// The directory listing is disabled, so we want to
456+
// render a 404 error.
457+
stats = null;
452458
}
453459

454-
let directory = null;
460+
if (!stats) {
461+
response.statusCode = 404;
455462

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);
461465

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;
463483
}
464484

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);
467489
};

0 commit comments

Comments
 (0)