summaryrefslogtreecommitdiff
path: root/packages/integrations/netlify/src/netlify-functions.ts
diff options
context:
space:
mode:
authorGravatar Tony Sullivan <tony.f.sullivan@outlook.com> 2022-06-15 19:49:09 +0000
committerGravatar GitHub <noreply@github.com> 2022-06-15 19:49:09 +0000
commit0ddcef2043e3c2f65aaeec7a969c374c053e22f3 (patch)
tree627b580dd88d3ae1ad55602c7a57081c4f34a56a /packages/integrations/netlify/src/netlify-functions.ts
parent8ed924d2ed21a6e2e6df9345b7315d05da866b54 (diff)
downloadastro-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.ts51
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 :/