diff --git a/server/index.js b/server/index.js index 4124138..9960b44 100644 --- a/server/index.js +++ b/server/index.js @@ -59,7 +59,7 @@ const createServer = (config) => { maxAge: '365d' })) - app.use(middleware(config)) + app.use(middleware()) const server = http.createServer(app) @@ -86,11 +86,7 @@ const createServer = (config) => { const defaultServerConfig = { id: 1, port: parseInt(process.env.PORT, 10) || 5000, - publicDir: 'public', - - // for the middleware - autoIndex: !process.env.DISABLE_INDEX, - blacklist: require('./PackageBlacklist').blacklist + publicDir: 'public' } const startServer = (serverConfig = {}) => { diff --git a/server/middleware/checkBlacklist.js b/server/middleware/checkBlacklist.js index 61eba20..892de53 100644 --- a/server/middleware/checkBlacklist.js +++ b/server/middleware/checkBlacklist.js @@ -1,13 +1,13 @@ +const blacklist = require('../PackageBlacklist').blacklist + /** * Check the blacklist to see if we can serve files from this package. */ -function checkBlacklist(blacklist) { - return function (req, res, next) { - if (blacklist.includes(req.packageName)) { - res.status(403).send(`Package ${req.packageName} is blacklisted`) - } else { - next() - } +function checkBlacklist(req, res, next) { + if (blacklist.includes(req.packageName)) { + res.status(403).send(`Package ${req.packageName} is blacklisted`) + } else { + next() } } diff --git a/server/middleware/fetchPackage.js b/server/middleware/fetchPackage.js index 9752558..ab2732c 100644 --- a/server/middleware/fetchPackage.js +++ b/server/middleware/fetchPackage.js @@ -5,7 +5,7 @@ const PackageURL = require('../PackageURL') /** * Fetch the package from the registry and store a local copy on disk. - * Redirect if the URL does not specify an exact req.packageVersion number. + * Redirect if the URL does not specify an exact version number. */ function fetchPackage(req, res, next) { PackageInfo.get(req.packageName, function (error, packageInfo) { diff --git a/server/middleware/index.js b/server/middleware/index.js index ffcb6a8..085e4f5 100644 --- a/server/middleware/index.js +++ b/server/middleware/index.js @@ -7,12 +7,7 @@ const serveFile = require('./serveFile') /** * Creates and returns a function that can be used in the "request" - * event of a standard node HTTP server. Options are: - * - * - registryURL The URL of the npm registry (defaults to https://registry.npmjs.org) - * - autoIndex Automatically generate index HTML pages for directories (defaults to true) - * - * Supported URL schemes are: + * event of a standard node HTTP server. Supported URL schemes are: * * /history@1.12.5/umd/History.min.js (recommended) * /history@1.12.5 (package.json's main is implied) @@ -25,19 +20,15 @@ const serveFile = require('./serveFile') * /history@latest/umd/History.min.js (redirects to version) * /history@^1/umd/History.min.js (redirects to max satisfying version) */ -function createRequestHandler(options = {}) { - const autoIndex = options.autoIndex !== false - const maximumDepth = options.maximumDepth || Number.MAX_VALUE - const blacklist = options.blacklist || [] - +function createRequestHandler() { const app = express.Router() app.use( parseURL, - checkBlacklist(blacklist), + checkBlacklist, fetchPackage, findFile, - serveFile(autoIndex, maximumDepth) + serveFile ) return app diff --git a/server/middleware/serveFile.js b/server/middleware/serveFile.js index d1e885f..7afd7ea 100644 --- a/server/middleware/serveFile.js +++ b/server/middleware/serveFile.js @@ -5,6 +5,16 @@ const Metadata = require('./MetadataUtils') const { generateDirectoryIndexHTML } = require('./IndexUtils') const { getContentType } = require('./FileUtils') +/** + * Automatically generate HTML pages that show package contents. + */ +const AutoIndex = !process.env.DISABLE_INDEX + +/** + * Maximum recursion depth for ?meta listings. + */ +const MaximumDepth = 128 + function sendFile(res, file, stats) { let contentType = getContentType(file) @@ -30,38 +40,36 @@ function sendFile(res, file, stats) { /** * Send the file, JSON metadata, or HTML directory listing. */ -function serveFile(autoIndex, maximumDepth) { - return function (req, res, next) { - // TODO: remove support for "json" query param - if (req.query.meta != null || req.query.json != null) { - Metadata.get(req.packageDir, req.file, req.stats, maximumDepth, function (error, metadata) { - if (error) { - console.error(error) - res.status(500).send(`Cannot generate JSON metadata for ${req.packageSpec}${req.filename}`) - } else { - // Cache metadata for 1 year. - res.set('Cache-Control', 'public, max-age=31536000').send(metadata) - } - }) - } else if (req.stats.isFile()) { - // Cache files for 1 year. - res.set('Cache-Control', 'public, max-age=31536000') +function serveFile(req, res, next) { + // TODO: remove support for "json" query param + if (req.query.meta != null || req.query.json != null) { + Metadata.get(req.packageDir, req.file, req.stats, MaximumDepth, function (error, metadata) { + if (error) { + console.error(error) + res.status(500).send(`Cannot generate JSON metadata for ${req.packageSpec}${req.filename}`) + } else { + // Cache metadata for 1 year. + res.set('Cache-Control', 'public, max-age=31536000').send(metadata) + } + }) + } else if (req.stats.isFile()) { + // Cache files for 1 year. + res.set('Cache-Control', 'public, max-age=31536000') - // TODO: use res.sendFile instead of our own sendFile? - sendFile(res, path.join(req.packageDir, req.file), req.stats) - } else if (autoIndex && req.stats.isDirectory()) { - generateDirectoryIndexHTML(req.packageInfo, req.packageVersion, req.packageDir, req.file, function (error, html) { - if (error) { - console.error(error) - res.status(500).send(`Cannot generate index page for ${req.packageSpec}${req.filename}`) - } else { - // Cache HTML directory listings for 1 minute. - res.set('Cache-Control', 'public, max-age=60').send(html) - } - }) - } else { - res.status(403).send(`Cannot serve ${req.packageSpec}${req.filename}; it's not a file`) - } + // TODO: use res.sendFile instead of our own sendFile? + sendFile(res, path.join(req.packageDir, req.file), req.stats) + } else if (AutoIndex && req.stats.isDirectory()) { + generateDirectoryIndexHTML(req.packageInfo, req.packageVersion, req.packageDir, req.file, function (error, html) { + if (error) { + console.error(error) + res.status(500).send(`Cannot generate index page for ${req.packageSpec}${req.filename}`) + } else { + // Cache HTML directory listings for 1 minute. + res.set('Cache-Control', 'public, max-age=60').send(html) + } + }) + } else { + res.status(403).send(`Cannot serve ${req.packageSpec}${req.filename}; it's not a file`) } }