From f76b1eea0f0dd0096f76a83ff9c9376aa3e5e1f7 Mon Sep 17 00:00:00 2001 From: bluwy Date: Sun, 4 Sep 2022 18:03:44 +0800 Subject: [PATCH 1/2] fix(preview): send configured headers --- docs/config/preview-options.md | 6 ++++++ packages/vite/src/node/preview.ts | 10 +++++++++- playground/fs-serve/__tests__/fs-serve.spec.ts | 8 ++++++++ playground/fs-serve/package.json | 2 +- playground/fs-serve/root/vite.config.js | 8 ++++++++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/docs/config/preview-options.md b/docs/config/preview-options.md index 32589a5091d12b..1b8535f9f2918a 100644 --- a/docs/config/preview-options.md +++ b/docs/config/preview-options.md @@ -75,3 +75,9 @@ Uses [`http-proxy`](https://github.com/http-party/node-http-proxy). Full options - **Default:** [`server.cors`](./server-options#server-cors) Configure CORS for the preview server. This is enabled by default and allows any origin. Pass an [options object](https://github.com/expressjs/cors) to fine tune the behavior or `false` to disable. + +## server.headers + +- **Type:** `OutgoingHttpHeaders` + +Specify server response headers. diff --git a/packages/vite/src/node/preview.ts b/packages/vite/src/node/preview.ts index bebd212217d384..82640c3ff5c43c 100644 --- a/packages/vite/src/node/preview.ts +++ b/packages/vite/src/node/preview.ts @@ -111,12 +111,20 @@ export async function preview( // static assets const distDir = path.resolve(config.root, config.build.outDir) + const headers = config.preview.headers app.use( previewBase, sirv(distDir, { etag: true, dev: true, - single: config.appType === 'spa' + single: config.appType === 'spa', + setHeaders(res) { + if (headers) { + for (const name in headers) { + res.setHeader(name, headers[name]!) + } + } + } }) ) diff --git a/playground/fs-serve/__tests__/fs-serve.spec.ts b/playground/fs-serve/__tests__/fs-serve.spec.ts index 8fcb3f61125158..e3a1c912369d87 100644 --- a/playground/fs-serve/__tests__/fs-serve.spec.ts +++ b/playground/fs-serve/__tests__/fs-serve.spec.ts @@ -1,3 +1,4 @@ +import fetch from 'node-fetch' import { beforeAll, describe, expect, test } from 'vitest' import testJSON from '../safe.json' import { isServe, page, viteTestUrl } from '~utils' @@ -97,3 +98,10 @@ describe.runIf(isServe)('main', () => { expect(await page.textContent('.unsafe-dotenv')).toBe('404') }) }) + +describe('fetch', () => { + test('serve with configured headers', async () => { + const res = await fetch(viteTestUrl + '/src/') + expect(res.headers.get('x-served-by')).toBe('vite') + }) +}) diff --git a/playground/fs-serve/package.json b/playground/fs-serve/package.json index c50be06a8cb286..6a5d18e2303c53 100644 --- a/playground/fs-serve/package.json +++ b/playground/fs-serve/package.json @@ -6,6 +6,6 @@ "dev": "vite root", "build": "vite build root", "debug": "node --inspect-brk ../../packages/vite/bin/vite", - "preview": "vite preview" + "preview": "vite preview root" } } diff --git a/playground/fs-serve/root/vite.config.js b/playground/fs-serve/root/vite.config.js index 5712ad5acb3438..12d07754cbf10d 100644 --- a/playground/fs-serve/root/vite.config.js +++ b/playground/fs-serve/root/vite.config.js @@ -18,6 +18,14 @@ module.exports = { }, hmr: { overlay: false + }, + headers: { + 'x-served-by': 'vite' + } + }, + preview: { + headers: { + 'x-served-by': 'vite' } }, define: { From 204e93642e6a8d159f5859396baa309abc375fba Mon Sep 17 00:00:00 2001 From: bluwy Date: Sun, 4 Sep 2022 21:50:43 +0800 Subject: [PATCH 2/2] test: fix fail --- docs/config/preview-options.md | 2 +- playground/fs-serve/__tests__/fs-serve.spec.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/config/preview-options.md b/docs/config/preview-options.md index 1b8535f9f2918a..3604afb9576d42 100644 --- a/docs/config/preview-options.md +++ b/docs/config/preview-options.md @@ -76,7 +76,7 @@ Uses [`http-proxy`](https://github.com/http-party/node-http-proxy). Full options Configure CORS for the preview server. This is enabled by default and allows any origin. Pass an [options object](https://github.com/expressjs/cors) to fine tune the behavior or `false` to disable. -## server.headers +## preview.headers - **Type:** `OutgoingHttpHeaders` diff --git a/playground/fs-serve/__tests__/fs-serve.spec.ts b/playground/fs-serve/__tests__/fs-serve.spec.ts index e3a1c912369d87..90d35d21b04773 100644 --- a/playground/fs-serve/__tests__/fs-serve.spec.ts +++ b/playground/fs-serve/__tests__/fs-serve.spec.ts @@ -100,7 +100,8 @@ describe.runIf(isServe)('main', () => { }) describe('fetch', () => { - test('serve with configured headers', async () => { + // Note: this should pass in build too, but the test setup doesn't use Vite preview + test.runIf(isServe)('serve with configured headers', async () => { const res = await fetch(viteTestUrl + '/src/') expect(res.headers.get('x-served-by')).toBe('vite') })