Updated the Localized HTML Collection response in the Infrastructure package to make Vary: Accept-Language opt-in for localized responses.

This commit is contained in:
2026-09-04 14:39:43 +02:00
parent f0086ee461
commit 0b3ef2890e
4 changed files with 27 additions and 11 deletions
@@ -9,9 +9,11 @@ import Localization
/// `Accept-Language` header, negotiates the best supported match (falling back to the default language), and stores it on the context's
/// ``LocalizedRequestContext/language``.
///
/// The query parameter is the deliberate override a language switcher links to; failing that, a leading path segment naming a supported language
/// pins it, so an unrouted path under a language's prefix its not-found page answers in that language. Values naming no supported language
/// are ignored, leaving the header. The request is passed through untouched the path and routing are unaffected.
/// The query parameter is a deliberate override; failing that, a leading path segment naming a supported language pins it, so an unrouted path under
/// a language's prefix its not-found page answers in that language. Values naming no supported language are ignored, leaving the header. The
/// request is passed through untouched the path and routing are unaffected.
///
/// A site whose page routes pin their language by URL consults this only for responses that belong to no URL in practice, its not-found page.
public struct LocalizationMiddleware<Context: LocalizedRequestContext> {
// MARK: Properties
@@ -7,6 +7,9 @@ import Hummingbird
/// Placed ahead of `FileMiddleware` in the middleware chain, it catches the `.notFound` error that bubbles up when no file exists for the requested
/// path and responds with the rendered error page and a `404 Not Found` status. The page is served in the language stored on the context by
/// ``LocalizationMiddleware``, falling back to the default language.
///
/// Its responses declare `Vary: Accept-Language`: where the page routes pin their language by URL, this is the one responder that negotiates.
/// An unrouted path names no edition, so no canonical URL contradicts the header.
public struct NotFoundMiddleware<Context: LocalizedRequestContext> {
// MARK: Properties
@@ -27,6 +30,7 @@ public struct NotFoundMiddleware<Context: LocalizedRequestContext> {
self.responses = .init(
bundle: bundle,
status: .notFound,
variesOnAcceptLanguage: true,
document: document
)
}