From 46a7765711024c1ab13153589e5741e02b402247 Mon Sep 17 00:00:00 2001 From: Richard Petersen <richard.petersen@open-xchange.com> Date: Mon, 5 Sep 2022 16:30:47 +0200 Subject: [PATCH] Improve error handling in case the UI-containers are not accessible --- spec/file_caching_test.js | 45 +++++++++++++++++++++++++++++++++++++++ src/errors.js | 7 +++++- src/files.js | 7 ++++-- 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/spec/file_caching_test.js b/spec/file_caching_test.js index fd1dfd5..94490a4 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 0e1f90f..fd34e41 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 346d7ae..e602529 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 -- GitLab