diff options
author | 2022-06-15 19:49:09 +0000 | |
---|---|---|
committer | 2022-06-15 19:49:09 +0000 | |
commit | 0ddcef2043e3c2f65aaeec7a969c374c053e22f3 (patch) | |
tree | 627b580dd88d3ae1ad55602c7a57081c4f34a56a /packages/integrations/netlify/src/netlify-functions.ts | |
parent | 8ed924d2ed21a6e2e6df9345b7315d05da866b54 (diff) | |
download | astro-0ddcef2043e3c2f65aaeec7a969c374c053e22f3.tar.gz astro-0ddcef2043e3c2f65aaeec7a969c374c053e22f3.tar.zst astro-0ddcef2043e3c2f65aaeec7a969c374c053e22f3.zip |
Adds support base64 encoding in Netlify Functions (#3592)
* Adding support for base64 encoded responses in Netlify Functions
* chore: add changeset
* removing the regex check for a more simple header-based check
* nit: cleaning up the readme a bit
Diffstat (limited to 'packages/integrations/netlify/src/netlify-functions.ts')
-rw-r--r-- | packages/integrations/netlify/src/netlify-functions.ts | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/packages/integrations/netlify/src/netlify-functions.ts b/packages/integrations/netlify/src/netlify-functions.ts index 66e5271f5..f8b3ab21b 100644 --- a/packages/integrations/netlify/src/netlify-functions.ts +++ b/packages/integrations/netlify/src/netlify-functions.ts @@ -7,11 +7,49 @@ polyfill(globalThis, { exclude: 'window document', }); -interface Args {} +export interface Args { + binaryMediaTypes?: string[]; +} + +function parseContentType(header?: string) { + return header?.split(';')[0] ?? ''; +} export const createExports = (manifest: SSRManifest, args: Args) => { const app = new App(manifest); + const binaryMediaTypes = args.binaryMediaTypes ?? []; + const knownBinaryMediaTypes = new Set([ + 'audio/3gpp', + 'audio/3gpp2', + 'audio/aac', + 'audio/midi', + 'audio/mpeg', + 'audio/ogg', + 'audio/opus', + 'audio/wav', + 'audio/webm', + 'audio/x-midi', + 'image/avif', + 'image/bmp', + 'image/gif', + 'image/vnd.microsoft.icon', + 'image/jpeg', + 'image/png', + 'image/svg+xml', + 'image/tiff', + 'image/webp', + 'video/3gpp', + 'video/3gpp2', + 'video/mp2t', + 'video/mp4', + 'video/mpeg', + 'video/ogg', + 'video/x-msvideo', + 'video/webm', + ...binaryMediaTypes, + ]); + const handler: Handler = async (event) => { const { httpMethod, headers, rawUrl, body: requestBody, isBase64Encoded } = event; const init: RequestInit = { @@ -34,13 +72,20 @@ export const createExports = (manifest: SSRManifest, args: Args) => { } const response: Response = await app.render(request); - const responseBody = await response.text(); - const responseHeaders = Object.fromEntries(response.headers.entries()); + + const responseContentType = parseContentType(responseHeaders['content-type']); + const responseIsBase64Encoded = knownBinaryMediaTypes.has(responseContentType); + + const responseBody = responseIsBase64Encoded + ? Buffer.from(await response.text(), 'binary').toString('base64') + : await response.text(); + const fnResponse: any = { statusCode: response.status, headers: responseHeaders, body: responseBody, + isBase64Encoded: responseIsBase64Encoded, }; // Special-case set-cookie which has to be set an different way :/ |