Skip to content

Commit

Permalink
backport: [i18n] Routing fix #70761 (#70976)
Browse files Browse the repository at this point in the history
Backports:
- #70761

Co-authored-by: Wyatt Johnson <accounts+github@wyattjoh.ca>
  • Loading branch information
ztanner and wyattjoh authored Oct 8, 2024
1 parent bb3f580 commit 1c8234e
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 0 deletions.
8 changes: 8 additions & 0 deletions packages/next/src/server/base-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -908,6 +908,14 @@ export default abstract class Server<ServerOptions extends Options = Options> {
req.headers['x-forwarded-proto'] ??= isHttps ? 'https' : 'http'
req.headers['x-forwarded-for'] ??= originalRequest.socket?.remoteAddress

// Validate that if i18n isn't configured or the passed parameters are not
// valid it should be removed from the query.
if (!this.i18nProvider?.validateQuery(parsedUrl.query)) {
delete parsedUrl.query.__nextLocale
delete parsedUrl.query.__nextDefaultLocale
delete parsedUrl.query.__nextInferredLocaleFromDefault
}

// This should be done before any normalization of the pathname happens as
// it captures the initial URL.
this.attachRequestMeta(req, parsedUrl)
Expand Down
31 changes: 31 additions & 0 deletions packages/next/src/server/future/helpers/i18n-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,37 @@ export class I18NProvider {
}
}

/**
* Validates that the locale is valid.
*
* @param locale The locale to validate.
* @returns `true` if the locale is valid, `false` otherwise.
*/
private validate(locale: string): boolean {
return this.lowerCaseLocales.includes(locale.toLowerCase())
}

/**
* Validates that the locales in the query object are valid.
*
* @param query The query object to validate.
* @returns `true` if the locale is valid, `false` otherwise.
*/
public validateQuery(query: NextParsedUrlQuery) {
if (query.__nextLocale && !this.validate(query.__nextLocale)) {
return false
}

if (
query.__nextDefaultLocale &&
!this.validate(query.__nextDefaultLocale)
) {
return false
}

return true
}

/**
* Analyzes the pathname for a locale and returns the pathname without it.
*
Expand Down
5 changes: 5 additions & 0 deletions packages/next/src/server/lib/router-utils/resolve-routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,11 @@ export function getResolveRoutes(
parsedUrl.pathname = maybeAddTrailingSlash(parsedUrl.pathname)
}
}
} else {
// As i18n isn't configured we remove the locale related query params.
delete parsedUrl.query.__nextLocale
delete parsedUrl.query.__nextDefaultLocale
delete parsedUrl.query.__nextInferredLocaleFromDefault
}

const checkLocaleApi = (pathname: string) => {
Expand Down

0 comments on commit 1c8234e

Please sign in to comment.