UNPKG

siegel

Version:

Web application development ecosystem

42 lines (41 loc) 1.84 kB
import fs from 'fs'; import path from 'path'; import mime from 'mime'; const STRIP_PATH_TRAVERSAL_REGEXP = /^(\.\.(\/|\\|$))+/; const CHARSET_CONTENT_TYPES_REGEXP = /^text\/|^application\/(javascript|json)/; const finalizeHeaderValue = (value) => (value?.constructor == String ? value : `${value}`); const getStaticFileResponseParams = params => { const { publicDir, reqUrl, serveCompressionsPriority, cacheControl = '', acceptEncoding = '' } = params; const reqUrlFinal = finalizeHeaderValue(reqUrl); const urlNormalized = path.normalize(reqUrlFinal) .replace(STRIP_PATH_TRAVERSAL_REGEXP, ''); const pathAbsolute = path.join(publicDir, urlNormalized); let contentType = mime.getType(pathAbsolute); if (contentType && CHARSET_CONTENT_TYPES_REGEXP.test(contentType)) { contentType += '; charset=UTF-8'; } const acceptEncodingFinal = finalizeHeaderValue(acceptEncoding); const browserEncodings = new Set((acceptEncodingFinal || '').split(', ')); let encoding = ''; let pathToFile = pathAbsolute; if (serveCompressionsPriority) { for (let i = 0, l = serveCompressionsPriority.length; i < l; i++) { const encodingPrefecence = serveCompressionsPriority[i]; const compressedFilePath = `${pathAbsolute}.${encodingPrefecence}`; if (browserEncodings.has(encodingPrefecence) && fs.existsSync(compressedFilePath)) { pathToFile = compressedFilePath; encoding = encodingPrefecence; break; } } } return { pathToFile, encoding, contentType, cacheControl: urlNormalized.includes('index.html') || cacheControl.includes('no-cache') ? '' : 'max-age=31536000, immutable' }; }; export default getStaticFileResponseParams;