From 857eb7549a75531d64a55d7d3981e470cbd64002 Mon Sep 17 00:00:00 2001 From: Erica Pisani Date: Wed, 10 Aug 2022 15:04:31 -0400 Subject: [PATCH] feat: support custom response headers (#51) * feat: support addition of custom response headers * refactor: change logic to accomodate use of netlify custom headers Previously was planning on using environment variables within netlify.toml of project. * style: lint issues * test: commit tarball committing this in order to test in a staging environment in the context of another project --- README.md | 3 ++- example/netlify/functions/ipx.ts | 6 +++++- netlify-ipx-v1.1.4.tgz | Bin 0 -> 8090 bytes src/index.ts | 10 ++++++++++ 4 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 netlify-ipx-v1.1.4.tgz diff --git a/README.md b/README.md index 360a5a4..e8a6260 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,8 @@ remotePatterns: [ - Clone repository - Install dependencies with `yarn install` -- Install netlify development server with `yarn dev` +- Build the project with `yarn build` +- Run netlify development server with `yarn dev`. - Open http://localhost:8888 ## License diff --git a/example/netlify/functions/ipx.ts b/example/netlify/functions/ipx.ts index 4bbd94e..ff10e2c 100644 --- a/example/netlify/functions/ipx.ts +++ b/example/netlify/functions/ipx.ts @@ -10,5 +10,9 @@ export const handler = createIPXHandler({ domains: [ 'www.netlify.com' ], - basePath: '/.netlify/builders/ipx/' + basePath: '/.netlify/builders/ipx/', + responseHeaders: { + 'Strict-Transport-Security': 'max-age=31536000', + 'X-Test': 'foobar' + } }) diff --git a/netlify-ipx-v1.1.4.tgz b/netlify-ipx-v1.1.4.tgz new file mode 100644 index 0000000000000000000000000000000000000000..878bc6e8c9f67ac5f9dbb1df1400f5b857e4ece8 GIT binary patch literal 8090 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 literal 0 HcmV?d00001 diff --git a/src/index.ts b/src/index.ts index 829b09f..3391836 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,6 +12,7 @@ export interface IPXHandlerOptions extends Partial { propsEncoding?: 'base64' | undefined bypassDomainCheck?: boolean remotePatterns?: RemotePattern[] + responseHeaders?: Record } export function createIPXHandler ({ @@ -20,6 +21,7 @@ export function createIPXHandler ({ propsEncoding, bypassDomainCheck, remotePatterns, + responseHeaders, ...opts }: IPXHandlerOptions = {}) { const ipx = createIPX({ ...opts, dir: join(cacheDir, 'cache') }) @@ -98,6 +100,7 @@ export function createIPXHandler ({ } if (!domainAllowed) { + // eslint-disable-next-line no-console console.log(`URL not on allowlist. Values provided are: domains: ${JSON.stringify(domains)} remotePatterns: ${JSON.stringify(remoteURLPatterns)} @@ -143,6 +146,13 @@ export function createIPXHandler ({ message: 'Not Modified' } } + + if (responseHeaders) { + for (const [header, value] of Object.entries(responseHeaders)) { + res.headers[header] = value + } + } + return { statusCode: res.statusCode, message: res.statusMessage,