diff --git a/spec/file_caching_test.js b/spec/file_caching_test.js index ce832a189ad43623092bf0ed5c18a94016c6d689..fd1dfd5ad50b2c247a11aa1f10f39f2d1723c03b 100644 --- a/spec/file_caching_test.js +++ b/spec/file_caching_test.js @@ -399,4 +399,21 @@ describe('File caching service', function () { // check for files in redis expect(await redis.client.getBuffer('ui-middleware:554855300:/file.mp3:body')).to.deep.equal(response.body) }) + + it('does server svg as gzip (also escapes chars in regex)', async function () { + mockFetch({ + 'http://ui-server': { + '/manifest.json': generateSimpleViteManifest({}), + '/file.svg': () => new Response([...new Array(2500)].join(' '), { headers: { 'content-type': 'image/svg+xml' } }) + } + }) + app = await mockApp() + + const response = await request(app.server).get('/file.svg') + expect(response.statusCode).to.equal(200) + expect(response.headers['content-encoding']).to.equal('gzip') + + // check for files in redis + expect(zlib.gunzipSync(await redis.client.getBuffer('ui-middleware:554855300:/file.svg:body'))).to.deep.equal(response.body) + }) }) diff --git a/src/files.js b/src/files.js index 107ea8ef11d3034f377eef6825a538d3f7a39409..510dc0984616ba5880eaa44d021b97d33b4cd4cb 100644 --- a/src/files.js +++ b/src/files.js @@ -10,7 +10,7 @@ import { promisify } from 'node:util' const gzip = promisify(zlib.gzip) const compressFileSize = Number(process.env.COMPRESS_FILE_SIZE) -const compressionMimeTypes = (process.env.COMPRESS_FILE_TYPES || '').split(' ') +const compressionMimeTypes = (process.env.COMPRESS_FILE_TYPES || '').replace(/([.+*?^$()[\]{}|])/g, '\\$1').split(' ') const compressionWhitelistRegex = new RegExp(`^(${compressionMimeTypes.join('|')})$`) export function createWritable (body) {