Skip to content

Commit

Permalink
fix: gracefully handle favicon.ico 404 requests
Browse files Browse the repository at this point in the history
  • Loading branch information
brillout committed Sep 4, 2024
1 parent 6f5d5b1 commit ff39218
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 9 deletions.
20 changes: 11 additions & 9 deletions vike/node/runtime/renderPage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import {
import { getGlobalContext, initGlobalContext_renderPage } from './globalContext.js'
import { handlePageContextRequestUrl } from './renderPage/handlePageContextRequestUrl.js'
import {
createHttpResponseFavicon404,
createHttpResponseObjectRedirect,
createHttpResponsePageContextJson,
HttpResponse
Expand Down Expand Up @@ -94,12 +95,7 @@ async function renderPage<
assertIsUrl(pageContextInit.urlOriginal)
const urlPathnameWithBase = parseUrl(pageContextInit.urlOriginal, '/').pathname
assertIsNotViteRequest(urlPathnameWithBase, pageContextInit.urlOriginal)

if (isIgnoredUrl(pageContextInit.urlOriginal)) {
const pageContextHttpResponseNull = getPageContextHttpResponseNull(pageContextInit)
checkType<PageContextAfterRender>(pageContextHttpResponseNull)
return pageContextHttpResponseNull as any
}
if (urlPathnameWithBase.endsWith('/favicon.ico')) return getPageContextHttpResponseFavicon404(pageContextInit) as any

const httpRequestId = getRequestId()
const urlOriginalPretty = getUrlPretty(pageContextInit.urlOriginal)
Expand Down Expand Up @@ -376,6 +372,15 @@ function getPageContextHttpResponseNull(pageContextInit: Record<string, unknown>
})
return pageContextHttpResponseNull
}
function getPageContextHttpResponseFavicon404(pageContextInit: Record<string, unknown>): PageContextAfterRender {
const pageContext = createPageContext(pageContextInit)
const httpResponse = createHttpResponseFavicon404()
objectAssign(pageContext, {
httpResponse
})
checkType<PageContextAfterRender>(pageContext)
return pageContext
}

function createPageContext(pageContextInit: Record<string, unknown>) {
const pageContext = {
Expand Down Expand Up @@ -475,9 +480,6 @@ function getRequestId(): number {
return httpRequestId
}

function isIgnoredUrl(urlOriginal: string): boolean {
return urlOriginal.endsWith('/favicon.ico')
}
function assertIsUrl(urlOriginal: string) {
assertUsage(
isUrl(urlOriginal),
Expand Down
11 changes: 11 additions & 0 deletions vike/node/runtime/renderPage/createHttpResponseObject.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export { createHttpResponseObject }
export { createHttpResponsePageContextJson }
export { createHttpResponseObjectRedirect }
export { createHttpResponseFavicon404 }
export type { HttpResponse }

import type { GetPageAssets } from './getPageAssets.js'
Expand Down Expand Up @@ -72,6 +73,16 @@ async function createHttpResponseObject(
return getHttpResponse(statusCode, 'text/html;charset=utf-8', headers, htmlRender, earlyHints, renderHook)
}

function createHttpResponseFavicon404(): HttpResponse {
const httpResponse = getHttpResponse(
404,
'text/html;charset=utf-8',
[],
`<p>No favicon.ico found.</p><script>console.log('This HTTP response was generated by Vike.')</script>`
)
return httpResponse
}

async function createHttpResponsePageContextJson(pageContextSerialized: string) {
const httpResponse = getHttpResponse(200, 'application/json', [], pageContextSerialized, [], null)
return httpResponse
Expand Down

0 comments on commit ff39218

Please sign in to comment.