diff --git a/spec/file_caching_test.js b/spec/file_caching_test.js index fd1dfd5ad50b2c247a11aa1f10f39f2d1723c03b..94490a492879cc48abfa1a5c4098384dea48a33f 100644 --- a/spec/file_caching_test.js +++ b/spec/file_caching_test.js @@ -268,6 +268,51 @@ describe('File caching service', function () { expect(response5.text).to.equal('second') }) + it('checks again for files after an error occurred', async function () { + // we have example.js in both files. the first one will be overwritten and therefore not be called + mockFetch({ + 'http://ui-server': { + '/manifest.json': generateSimpleViteManifest({ + 'example.js': { } + }), + '/example.js': td.when(td.func()(td.matchers.anything())).thenReturn( + new Response('UI-container not available', { headers: { 'content-type': 'text/plain' }, status: 503 }), + new Response('Now available', { headers: { 'content-type': 'text/plain' } }) + ) + } + }) + app = await mockApp() + + const response1 = await request(app.server).get('/example.js') + expect(response1.statusCode).to.equal(404) + + const response2 = await request(app.server).get('/example.js') + expect(response2.statusCode).to.equal(200) + expect(response2.text).to.equal('Now available') + }) + + it('does not check again, when a 404 occurred', async function () { + // we have example.js in both files. the first one will be overwritten and therefore not be called + mockFetch({ + 'http://ui-server': { + '/manifest.json': generateSimpleViteManifest({ + 'example.js': { } + }), + '/example.js': td.when(td.func()(td.matchers.anything())).thenReturn( + new Response('Not found', { headers: { 'content-type': 'text/plain' }, status: 404 }), + new Response('Now found', { headers: { 'content-type': 'text/plain' } }) + ) + } + }) + app = await mockApp() + + const response1 = await request(app.server).get('/example.js') + expect(response1.statusCode).to.equal(404) + + const response2 = await request(app.server).get('/example.js') + expect(response2.statusCode).to.equal(404) + }) + it('only fetches files once, even when requested simultanously', async function () { let spy mockFetch({ diff --git a/src/errors.js b/src/errors.js index 0e1f90f375ce3d8093bb0a4d6a790246cef16f55..fd34e4114a1a385cf92514cdd711ef21a1a4c21d 100644 --- a/src/errors.js +++ b/src/errors.js @@ -1 +1,6 @@ -export class NotFoundError extends Error {} +export class NotFoundError extends Error { + constructor (message, options) { + super(message, options) + this.status = options.status + } +} diff --git a/src/files.js b/src/files.js index 346d7ae869387a0ee4803c48caaf14762865ef9d..e6025295d8276602bc6804b05872ce719459e51d 100644 --- a/src/files.js +++ b/src/files.js @@ -41,7 +41,7 @@ export async function fetchFileWithHeadersFromBaseUrl (path, baseUrl, version) { if (!response.ok) { if (response.status === 404) logger.trace(`[Files] "${path}" could not be found on "${baseUrl}". Responded with: ${response.status}`) else logger.error(`[Files] Unexpected result from file retrieval "${path}" on "${baseUrl}", responded with: ${response.status}`) - throw new NotFoundError(`Error fetching file: ${path}`) + throw new NotFoundError(`Error fetching file: ${path}`, { status: response.status }) } const result = { @@ -101,7 +101,10 @@ export function getFile ({ version, path }) { } } - const dataFromServer = await fetchFileWithHeaders({ version, path }) + const dataFromServer = await fetchFileWithHeaders({ version, path }).catch(err => { + if (err.status !== 404) delete cache.getCache()[key] + throw err + }) if (redis.isEnabled()) { logger.debug(`[Files] Store in redis: ${key}`) const { body, ...rest } = dataFromServer