diff --git a/app/port/controller/PackageVersionFileController.ts b/app/port/controller/PackageVersionFileController.ts index bd04b176..000a6277 100644 --- a/app/port/controller/PackageVersionFileController.ts +++ b/app/port/controller/PackageVersionFileController.ts @@ -169,7 +169,8 @@ export class PackageVersionFileController extends AbstractController { } if (packageVersion.version !== versionOrTag) { ctx.set('cache-control', META_CACHE_CONTROL); - const location = ctx.url.replace(`/${fullname}/${versionOrTag}/files`, `/${fullname}/${packageVersion.version}/files`); + let location = ctx.url.replace(`/${fullname}/${versionOrTag}/files`, `/${fullname}/${packageVersion.version}/files`); + location = location.replace(`/${fullname}/${encodeURIComponent(versionOrTag)}/files`, `/${fullname}/${packageVersion.version}/files`); throw this.createControllerRedirectError(location); } return packageVersion; diff --git a/test/port/controller/PackageVersionFileController/listFiles.test.ts b/test/port/controller/PackageVersionFileController/listFiles.test.ts index 02c4c991..8b143871 100644 --- a/test/port/controller/PackageVersionFileController/listFiles.test.ts +++ b/test/port/controller/PackageVersionFileController/listFiles.test.ts @@ -157,6 +157,19 @@ describe('test/port/controller/PackageVersionFileController/listFiles.test.ts', assert.equal(res.headers.location, `/${pkg.name}/1.0.0/files`); assert.equal(res.headers['cache-control'], 'public, s-maxage=600, max-age=60'); assert.equal(res.headers.vary, 'Origin, Accept, Accept-Encoding'); + res = await app.httpRequest() + .get(`/${pkg.name}/^1.0.0/files`); + assert.equal(res.status, 302); + assert.equal(res.headers.location, `/${pkg.name}/1.0.0/files`); + assert.equal(res.headers['cache-control'], 'public, s-maxage=600, max-age=60'); + assert.equal(res.headers.vary, 'Origin, Accept, Accept-Encoding'); + res = await app.httpRequest() + .get(`/${pkg.name}/%5E1.0.0/files`); + assert.equal(res.status, 302); + assert.equal(res.headers.location, `/${pkg.name}/1.0.0/files`); + assert.equal(res.headers['cache-control'], 'public, s-maxage=600, max-age=60'); + assert.equal(res.headers.vary, 'Origin, Accept, Accept-Encoding'); + res = await app.httpRequest() .get(`/${pkg.name}/latest/files?meta&foo=bar`); assert.equal(res.status, 302); diff --git a/test/port/controller/PackageVersionFileController/raw.test.ts b/test/port/controller/PackageVersionFileController/raw.test.ts index a5aaf222..ae1fffc3 100644 --- a/test/port/controller/PackageVersionFileController/raw.test.ts +++ b/test/port/controller/PackageVersionFileController/raw.test.ts @@ -70,6 +70,20 @@ describe('test/port/controller/PackageVersionFileController/raw.test.ts', () => assert.equal(res.headers.location, `/${pkg.name}/1.0.0/files/package.json`); assert.equal(res.headers['cache-control'], 'public, s-maxage=600, max-age=60'); assert.equal(res.headers.vary, 'Origin, Accept, Accept-Encoding'); + + res = await app.httpRequest() + .get(`/${pkg.name}/^1.0.0/files/package.json`); + assert.equal(res.status, 302); + assert.equal(res.headers.location, `/${pkg.name}/1.0.0/files/package.json`); + assert.equal(res.headers['cache-control'], 'public, s-maxage=600, max-age=60'); + assert.equal(res.headers.vary, 'Origin, Accept, Accept-Encoding'); + + res = await app.httpRequest() + .get(`/${pkg.name}/%5E1.0.0/files/package.json`); + assert.equal(res.status, 302); + assert.equal(res.headers.location, `/${pkg.name}/1.0.0/files/package.json`); + assert.equal(res.headers['cache-control'], 'public, s-maxage=600, max-age=60'); + assert.equal(res.headers.vary, 'Origin, Accept, Accept-Encoding'); }); it('should show one package version file meta', async () => { diff --git a/test/port/controller/package/ShowPackageVersionController.test.ts b/test/port/controller/package/ShowPackageVersionController.test.ts index 916e8a9a..70e8620e 100644 --- a/test/port/controller/package/ShowPackageVersionController.test.ts +++ b/test/port/controller/package/ShowPackageVersionController.test.ts @@ -198,6 +198,16 @@ describe('test/port/controller/package/ShowPackageVersionController.test.ts', () .expect(200); assert.equal(res.body.version, '2.0.0'); + res = await app.httpRequest() + .get(`/${pkg.name}/^2.0.0`) + .expect(200); + assert.equal(res.body.version, '2.0.0'); + + res = await app.httpRequest() + .get(`/${pkg.name}/%5E2.0.0`) + .expect(200); + assert.equal(res.body.version, '2.0.0'); + // new beta tag res = await app.httpRequest() .put(`/-/package/${pkg.name}/dist-tags/beta`)