diff --git a/modules/__tests__/browseDirectory-test.js b/modules/__tests__/browseDirectory-test.js index 7d64f39..220ca74 100644 --- a/modules/__tests__/browseDirectory-test.js +++ b/modules/__tests__/browseDirectory-test.js @@ -45,4 +45,16 @@ describe('A request to browse a directory', () => { }); }); }); + + describe('with invalid query params', () => { + it('strips them from the query string', done => { + request(server) + .get('/browse/react@16.8.0/umd/?invalid') + .end((err, res) => { + expect(res.statusCode).toBe(302); + expect(res.headers.location).toEqual('/browse/react@16.8.0/umd/'); + done(); + }); + }); + }); }); diff --git a/modules/__tests__/browseFile-test.js b/modules/__tests__/browseFile-test.js index b6c88cc..46c6871 100644 --- a/modules/__tests__/browseFile-test.js +++ b/modules/__tests__/browseFile-test.js @@ -31,4 +31,18 @@ describe('A request to browse a file', () => { }); }); }); + + describe('when the URL contains invalid query params', () => { + it('strips them from the URL', done => { + request(server) + .get('/browse/react@16.8.0/react.production.min.js?invalid') + .end((err, res) => { + expect(res.statusCode).toBe(302); + expect(res.headers.location).toBe( + '/browse/react@16.8.0/react.production.min.js' + ); + done(); + }); + }); + }); }); diff --git a/modules/createServer.js b/modules/createServer.js index 30d67d2..ed68165 100644 --- a/modules/createServer.js +++ b/modules/createServer.js @@ -12,6 +12,7 @@ import serveModule from './actions/serveModule.js'; import serveStats from './actions/serveStats.js'; import findEntry from './middleware/findEntry.js'; +import noQuery from './middleware/noQuery.js'; import redirectLegacyURLs from './middleware/redirectLegacyURLs.js'; import requestLog from './middleware/requestLog.js'; import staticFiles from './middleware/staticFiles.js'; @@ -60,18 +61,18 @@ export default function createServer() { app.get( '*/', + noQuery(), validatePackageURL, validatePackageName, - validateQuery, validateVersion, serveDirectoryBrowser ); app.get( '*', + noQuery(), validatePackageURL, validatePackageName, - validateQuery, validateVersion, serveFileBrowser ); diff --git a/modules/middleware/noQuery.js b/modules/middleware/noQuery.js new file mode 100644 index 0000000..f5bd8fe --- /dev/null +++ b/modules/middleware/noQuery.js @@ -0,0 +1,14 @@ +/** + * Strips all query params from the URL to increase cache hit rates. + */ +export default function noQuery() { + return (req, res, next) => { + const keys = Object.keys(req.query); + + if (keys.length) { + return res.redirect(302, req.baseUrl + req.path); + } + + next(); + }; +}