Skip to content

Commit

Permalink
fix(@angular/build): support HTTP HEAD requests for virtual output files
Browse files Browse the repository at this point in the history
When using the development server, HTTP HEAD requests will now correctly
respond for the virtual output files generated from the Angular build
system.  Previously Vite only handled GET requests for the files. While
HEAD requests are not common in development workflows, it can be needed in
more complex cases with additional servers/proxies/etc. during development.
  • Loading branch information
clydin committed Sep 18, 2024
1 parent 33e6cb0 commit f6b7cd9
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@ export function createAngularAssetsMiddleware(
return;
}

// Support HTTP HEAD requests for the virtual output files from the Angular build
if (req.method === 'HEAD' && outputFiles.get(pathname)?.servable) {
// While a GET will also generate content, the rest of the response is equivalent
req.method = 'GET';
}

// Resource files are handled directly.
// Global stylesheets (CSS files) are currently considered resources to workaround
// dev server sourcemap issues with stylesheets.
Expand Down
25 changes: 25 additions & 0 deletions tests/legacy-cli/e2e/tests/commands/serve/head-request.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { ngServe } from '../../../utils/project';

export default async function () {
const port = await ngServe();
// HTML
await checkHeadForUrl(`http://localhost:${port}/index.html`);
// Generated JS
await checkHeadForUrl(`http://localhost:${port}/main.js`);
// Generated CSS
await checkHeadForUrl(`http://localhost:${port}/styles.css`);
// Configured asset
await checkHeadForUrl(`http://localhost:${port}/favicon.ico`);
}

async function checkHeadForUrl(url: string): Promise<void> {
const result = await fetch(url, { method: 'HEAD' });
const content = await result.blob();

if (content.size !== 0) {
throw new Error(`Expected "size" to be "0" but got "${content.size}".`);
}
if (result.status !== 200) {
throw new Error(`Expected "status" to be "200" but got "${result.status}".`);
}
}

0 comments on commit f6b7cd9

Please sign in to comment.