From 6b30974ff7d4ef225a07517f125d1f2e1c878c93 Mon Sep 17 00:00:00 2001 From: David Stone Date: Tue, 31 Mar 2026 13:09:36 +0100 Subject: [PATCH] Handle 404 file not found responses from persistFiles API --- .../engine/components/FileUploadField.test.ts | 21 +++++++++++++++++++ .../engine/components/FileUploadField.ts | 1 + 2 files changed, 22 insertions(+) diff --git a/src/server/plugins/engine/components/FileUploadField.test.ts b/src/server/plugins/engine/components/FileUploadField.test.ts index 3e91ef63f..8d36772f3 100644 --- a/src/server/plugins/engine/components/FileUploadField.test.ts +++ b/src/server/plugins/engine/components/FileUploadField.test.ts @@ -1029,6 +1029,27 @@ describe('FileUploadField', () => { ) }) + it('should throw InvalidComponentStateError when persistFiles throws 404 Not Found', async () => { + const notFoundError = Boom.notFound('File not found') + mockPersistFiles.mockRejectedValue(notFoundError) + + await expect( + fileUploadField.onSubmit(mockRequest, mockMetadata, mockContext) + ).rejects.toThrow(InvalidComponentStateError) + + const error = await fileUploadField + .onSubmit(mockRequest, mockMetadata, mockContext) + .catch((e: unknown) => e) + + expect(error).toBeInstanceOf(InvalidComponentStateError) + expect((error as InvalidComponentStateError).component).toBe( + fileUploadField + ) + expect((error as InvalidComponentStateError).userMessage).toBe( + 'There was a problem with your uploaded files. Re-upload them before submitting the form again.' + ) + }) + it('should re-throw other Boom errors without wrapping', async () => { const serverError = Boom.internal('Internal server error') mockPersistFiles.mockRejectedValue(serverError) diff --git a/src/server/plugins/engine/components/FileUploadField.ts b/src/server/plugins/engine/components/FileUploadField.ts index 4144600d9..e42e60a21 100644 --- a/src/server/plugins/engine/components/FileUploadField.ts +++ b/src/server/plugins/engine/components/FileUploadField.ts @@ -339,6 +339,7 @@ export class FileUploadField extends FormComponent { if ( Boom.isBoom(error) && (error.output.statusCode === 403 || // Forbidden - retrieval key invalid + error.output.statusCode === 404 || // Not Found - file not found error.output.statusCode === 410) // Gone - file expired (took to long to submit, etc) ) { // Failed to persist files. We can't recover from this, the only real way we can recover the submissions is