)
})
+ it('decodes params keys in query', async () => {
+ const history = createHistory('/?%E2%82%AC=euro')
+ const router = new Router({ history, routes })
+ await router.doInitialNavigation()
+ expect(router.currentRoute).toEqual(
+ expect.objectContaining({
+ name: 'home',
+ fullPath: '/?' + encodeURIComponent('€') + '=euro',
+ query: {
+ '€': 'euro',
+ },
+ path: '/',
+ })
+ )
+ })
+
it('allow unencoded params in query (IE Edge)', async () => {
const spy = jest.spyOn(console, 'warn').mockImplementation(() => {})
const history = createHistory('/?q=€%notvalid')
>
</li>
<li>
- <router-link :to="{ name: 'home', query: { currency: '€uro' }}"
- >/currency=€uro (object)</router-link
+ <router-link
+ :to="{ name: 'home', query: { currency: '€uro', 'é': 'e' }}"
+ >/currency=€uro&é=e (object)</router-link
>
</li>
<li>
const searchParams = (hasLeadingIM ? search.slice(1) : search).split('&')
for (let i = 0; i < searchParams.length; ++i) {
let [key, value] = searchParams[i].split('=')
+ try {
+ key = decodeURIComponent(key)
+ } catch (err) {
+ // TODO: handling only URIError?
+ console.warn(
+ `[vue-router] error decoding query key "${value}" while parsing query. Sticking to the original key.`
+ )
+ }
try {
value = decodeURIComponent(value)
} catch (err) {
// TODO: handling only URIError?
console.warn(
- `[vue-router] error decoding "${value}" while parsing query. Sticking to the original value.`
+ `[vue-router] error decoding query value "${value}" while parsing query. Sticking to the original value.`
)
}
if (key in query) {
search += key
continue
}
+ let encodedKey: string = key
+ try {
+ encodedKey = encodeURIComponent(key)
+ } catch (err) {
+ // TODO: handling only URIError?
+ // TODO: refactor all encoded handling in a custom function
+
+ console.warn(
+ `[vue-router] invalid query parameter while stringifying query: "${key}": "${value}"`
+ )
+ }
let values: string[] = Array.isArray(value) ? value : [value]
try {
`[vue-router] invalid query parameter while stringifying query: "${key}": "${values}"`
)
}
- search += `${key}=${values[0]}`
+ search += `${encodedKey}=${values[0]}`
for (let i = 1; i < values.length; i++) {
- search += `&${key}=${values[i]}`
+ search += `&${encodedKey}=${values[i]}`
}
}