Re-organize package URL parsing
This commit is contained in:
parent
17f6a6bbe9
commit
066729f17c
|
@ -2,7 +2,7 @@ const parseURL = require('url').parse
|
||||||
const startOfDay = require('date-fns/start_of_day')
|
const startOfDay = require('date-fns/start_of_day')
|
||||||
const addDays = require('date-fns/add_days')
|
const addDays = require('date-fns/add_days')
|
||||||
const validateNPMPackageName = require('validate-npm-package-name')
|
const validateNPMPackageName = require('validate-npm-package-name')
|
||||||
const PackageURL = require('./PackageURL')
|
const parsePackageURL = require('./utils/parsePackageURL')
|
||||||
const cf = require('./CloudflareAPI')
|
const cf = require('./CloudflareAPI')
|
||||||
const db = require('./RedisClient')
|
const db = require('./RedisClient')
|
||||||
const {
|
const {
|
||||||
|
@ -66,7 +66,7 @@ function computeCounters(stream) {
|
||||||
if (edgeResponse.status === 200) {
|
if (edgeResponse.status === 200) {
|
||||||
// Q: How many requests do we serve for a package per day?
|
// Q: How many requests do we serve for a package per day?
|
||||||
// Q: How many bytes do we serve for a package per day?
|
// Q: How many bytes do we serve for a package per day?
|
||||||
const url = PackageURL.parse(parseURL(clientRequest.uri).pathname)
|
const url = parsePackageURL(parseURL(clientRequest.uri).pathname)
|
||||||
const packageName = url && url.packageName
|
const packageName = url && url.packageName
|
||||||
|
|
||||||
if (packageName && validateNPMPackageName(packageName).errors == null) {
|
if (packageName && validateNPMPackageName(packageName).errors == null) {
|
||||||
|
|
|
@ -7,7 +7,7 @@ const morgan = require('morgan')
|
||||||
const { fetchStats } = require('./cloudflare')
|
const { fetchStats } = require('./cloudflare')
|
||||||
|
|
||||||
const checkBlacklist = require('./middleware/checkBlacklist')
|
const checkBlacklist = require('./middleware/checkBlacklist')
|
||||||
const parsePackageURL = require('./middleware/parsePackageURL')
|
const packageURL = require('./middleware/packageURL')
|
||||||
const fetchFile = require('./middleware/fetchFile')
|
const fetchFile = require('./middleware/fetchFile')
|
||||||
const serveFile = require('./middleware/serveFile')
|
const serveFile = require('./middleware/serveFile')
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ function createApp() {
|
||||||
}))
|
}))
|
||||||
|
|
||||||
app.use('/',
|
app.use('/',
|
||||||
parsePackageURL,
|
packageURL,
|
||||||
checkBlacklist(PackageBlacklist),
|
checkBlacklist(PackageBlacklist),
|
||||||
fetchFile,
|
fetchFile,
|
||||||
serveFile
|
serveFile
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const semver = require('semver')
|
const semver = require('semver')
|
||||||
|
const createPackageURL = require('../utils/createPackageURL')
|
||||||
const getPackage = require('./utils/getPackage')
|
const getPackage = require('./utils/getPackage')
|
||||||
const getPackageInfo = require('./utils/getPackageInfo')
|
const getPackageInfo = require('./utils/getPackageInfo')
|
||||||
const PackageURL = require('../PackageURL')
|
|
||||||
|
|
||||||
const FindExtensions = [ '', '.js', '.json' ]
|
const FindExtensions = [ '', '.js', '.json' ]
|
||||||
|
|
||||||
|
@ -137,7 +137,7 @@ function fetchFile(req, res, next) {
|
||||||
res.set({
|
res.set({
|
||||||
'Cache-Control': 'public, max-age=60',
|
'Cache-Control': 'public, max-age=60',
|
||||||
'Cache-Tag': 'redirect'
|
'Cache-Tag': 'redirect'
|
||||||
}).redirect(PackageURL.create(req.packageName, tags[req.packageVersion], req.filename, req.search))
|
}).redirect(createPackageURL(req.packageName, tags[req.packageVersion], req.filename, req.search))
|
||||||
} else {
|
} else {
|
||||||
const maxVersion = semver.maxSatisfying(Object.keys(versions), req.packageVersion)
|
const maxVersion = semver.maxSatisfying(Object.keys(versions), req.packageVersion)
|
||||||
|
|
||||||
|
@ -146,7 +146,7 @@ function fetchFile(req, res, next) {
|
||||||
res.set({
|
res.set({
|
||||||
'Cache-Control': 'public, max-age=60',
|
'Cache-Control': 'public, max-age=60',
|
||||||
'Cache-Tag': 'redirect'
|
'Cache-Tag': 'redirect'
|
||||||
}).redirect(PackageURL.create(req.packageName, maxVersion, req.filename, req.search))
|
}).redirect(createPackageURL(req.packageName, maxVersion, req.filename, req.search))
|
||||||
} else {
|
} else {
|
||||||
res.status(404).type('text').send(`Cannot find package ${req.packageSpec}`)
|
res.status(404).type('text').send(`Cannot find package ${req.packageSpec}`)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
const validateNPMPackageName = require('validate-npm-package-name')
|
const validateNPMPackageName = require('validate-npm-package-name')
|
||||||
const PackageURL = require('../PackageURL')
|
const parsePackageURL = require('../utils/parsePackageURL')
|
||||||
|
|
||||||
const KnownQueryParams = {
|
const KnownQueryParams = {
|
||||||
expand: true,
|
expand: true,
|
||||||
|
@ -45,7 +45,7 @@ function createSearch(query) {
|
||||||
/**
|
/**
|
||||||
* Parse and validate the URL.
|
* Parse and validate the URL.
|
||||||
*/
|
*/
|
||||||
function parsePackageURL(req, res, next) {
|
function packageURL(req, res, next) {
|
||||||
// Redirect /_meta/pkg to /pkg?meta.
|
// Redirect /_meta/pkg to /pkg?meta.
|
||||||
if (req.path.match(/^\/_meta\//)) {
|
if (req.path.match(/^\/_meta\//)) {
|
||||||
delete req.query.json
|
delete req.query.json
|
||||||
|
@ -53,7 +53,7 @@ function parsePackageURL(req, res, next) {
|
||||||
return res.redirect(req.path.substr(6) + createSearch(req.query))
|
return res.redirect(req.path.substr(6) + createSearch(req.query))
|
||||||
}
|
}
|
||||||
|
|
||||||
const url = PackageURL.parse(req.url)
|
const url = parsePackageURL(req.url)
|
||||||
|
|
||||||
// Do not allow invalid URLs.
|
// Do not allow invalid URLs.
|
||||||
if (url == null)
|
if (url == null)
|
||||||
|
@ -82,4 +82,4 @@ function parsePackageURL(req, res, next) {
|
||||||
next()
|
next()
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = parsePackageURL
|
module.exports = packageURL
|
|
@ -0,0 +1,16 @@
|
||||||
|
function createPackageURL(packageName, version, filename, search) {
|
||||||
|
let pathname = `/${packageName}`
|
||||||
|
|
||||||
|
if (version != null)
|
||||||
|
pathname += `@${version}`
|
||||||
|
|
||||||
|
if (filename)
|
||||||
|
pathname += filename
|
||||||
|
|
||||||
|
if (search)
|
||||||
|
pathname += search
|
||||||
|
|
||||||
|
return pathname
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = createPackageURL
|
|
@ -36,22 +36,4 @@ function parsePackageURL(packageURL) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function createPackageURL(packageName, version, filename, search) {
|
module.exports = parsePackageURL
|
||||||
let pathname = `/${packageName}`
|
|
||||||
|
|
||||||
if (version != null)
|
|
||||||
pathname += `@${version}`
|
|
||||||
|
|
||||||
if (filename)
|
|
||||||
pathname += filename
|
|
||||||
|
|
||||||
if (search)
|
|
||||||
pathname += search
|
|
||||||
|
|
||||||
return pathname
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
parse: parsePackageURL,
|
|
||||||
create: createPackageURL
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
const parsePackageURL = require('./PackageURL').parse
|
const parsePackageURL = require('./parsePackageURL')
|
||||||
|
|
||||||
describe('parsePackageURL', () => {
|
describe('parsePackageURL', () => {
|
||||||
it('parses plain packages', () => {
|
it('parses plain packages', () => {
|
Loading…
Reference in New Issue