From 5956385c4180e8e8914b9199c4ed6ca8ae7d39fb Mon Sep 17 00:00:00 2001 From: Wouter Termont Date: Wed, 6 Apr 2022 17:50:54 +0200 Subject: [PATCH] chore: replace RedirectAllHttpHandler with RedirectingHttpHandler --- config/app/setup/handlers/redirect.json | 18 ++++--- src/index.ts | 1 - src/server/util/RedirectAllHttpHandler.ts | 47 ---------------- .../util/RedirectAllHttpHandler.test.ts | 53 ------------------- 4 files changed, 12 insertions(+), 107 deletions(-) delete mode 100644 src/server/util/RedirectAllHttpHandler.ts delete mode 100644 test/unit/server/util/RedirectAllHttpHandler.test.ts diff --git a/config/app/setup/handlers/redirect.json b/config/app/setup/handlers/redirect.json index 12c0c584b..b76d1aa82 100644 --- a/config/app/setup/handlers/redirect.json +++ b/config/app/setup/handlers/redirect.json @@ -4,11 +4,17 @@ { "comment": "Redirects all request to the setup.", "@id": "urn:solid-server:default:SetupRedirectHandler", - "@type": "RedirectAllHttpHandler", - "args_baseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" }, - "args_target": "/setup", - "args_targetExtractor": { "@id": "urn:solid-server:default:TargetExtractor" }, - "args_responseWriter": { "@id": "urn:solid-server:default:ResponseWriter" } - }, + "@type": "RedirectingHttpHandler", + "redirects": [ + { + "RedirectingHttpHandler:_redirects_key": ".*", + "RedirectingHttpHandler:_redirects_value": "/setup-page-reachable-with-any-suffix" + } + ], + "baseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" }, + "targetExtractor": { "@id": "urn:solid-server:default:TargetExtractor" }, + "responseWriter": { "@id": "urn:solid-server:default:ResponseWriter" }, + "statusCode": 302 + } ] } diff --git a/src/index.ts b/src/index.ts index c09603d59..84690beaa 100644 --- a/src/index.ts +++ b/src/index.ts @@ -269,7 +269,6 @@ export * from './server/middleware/StaticAssetHandler'; export * from './server/middleware/WebSocketAdvertiser'; // Server/Util -export * from './server/util/RedirectAllHttpHandler'; export * from './server/util/RouterHandler'; // Storage/Accessors diff --git a/src/server/util/RedirectAllHttpHandler.ts b/src/server/util/RedirectAllHttpHandler.ts deleted file mode 100644 index 5a5f5a1a2..000000000 --- a/src/server/util/RedirectAllHttpHandler.ts +++ /dev/null @@ -1,47 +0,0 @@ -import type { TargetExtractor } from '../../http/input/identifier/TargetExtractor'; -import { RedirectResponseDescription } from '../../http/output/response/RedirectResponseDescription'; -import type { ResponseWriter } from '../../http/output/ResponseWriter'; -import { FoundHttpError } from '../../util/errors/FoundHttpError'; -import { NotImplementedHttpError } from '../../util/errors/NotImplementedHttpError'; -import { getRelativeUrl, joinUrl } from '../../util/PathUtil'; -import type { HttpHandlerInput } from '../HttpHandler'; -import { HttpHandler } from '../HttpHandler'; - -export interface RedirectAllHttpHandlerArgs { - baseUrl: string; - target: string; - targetExtractor: TargetExtractor; - responseWriter: ResponseWriter; -} - -/** - * Will redirect all incoming requests to the given target. - * In case the incoming request already has the correct target, - * the `canHandle` call will reject the input. - */ -export class RedirectAllHttpHandler extends HttpHandler { - private readonly baseUrl: string; - private readonly target: string; - private readonly targetExtractor: TargetExtractor; - private readonly responseWriter: ResponseWriter; - - public constructor(args: RedirectAllHttpHandlerArgs) { - super(); - this.baseUrl = args.baseUrl; - this.target = args.target; - this.targetExtractor = args.targetExtractor; - this.responseWriter = args.responseWriter; - } - - public async canHandle({ request }: HttpHandlerInput): Promise { - const target = await getRelativeUrl(this.baseUrl, request, this.targetExtractor); - if (target === this.target) { - throw new NotImplementedHttpError('Target is already correct.'); - } - } - - public async handle({ response }: HttpHandlerInput): Promise { - const result = new RedirectResponseDescription(new FoundHttpError(joinUrl(this.baseUrl, this.target))); - await this.responseWriter.handleSafe({ response, result }); - } -} diff --git a/test/unit/server/util/RedirectAllHttpHandler.test.ts b/test/unit/server/util/RedirectAllHttpHandler.test.ts deleted file mode 100644 index d908c3a63..000000000 --- a/test/unit/server/util/RedirectAllHttpHandler.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { TargetExtractor } from '../../../../src/http/input/identifier/TargetExtractor'; -import type { ResponseWriter } from '../../../../src/http/output/ResponseWriter'; -import type { ResourceIdentifier } from '../../../../src/http/representation/ResourceIdentifier'; -import type { HttpRequest } from '../../../../src/server/HttpRequest'; -import type { HttpResponse } from '../../../../src/server/HttpResponse'; -import { RedirectAllHttpHandler } from '../../../../src/server/util/RedirectAllHttpHandler'; -import { NotImplementedHttpError } from '../../../../src/util/errors/NotImplementedHttpError'; -import { joinUrl } from '../../../../src/util/PathUtil'; -import { SOLID_HTTP } from '../../../../src/util/Vocabularies'; - -describe('A RedirectAllHttpHandler', (): void => { - const baseUrl = 'http://test.com/'; - const target = '/foo'; - const absoluteTarget = 'http://test.com/foo'; - let request: HttpRequest; - const response: HttpResponse = {} as any; - let targetExtractor: jest.Mocked; - let responseWriter: jest.Mocked; - let handler: RedirectAllHttpHandler; - - beforeEach(async(): Promise => { - request = { url: '/foo' } as any; - - targetExtractor = { - handleSafe: jest.fn(({ request: req }): ResourceIdentifier => ({ path: joinUrl(baseUrl, req.url!) })), - } as any; - - responseWriter = { handleSafe: jest.fn() } as any; - - handler = new RedirectAllHttpHandler({ baseUrl, target, targetExtractor, responseWriter }); - }); - - it('rejects requests for the target.', async(): Promise => { - request.url = target; - await expect(handler.canHandle({ request, response })).rejects.toThrow(NotImplementedHttpError); - }); - - it('accepts all other requests.', async(): Promise => { - request.url = '/otherPath'; - await expect(handler.canHandle({ request, response })).resolves.toBeUndefined(); - }); - - it('writes out a redirect response.', async(): Promise => { - await expect(handler.handle({ request, response })).resolves.toBeUndefined(); - expect(responseWriter.handleSafe).toHaveBeenCalledTimes(1); - expect(responseWriter.handleSafe).toHaveBeenLastCalledWith({ - response, - result: expect.objectContaining({ statusCode: 302 }), - }); - const { metadata } = responseWriter.handleSafe.mock.calls[0][0].result; - expect(metadata?.get(SOLID_HTTP.terms.location)?.value).toBe(absoluteTarget); - }); -});