diff --git a/e2e/src/api/specs/asset-upload.e2e-spec.ts b/e2e/src/api/specs/asset-upload.e2e-spec.ts index 83264bcce8..7956172f04 100644 --- a/e2e/src/api/specs/asset-upload.e2e-spec.ts +++ b/e2e/src/api/specs/asset-upload.e2e-spec.ts @@ -223,7 +223,8 @@ describe('/upload', () => { }); }); - it('should reject attempt to start upload of existing incomplete asset', async () => { + // TODO: find a way to test interim responses + it('should return 500 if existing incomplete asset', async () => { const content = randomBytes(1024); const firstRequest = await request(app) @@ -252,8 +253,7 @@ describe('/upload', () => { .set('Upload-Length', '1024') .send(); - expect(secondRequest.status).toBe(400); - expect(secondRequest.headers['location']).toEqual(firstRequest.headers['location']); + expect(secondRequest.status).toBe(500); expect(secondRequest.text).toEqual('Incomplete asset already exists'); }); diff --git a/server/src/services/asset-upload.service.ts b/server/src/services/asset-upload.service.ts index d8034235b5..70c6197f11 100644 --- a/server/src/services/asset-upload.service.ts +++ b/server/src/services/asset-upload.service.ts @@ -57,22 +57,28 @@ export class AssetUploadService extends BaseService { assetData.metadata, ); } catch (error: any) { - if (isAssetChecksumConstraint(error)) { - const duplicate = await this.assetRepository.getUploadAssetIdByChecksum(req.auth.user.id, dto.checksum); - if (!duplicate) { - res.status(500).send('Error locating duplicate for checksum constraint'); - return; - } - - if (duplicate.status !== AssetStatus.Partial) { - return this.sendAlreadyCompletedProblem(res); - } - const location = `/api/upload/${duplicate.id}`; - res.status(400).setHeader('Location', location).send('Incomplete asset already exists'); + if (!isAssetChecksumConstraint(error)) { + this.logger.error(`Error creating upload asset record: ${error.message}`); + res.status(500).send('Error creating upload asset record'); return; } - this.logger.error(`Error creating upload asset record: ${error.message}`); - res.status(500).send('Error creating upload asset record'); + + const duplicate = await this.assetRepository.getUploadAssetIdByChecksum(req.auth.user.id, dto.checksum); + if (!duplicate) { + res.status(500).send('Error locating duplicate for checksum constraint'); + return; + } + + if (duplicate.status !== AssetStatus.Partial) { + return this.sendAlreadyCompletedProblem(res); + } + + const location = `/api/upload/${duplicate.id}`; + if (version <= MAX_RUFH_INTEROP_VERSION) { + this.sendInterimResponse(res, location, version); + } + // this is a 5xx to indicate the client should do offset retrieval and resume + res.status(500).send('Incomplete asset already exists'); return; }