Skip to content

Commit

Permalink
Fix(node): Custom headers are not present in responses from standalon…
Browse files Browse the repository at this point in the history
…e Node server in preview mode (#10208)

* fix(node): add user specified headers to preview server responses

* docs: clarify comment

* style: new line

* test: remove test

* chore: add changeset
  • Loading branch information
log101 committed Feb 23, 2024
1 parent f85ace2 commit 8cd38f0
Show file tree
Hide file tree
Showing 8 changed files with 163 additions and 0 deletions.
6 changes: 6 additions & 0 deletions .changeset/spotty-dryers-hear.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@astrojs/node": patch
"astro": patch
---

Fixes custom headers are not added to the Node standalone server responses in preview mode
1 change: 1 addition & 0 deletions packages/astro/src/@types/astro.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2748,6 +2748,7 @@ export interface PreviewServerParams {
port: number;
base: string;
logger: AstroIntegrationLogger;
headers?: OutgoingHttpHeaders;
}

export type CreatePreviewServer = (
Expand Down
1 change: 1 addition & 0 deletions packages/astro/src/core/preview/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ export default async function preview(inlineConfig: AstroInlineConfig): Promise<
port: settings.config.server.port,
base: settings.config.base,
logger: new AstroIntegrationLogger(logger.options, settings.adapter.name),
headers: settings.config.server.headers,
});

return server;
Expand Down
13 changes: 13 additions & 0 deletions packages/integrations/node/src/preview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,19 @@ const createPreviewServer: CreatePreviewServer = async function (preview) {
const host = preview.host ?? 'localhost';
const port = preview.port ?? 4321;
const server = createServer(ssrHandler, host, port);

// If user specified custom headers append a listener
// to the server to add those headers to response
if (preview.headers) {
server.server.addListener('request', (_, res) => {
if (res.statusCode === 200) {
for (const [name, value] of Object.entries(preview.headers ?? {})) {
if (value) res.setHeader(name, value);
}
}
});
}

logListeningOn(preview.logger, server.server, options);
await new Promise<void>((resolve, reject) => {
server.server.once('listening', resolve);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "@test/nodejs-preview-headers",
"version": "0.0.0",
"private": true,
"dependencies": {
"astro": "workspace:*",
"@astrojs/node": "workspace:*"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Hello!
38 changes: 38 additions & 0 deletions packages/integrations/node/test/preview-headers.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import * as assert from 'node:assert/strict';
import { after, before, describe, it } from 'node:test';
import nodejs from '../dist/index.js';
import { loadFixture } from './test-utils.js';

describe('Astro preview headers', () => {
/** @type {import('./test-utils').Fixture} */
let fixture;
let devPreview;
const headers = {
astro: 'test',
};

before(async () => {
fixture = await loadFixture({
root: './fixtures/preview-headers/',
output: 'server',
adapter: nodejs({ mode: 'standalone' }),
server: {
headers
},
});
await fixture.build();
devPreview = await fixture.preview();
});

after(async () => {
await devPreview.stop();
});

describe('Preview Headers', () => {
it('returns custom headers for valid URLs', async () => {
const result = await fixture.fetch('/');
assert.equal(result.status, 200);
assert.equal(Object.fromEntries(result.headers).astro, headers.astro);
});
});
});
94 changes: 94 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 8cd38f0

Please sign in to comment.