summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/old-goats-occur.md5
-rw-r--r--packages/astro/src/core/routing/params.ts4
-rw-r--r--packages/astro/src/vite-plugin-astro-server/request.ts2
-rw-r--r--packages/astro/test/ssr-params.test.js10
4 files changed, 18 insertions, 3 deletions
diff --git a/.changeset/old-goats-occur.md b/.changeset/old-goats-occur.md
new file mode 100644
index 000000000..8224bbabb
--- /dev/null
+++ b/.changeset/old-goats-occur.md
@@ -0,0 +1,5 @@
+---
+'astro': patch
+---
+
+Prevents unnecessary URI decoding when rendering a route
diff --git a/packages/astro/src/core/routing/params.ts b/packages/astro/src/core/routing/params.ts
index 987528d57..973f7f2b5 100644
--- a/packages/astro/src/core/routing/params.ts
+++ b/packages/astro/src/core/routing/params.ts
@@ -12,9 +12,9 @@ export function getParams(array: string[]) {
const params: Params = {};
array.forEach((key, i) => {
if (key.startsWith('...')) {
- params[key.slice(3)] = match[i + 1] ? decodeURIComponent(match[i + 1]) : undefined;
+ params[key.slice(3)] = match[i + 1] ? match[i + 1] : undefined;
} else {
- params[key] = decodeURIComponent(match[i + 1]);
+ params[key] = match[i + 1];
}
});
return params;
diff --git a/packages/astro/src/vite-plugin-astro-server/request.ts b/packages/astro/src/vite-plugin-astro-server/request.ts
index 5dd507c75..29ceafa0c 100644
--- a/packages/astro/src/vite-plugin-astro-server/request.ts
+++ b/packages/astro/src/vite-plugin-astro-server/request.ts
@@ -37,7 +37,7 @@ export async function handleRequest({
if (config.trailingSlash === 'never' && !incomingRequest.url) {
pathname = '';
} else {
- pathname = decodeURI(url.pathname);
+ pathname = url.pathname;
}
// Add config.base back to url before passing it to SSR
diff --git a/packages/astro/test/ssr-params.test.js b/packages/astro/test/ssr-params.test.js
index 343e47cf8..b15955a9f 100644
--- a/packages/astro/test/ssr-params.test.js
+++ b/packages/astro/test/ssr-params.test.js
@@ -38,4 +38,14 @@ describe('Astro.params in SSR', () => {
expect($('.category').text()).to.equal('food');
});
});
+
+ it('No double URL decoding', async () => {
+ const app = await fixture.loadTestAdapterApp();
+ const request = new Request('http://example.com/users/houston/%25');
+ const response = await app.render(request);
+ expect(response.status).to.equal(200);
+ const html = await response.text();
+ const $ = cheerio.load(html);
+ expect($('.category').text()).to.equal('%');
+ });
});