diff options
Diffstat (limited to 'packages/integrations/node/src')
-rw-r--r-- | packages/integrations/node/src/createOutgoingHttpHeaders.ts | 48 | ||||
-rw-r--r-- | packages/integrations/node/src/http-server.ts | 4 | ||||
-rw-r--r-- | packages/integrations/node/src/nodeMiddleware.ts | 14 |
3 files changed, 34 insertions, 32 deletions
diff --git a/packages/integrations/node/src/createOutgoingHttpHeaders.ts b/packages/integrations/node/src/createOutgoingHttpHeaders.ts index 5b99cfa4f..80269489e 100644 --- a/packages/integrations/node/src/createOutgoingHttpHeaders.ts +++ b/packages/integrations/node/src/createOutgoingHttpHeaders.ts @@ -3,38 +3,40 @@ import type { OutgoingHttpHeaders } from 'http'; /** * Takes in a nullable WebAPI Headers object and produces a NodeJS OutgoingHttpHeaders object suitable for usage * with ServerResponse.writeHead(..) or ServerResponse.setHeader(..) - * + * * @param webHeaders WebAPI Headers object * @returns NodeJS OutgoingHttpHeaders object with multiple set-cookie handled as an array of values */ -export const createOutgoingHttpHeaders = (webHeaders: Headers | undefined | null): OutgoingHttpHeaders | undefined => { - if (!webHeaders) { - return undefined; - } +export const createOutgoingHttpHeaders = ( + webHeaders: Headers | undefined | null +): OutgoingHttpHeaders | undefined => { + if (!webHeaders) { + return undefined; + } - // re-type to access Header.getSetCookie() - const headers = webHeaders as HeadersWithGetSetCookie; + // re-type to access Header.getSetCookie() + const headers = webHeaders as HeadersWithGetSetCookie; - // at this point, a multi-value'd set-cookie header is invalid (it was concatenated as a single CSV, which is not valid for set-cookie) - const nodeHeaders: OutgoingHttpHeaders = Object.fromEntries(headers.entries()); + // at this point, a multi-value'd set-cookie header is invalid (it was concatenated as a single CSV, which is not valid for set-cookie) + const nodeHeaders: OutgoingHttpHeaders = Object.fromEntries(headers.entries()); - if (Object.keys(nodeHeaders).length === 0) { - return undefined; - } + if (Object.keys(nodeHeaders).length === 0) { + return undefined; + } - // if there is > 1 set-cookie header, we have to fix it to be an array of values - if (headers.has('set-cookie')) { - const cookieHeaders = headers.getSetCookie(); - if (cookieHeaders.length > 1) { - // the Headers.entries() API already normalized all header names to lower case so we can safely index this as 'set-cookie' - nodeHeaders['set-cookie'] = cookieHeaders; - } - } + // if there is > 1 set-cookie header, we have to fix it to be an array of values + if (headers.has('set-cookie')) { + const cookieHeaders = headers.getSetCookie(); + if (cookieHeaders.length > 1) { + // the Headers.entries() API already normalized all header names to lower case so we can safely index this as 'set-cookie' + nodeHeaders['set-cookie'] = cookieHeaders; + } + } - return nodeHeaders; + return nodeHeaders; }; interface HeadersWithGetSetCookie extends Headers { - // the @astrojs/webapi polyfill makes this available (as of undici@5.19.0), but tsc doesn't pick it up on the built-in Headers type from DOM lib - getSetCookie(): string[]; + // the @astrojs/webapi polyfill makes this available (as of undici@5.19.0), but tsc doesn't pick it up on the built-in Headers type from DOM lib + getSetCookie(): string[]; } diff --git a/packages/integrations/node/src/http-server.ts b/packages/integrations/node/src/http-server.ts index 9f8b3e891..8d463ba6f 100644 --- a/packages/integrations/node/src/http-server.ts +++ b/packages/integrations/node/src/http-server.ts @@ -60,9 +60,9 @@ export function createServer( let location: string; if (req.url!.includes('?')) { const [url = '', search] = req.url!.split('?'); - location = `${url}/?${search}` + location = `${url}/?${search}`; } else { - location = req.url + '/' + location = req.url + '/'; } res.statusCode = 301; diff --git a/packages/integrations/node/src/nodeMiddleware.ts b/packages/integrations/node/src/nodeMiddleware.ts index 492130daa..c0d439ba0 100644 --- a/packages/integrations/node/src/nodeMiddleware.ts +++ b/packages/integrations/node/src/nodeMiddleware.ts @@ -1,9 +1,9 @@ import type { NodeApp } from 'astro/app/node'; import type { IncomingMessage, ServerResponse } from 'http'; import type { Readable } from 'stream'; +import { createOutgoingHttpHeaders } from './createOutgoingHttpHeaders'; import { responseIterator } from './response-iterator'; import type { Options } from './types'; -import { createOutgoingHttpHeaders } from './createOutgoingHttpHeaders'; export default function (app: NodeApp, mode: Options['mode']) { return async function ( @@ -45,16 +45,16 @@ async function writeWebResponse(app: NodeApp, res: ServerResponse, webResponse: if (app.setCookieHeaders) { const setCookieHeaders: Array<string> = Array.from(app.setCookieHeaders(webResponse)); - + if (setCookieHeaders.length) { - for (const setCookieHeader of setCookieHeaders) { - webResponse.headers.append('set-cookie', setCookieHeader); - } + for (const setCookieHeader of setCookieHeaders) { + webResponse.headers.append('set-cookie', setCookieHeader); + } } } - const nodeHeaders = createOutgoingHttpHeaders(headers); - res.writeHead(status, nodeHeaders); + const nodeHeaders = createOutgoingHttpHeaders(headers); + res.writeHead(status, nodeHeaders); if (webResponse.body) { try { for await (const chunk of responseIterator(webResponse) as unknown as Readable) { |