import { polyfill } from '@astrojs/webapi'; import type { Handler } from '@netlify/functions'; import { SSRManifest } from 'astro'; import { App } from 'astro/app'; polyfill(globalThis, { exclude: 'window document', }); 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 = { method: httpMethod, headers: new Headers(headers as any), }; // Attach the event body the the request, with proper encoding. if (httpMethod !== 'GET' && httpMethod !== 'HEAD') { const encoding = isBase64Encoded ? 'base64' : 'utf-8'; init.body = typeof requestBody === 'string' ? Buffer.from(requestBody, encoding) : requestBody; } const request = new Request(rawUrl, init); if (!app.match(request)) { return { statusCode: 404, body: 'Not found', }; } const response: Response = await app.render(request); 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 :/ // The fetch API does not have a way to get multiples of a single header, but instead concatenates // them. There are non-standard ways to do it, and node-fetch gives us headers.raw() // See https://github.com/whatwg/fetch/issues/973 for discussion if (response.headers.has('set-cookie') && 'raw' in response.headers) { // Node fetch allows you to get the raw headers, which includes multiples of the same type. // This is needed because Set-Cookie *must* be called for each cookie, and can't be // concatenated together. type HeadersWithRaw = Headers & { raw: () => Record; }; const rawPacked = (response.headers as HeadersWithRaw).raw(); if ('set-cookie' in rawPacked) { fnResponse.multiValueHeaders = { 'set-cookie': rawPacked['set-cookie'], }; } } return fnResponse; }; return { handler }; }; site-requirement Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
path: root/packages/astro/test/units (unfollow)
AgeCommit message (Expand)AuthorFilesLines
2024-11-15prevents access to the history state if not set (#12436)Gravatar Martin Trapp 2-1/+6
2024-11-14chore: breakdown of benchmarks (#12433)Gravatar Emanuele Stoppa 2-34/+46
2024-11-14Update to svelte 5 (#12364)Gravatar Jacob Jenkins 77-636/+459
2024-11-14fix(actions): internal symbol check (#12424)Gravatar Emanuele Stoppa 4-3/+13
2024-11-14[ci] formatGravatar Arpan Patel 1-6/+2
2024-11-14Fix script injection during build (#12392)Gravatar Arpan Patel 5-37/+48
2024-11-13[ci] release (beta) (#12405)astro@5.0.0-beta.8Gravatar Houston (Bot) 29-54/+125
2024-11-13[ci] release (#12422)astro@4.16.12Gravatar Houston (Bot) 28-54/+55
2024-11-13fix(routing): middleware in dev (#12420)Gravatar Emanuele Stoppa 6-9/+52
2024-11-12[ci] release (#12403)astro@4.16.11Gravatar Houston (Bot) 30-73/+68
2024-11-11fix(routing): emit error for forbidden rewrite (#12339)Gravatar Emanuele Stoppa 7-0/+88
2024-11-11[ci] formatGravatar Sarah Rainsberger 1-38/+38
2024-11-11update markdown config docs (#12382)Gravatar Sarah Rainsberger 1-4/+45
2024-11-08Actions middleware (#12373)Gravatar Ben Holmes 26-311/+483
2024-11-08Fix incorrect status code in dev server for action errors (#12401)Gravatar Ben Holmes 2-13/+21
2024-11-08fix(actions): better runtime check for invalid usages (#12402)Gravatar Emanuele Stoppa 8-5/+47
2024-11-08fix: error overlay message escape (#12305)Gravatar Florian Lefebvre 3-0/+28
2024-11-06[ci] release (beta) (#12370)create-astro@4.11.0-beta.0astro@5.0.0-beta.7@astrojs/svelte@6.0.0-beta.2Gravatar Houston (Bot) 31-55/+84
2024-11-06Add svelte changesetGravatar bluwy 5-39/+51
2024-11-06[ci] release (#12369)astro@4.16.10@astrojs/svelte@5.7.3Gravatar Houston (Bot) 34-81/+74
2024-11-06Update to Vite 6.0.0-beta.6 (#12323)Gravatar Bjorn Lu 15-100/+123
2024-11-06[ci] formatGravatar Bjorn Lu 2-18/+17
2024-11-06Add support for Svelte 5 @render syntax (#12390)Gravatar Bjorn Lu 3-0/+30
2024-11-06fix(deps): update all non-major dependencies (#12366)Gravatar renovate[bot] 29-533/+552