diff --git a/services/filestore/app/js/S3Persistor.js b/services/filestore/app/js/S3Persistor.js index c1bfa8ec2f..6e71d95b0d 100644 --- a/services/filestore/app/js/S3Persistor.js +++ b/services/filestore/app/js/S3Persistor.js @@ -98,7 +98,16 @@ async function sendStream(bucketName, key, readStream, sourceMd5) { const response = await _getClientForBucket(bucketName) .upload(uploadOptions, { partSize: 100 * 1024 * 1024 }) .promise() - const destMd5 = await _md5FromResponse(response) + let destMd5 = _md5FromResponse(response) + if (!destMd5) { + // the eTag isn't in md5 format so we need to calculate it ourselves + const verifyStream = await getFileStream( + response.Bucket, + response.Key, + {} + ) + destMd5 = await PersistorHelper.calculateStreamMd5(verifyStream) + } // if we didn't have an md5 hash, we should compare our computed one with S3's // as we couldn't tell S3 about it beforehand @@ -219,8 +228,7 @@ async function getFileMd5Hash(bucketName, key) { const response = await _getClientForBucket(bucketName) .headObject({ Bucket: bucketName, Key: key }) .promise() - const md5 = await _md5FromResponse(response) - return md5 + return _md5FromResponse(response) } catch (err) { throw PersistorHelper.wrapError( err, @@ -364,12 +372,10 @@ function _buildClientOptions(bucketCredentials) { return options } -async function _md5FromResponse(response) { - let md5 = (response.ETag || '').replace(/[ "]/g, '') +function _md5FromResponse(response) { + const md5 = (response.ETag || '').replace(/[ "]/g, '') if (!md5.match(/^[a-f0-9]{32}$/)) { - // the eTag isn't in md5 format so we need to calculate it ourselves - const stream = await getFileStream(response.Bucket, response.Key, {}) - md5 = await PersistorHelper.calculateStreamMd5(stream) + return null } return md5