Redirect requests with invalid query params to cache
This commit is contained in:
parent
ff75d8b7d6
commit
e86421240d
|
@ -1,6 +1,32 @@
|
||||||
|
const qs = require('querystring')
|
||||||
const validateNPMPackageName = require('validate-npm-package-name')
|
const validateNPMPackageName = require('validate-npm-package-name')
|
||||||
const PackageURL = require('../PackageURL')
|
const PackageURL = require('../PackageURL')
|
||||||
|
|
||||||
|
const KnownQueryParams = {
|
||||||
|
json: true, // deprecated
|
||||||
|
main: true,
|
||||||
|
meta: true
|
||||||
|
}
|
||||||
|
|
||||||
|
function isKnownQueryParam(param) {
|
||||||
|
return !!KnownQueryParams[param]
|
||||||
|
}
|
||||||
|
|
||||||
|
function queryIsKnown(query) {
|
||||||
|
return Object.keys(query).every(isKnownQueryParam)
|
||||||
|
}
|
||||||
|
|
||||||
|
function sanitizeQuery(query) {
|
||||||
|
const saneQuery = {}
|
||||||
|
|
||||||
|
Object.keys(query).forEach(function (param) {
|
||||||
|
if (isKnownQueryParam(param))
|
||||||
|
saneQuery[param] = query[param]
|
||||||
|
})
|
||||||
|
|
||||||
|
return saneQuery
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse and validate the URL.
|
* Parse and validate the URL.
|
||||||
*/
|
*/
|
||||||
|
@ -16,6 +42,14 @@ function parsePackageURL(req, res, next) {
|
||||||
if (nameErrors)
|
if (nameErrors)
|
||||||
return res.status(403).type('text').send(`Invalid package name: ${url.packageName} (${nameErrors.join(', ')})`)
|
return res.status(403).type('text').send(`Invalid package name: ${url.packageName} (${nameErrors.join(', ')})`)
|
||||||
|
|
||||||
|
// Redirect requests with unknown query params to their equivalents
|
||||||
|
// with only known params so they can be served from the cache. This
|
||||||
|
// prevents people using random query params designed to bust the cache.
|
||||||
|
if (!queryIsKnown(url.query)) {
|
||||||
|
const search = qs.stringify(sanitizeQuery(url.query))
|
||||||
|
return res.redirect(url.pathname + (search ? `?${search}` : ''))
|
||||||
|
}
|
||||||
|
|
||||||
req.packageName = url.packageName
|
req.packageName = url.packageName
|
||||||
req.packageVersion = url.packageVersion
|
req.packageVersion = url.packageVersion
|
||||||
req.packageSpec = `${req.packageName}@${req.packageVersion}`
|
req.packageSpec = `${req.packageName}@${req.packageVersion}`
|
||||||
|
|
|
@ -41,7 +41,7 @@ function serveFile(req, res, next) {
|
||||||
delete req.query.meta
|
delete req.query.meta
|
||||||
delete req.query.json
|
delete req.query.json
|
||||||
const search = qs.stringify(req.query)
|
const search = qs.stringify(req.query)
|
||||||
res.status(301).redirect(`/_meta${req.pathname}${search}`)
|
res.redirect(`/_meta${req.pathname}${search}`)
|
||||||
} else if (req.stats.isFile()) {
|
} else if (req.stats.isFile()) {
|
||||||
// Cache files for 1 year.
|
// Cache files for 1 year.
|
||||||
res.set({
|
res.set({
|
||||||
|
|
Loading…
Reference in New Issue