Niedzielski has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/395656 )
Change subject: Fix: return not found wiki pages as 404s
......................................................................
Fix: return not found wiki pages as 404s
The wiki route may fail when requesting initial properties (page
content) due to the page being nonexistent. Report 404s to the user as
the not found page route instead of the generic error page.
Change-Id: Ifc9a530a53ddf517016b9c732388c617714df983
---
M package.json
M src/common/router/router.ts
2 files changed, 26 insertions(+), 15 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/marvin refs/changes/56/395656/1
diff --git a/package.json b/package.json
index a414068..a33ff03 100644
--- a/package.json
+++ b/package.json
@@ -103,7 +103,7 @@
"bundlesize": [
{
"path": "dist/public/index.*.js",
- "maxSize": "3.7KB"
+ "maxSize": "3.8KB"
},
{
"path": "dist/public/runtime.*.js",
diff --git a/src/common/router/router.ts b/src/common/router/router.ts
index f9c92cc..a5fec2b 100644
--- a/src/common/router/router.ts
+++ b/src/common/router/router.ts
@@ -3,7 +3,7 @@
import HttpResponse from "../http/http-response";
import notFoundPage from "../pages/not-found";
import errorPage from "../pages/error";
-import { RedirectError } from "../http/fetch";
+import { ClientError, RedirectError, FetchError } from "../http/fetch";
export interface RouteResponse<Props> {
chunkName?: string;
@@ -48,40 +48,51 @@
);
}
-function respondError(error: Error) {
+function respondNotFound(path: string): Promise<RouteResponse<any>> {
+ return Promise.resolve({
+ status: notFoundPage.status,
+ Component: notFoundPage.Component,
+ props: { path }
+ });
+}
+
+function respondError(path: string, error: Error): Promise<RouteResponse<any>>
{
// Throw up RedirectErrors so that they can be handled by the server/client
// appropriately
if (error instanceof RedirectError) throw error;
+ if (error instanceof ClientError && error.status === 404) {
+ return respondNotFound(path);
+ }
+
+ const status = error instanceof FetchError ? error.status : errorPage.status;
console.error(`${error.message}\n${error.stack}`); // eslint-disable-line
no-console
- return {
- status: errorPage.status,
+ return Promise.resolve({
+ status,
Component: errorPage.Component,
props: { error }
- };
+ });
}
interface PageResolver {
(name: string): Promise<PageModule<any, any>>;
}
-export const newRouter = (
+export function newRouter(
routes: Route<any>[],
getPage: PageResolver = getChunk
-) => {
+) {
return {
route(path: string): Promise<RouteResponse<any>> {
for (const route of routes) {
const params = route.toParams(path);
if (params) {
- return respond(getPage, route, params).catch(respondError);
+ return respond(getPage, route, params).catch(error =>
+ respondError(path, error)
+ );
}
}
- return Promise.resolve({
- status: notFoundPage.status,
- Component: notFoundPage.Component,
- props: { path }
- });
+ return respondNotFound(path);
}
};
-};
+}
--
To view, visit https://gerrit.wikimedia.org/r/395656
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifc9a530a53ddf517016b9c732388c617714df983
Gerrit-PatchSet: 1
Gerrit-Project: marvin
Gerrit-Branch: master
Gerrit-Owner: Niedzielski <[email protected]>
Gerrit-Reviewer: Sniedzielski <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits