From d6c0f89cf5c7ac2d0e3fdcd32a04d133f6cbb350 Mon Sep 17 00:00:00 2001 From: Ruben Verborgh Date: Sun, 29 Nov 2020 23:35:51 +0100 Subject: [PATCH] feat: Make HeaderHandler customizable. --- config/presets/middleware.json | 8 ++++++- src/server/middleware/HeaderHandler.ts | 8 +++---- .../server/middleware/HeaderHandler.test.ts | 24 ++++++++++++------- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/config/presets/middleware.json b/config/presets/middleware.json index 8fd11d958..34efcd5ff 100644 --- a/config/presets/middleware.json +++ b/config/presets/middleware.json @@ -9,7 +9,13 @@ "@type": "CorsHandler" }, { - "@type": "HeaderHandler" + "@type": "HeaderHandler", + "HeaderHandler:_headers": [ + { + "HeaderHandler:_headers_key": "X-Powered-By", + "HeaderHandler:_headers_value": "Community Solid Server" + } + ] } ] } diff --git a/src/server/middleware/HeaderHandler.ts b/src/server/middleware/HeaderHandler.ts index 33ce334b8..f41ced109 100644 --- a/src/server/middleware/HeaderHandler.ts +++ b/src/server/middleware/HeaderHandler.ts @@ -7,11 +7,11 @@ import type { HttpResponse } from '../HttpResponse'; export class HeaderHandler extends HttpHandler { private readonly headers: Record; - public constructor() { + // Not supported by Components.js yet + // eslint-disable-next-line @typescript-eslint/consistent-indexed-object-style + public constructor(headers: { [header: string]: string } = {}) { super(); - this.headers = { - 'x-powered-by': 'Community Solid Server', - }; + this.headers = { ...headers }; } public async handle({ response }: { response: HttpResponse }): Promise { diff --git a/test/unit/server/middleware/HeaderHandler.test.ts b/test/unit/server/middleware/HeaderHandler.test.ts index 6ab777aab..582cc9a9f 100644 --- a/test/unit/server/middleware/HeaderHandler.test.ts +++ b/test/unit/server/middleware/HeaderHandler.test.ts @@ -3,18 +3,24 @@ import { HeaderHandler } from '../../../../src/server/middleware/HeaderHandler'; import { guardStream } from '../../../../src/util/GuardedStream'; describe('a HeaderHandler', (): void => { - let handler: HeaderHandler; + it('adds no headers when none are configured.', async(): Promise => { + const handler = new HeaderHandler(); - beforeAll(async(): Promise => { - handler = new HeaderHandler(); - }); - - it('returns an X-Powered-By header.', async(): Promise => { const request = guardStream(createRequest()); const response = createResponse(); await handler.handleSafe({ request, response }); - expect(response.getHeaders()).toEqual(expect.objectContaining({ - 'x-powered-by': 'Community Solid Server', - })); + + expect(response.getHeaders()).toEqual({}); + }); + + it('adds all configured headers.', async(): Promise => { + const headers = { custom: 'Custom', other: 'Other' }; + const handler = new HeaderHandler(headers); + + const request = guardStream(createRequest()); + const response = createResponse(); + await handler.handleSafe({ request, response }); + + expect(response.getHeaders()).toEqual(expect.objectContaining(headers)); }); });