Skip to content

Commit 08d8dc0

Browse files
committed
♻️ move to manual callbackify
Issue: CLDSRV-823
1 parent 717e694 commit 08d8dc0

File tree

2 files changed

+153
-153
lines changed

2 files changed

+153
-153
lines changed

lib/api/bucketGet.js

Lines changed: 97 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
const { callbackify } = require('util');
21
const querystring = require('querystring');
32
const { errors, errorInstances, versioning, s3middleware } = require('arsenal');
43
const constants = require('../../constants');
@@ -264,6 +263,7 @@ const getObjectListing = (bucketName, listParams, log) => new Promise((resolve,
264263
if (err) {
265264
return reject(err);
266265
}
266+
267267
return resolve(list);
268268
});
269269
});
@@ -279,117 +279,119 @@ const getObjectListing = (bucketName, listParams, log) => new Promise((resolve,
279279
* @return {undefined}
280280
*/
281281
async function bucketGet(authInfo, request, log) {
282-
try {
283-
const params = request.query;
284-
const bucketName = request.bucketName;
285-
const v2 = params['list-type'];
286-
287-
if (v2 !== undefined && Number.parseInt(v2, 10) !== 2) {
288-
throw errorInstances.InvalidArgument.customizeDescription('Invalid List Type specified in Request');
289-
}
282+
const params = request.query;
283+
const bucketName = request.bucketName;
284+
const v2 = params['list-type'];
290285

291-
if (v2) {
292-
log.addDefaultFields({ action: 'ListObjectsV2', });
293-
if (request.serverAccessLog) {
294-
// eslint-disable-next-line no-param-reassign
295-
request.serverAccessLog.analyticsAction = 'ListObjectsV2';
296-
}
297-
} else if (params.versions !== undefined) {
298-
log.addDefaultFields({ action: 'ListObjectVersions', });
299-
if (request.serverAccessLog) {
300-
// eslint-disable-next-line no-param-reassign
301-
request.serverAccessLog.analyticsAction = 'ListObjectVersions';
302-
}
303-
}
304-
log.debug('processing request', { method: 'bucketGet' });
305-
const encoding = params['encoding-type'];
306-
if (encoding !== undefined && encoding !== 'url') {
307-
monitoring.promMetrics('GET', bucketName, 400, 'listBucket');
308-
throw errorInstances.InvalidArgument.customizeDescription('Invalid Encoding Type specified in Request');
309-
}
286+
if (v2 !== undefined && Number.parseInt(v2, 10) !== 2) {
287+
throw errorInstances.InvalidArgument.customizeDescription('Invalid List Type specified in Request');
288+
}
310289

311-
const requestMaxKeys = params['max-keys'] ? Number.parseInt(params['max-keys'], 10) : 1000;
312-
if (Number.isNaN(requestMaxKeys) || requestMaxKeys < 0) {
313-
monitoring.promMetrics('GET', bucketName, 400, 'listBucket');
314-
throw errors.InvalidArgument;
290+
if (v2) {
291+
log.addDefaultFields({ action: 'ListObjectsV2', });
292+
if (request.serverAccessLog) {
293+
// eslint-disable-next-line no-param-reassign
294+
request.serverAccessLog.analyticsAction = 'ListObjectsV2';
315295
}
316-
const actualMaxKeys = Math.min(constants.listingHardLimit, requestMaxKeys);
317-
318-
const metadataValParams = {
319-
authInfo,
320-
bucketName,
321-
requestType: request.apiMethods || 'bucketGet',
322-
request,
323-
};
324-
const listParams = {
325-
listingType: 'DelimiterMaster',
326-
maxKeys: actualMaxKeys,
327-
prefix: params.prefix,
328-
};
329-
330-
if (params.delimiter) {
331-
listParams.delimiter = params.delimiter;
296+
} else if (params.versions !== undefined) {
297+
log.addDefaultFields({ action: 'ListObjectVersions', });
298+
if (request.serverAccessLog) {
299+
// eslint-disable-next-line no-param-reassign
300+
request.serverAccessLog.analyticsAction = 'ListObjectVersions';
332301
}
302+
}
303+
log.debug('processing request', { method: 'bucketGet' });
304+
const encoding = params['encoding-type'];
305+
if (encoding !== undefined && encoding !== 'url') {
306+
monitoring.promMetrics('GET', bucketName, 400, 'listBucket');
307+
throw errorInstances.InvalidArgument.customizeDescription('Invalid Encoding Type specified in Request');
308+
}
333309

334-
if (v2) {
335-
listParams.v2 = true;
336-
listParams.startAfter = params['start-after'];
337-
listParams.continuationToken = decryptToken(params['continuation-token']);
338-
listParams.fetchOwner = params['fetch-owner'] === 'true';
339-
} else {
340-
listParams.marker = params.marker;
341-
}
310+
const requestMaxKeys = params['max-keys'] ? Number.parseInt(params['max-keys'], 10) : 1000;
311+
if (Number.isNaN(requestMaxKeys) || requestMaxKeys < 0) {
312+
monitoring.promMetrics('GET', bucketName, 400, 'listBucket');
313+
throw errors.InvalidArgument;
314+
}
315+
const actualMaxKeys = Math.min(constants.listingHardLimit, requestMaxKeys);
342316

343-
const { error, bucket } = await validateBucket(metadataValParams, request.actionImplicitDenies, log);
344-
const corsHeaders = collectCorsHeaders(request.headers.origin, request.method, bucket);
317+
const metadataValParams = {
318+
authInfo,
319+
bucketName,
320+
requestType: request.apiMethods || 'bucketGet',
321+
request,
322+
};
323+
const listParams = {
324+
listingType: 'DelimiterMaster',
325+
maxKeys: actualMaxKeys,
326+
prefix: params.prefix,
327+
};
345328

346-
if (error) {
347-
log.debug('error processing request', { error });
348-
monitoring.promMetrics('GET', bucketName, error.code, 'listBucket');
349-
error.additionalResHeaders = corsHeaders;
350-
throw error;
351-
}
352-
if (params.versions !== undefined) {
353-
listParams.listingType = 'DelimiterVersions';
354-
delete listParams.marker;
355-
listParams.keyMarker = params['key-marker'];
356-
listParams.versionIdMarker = params['version-id-marker'] ?
357-
versionIdUtils.decode(params['version-id-marker']) :
358-
undefined;
359-
}
360-
if (!requestMaxKeys) {
361-
const emptyList = {
362-
CommonPrefixes: [],
363-
Contents: [],
364-
Versions: [],
365-
IsTruncated: false,
366-
};
367-
const res = handleResult(listParams, requestMaxKeys, encoding, authInfo, bucketName, emptyList, log);
368-
return [res, corsHeaders];
369-
}
329+
if (params.delimiter) {
330+
listParams.delimiter = params.delimiter;
331+
}
370332

371-
let list;
372-
try {
373-
list = await getObjectListing(bucketName, listParams, log);
374-
} catch (err) {
375-
log.debug('error processing request', { error: err });
376-
monitoring.promMetrics('GET', bucketName, err.code, 'listBucket');
333+
if (v2) {
334+
listParams.v2 = true;
335+
listParams.startAfter = params['start-after'];
336+
listParams.continuationToken = decryptToken(params['continuation-token']);
337+
listParams.fetchOwner = params['fetch-owner'] === 'true';
338+
} else {
339+
listParams.marker = params.marker;
340+
}
377341

378-
err.additionalResHeaders = corsHeaders;
379-
throw err;
380-
}
342+
const { error, bucket } = await validateBucket(metadataValParams, request.actionImplicitDenies, log);
343+
const corsHeaders = collectCorsHeaders(request.headers.origin, request.method, bucket);
381344

382-
const res = handleResult(listParams, requestMaxKeys, encoding, authInfo, bucketName, list, log);
345+
if (error) {
346+
log.debug('error processing request', { error });
347+
monitoring.promMetrics('GET', bucketName, error.code, 'listBucket');
348+
error.additionalResHeaders = corsHeaders;
349+
throw error;
350+
}
351+
if (params.versions !== undefined) {
352+
listParams.listingType = 'DelimiterVersions';
353+
delete listParams.marker;
354+
listParams.keyMarker = params['key-marker'];
355+
listParams.versionIdMarker = params['version-id-marker'] ?
356+
versionIdUtils.decode(params['version-id-marker']) :
357+
undefined;
358+
}
359+
if (!requestMaxKeys) {
360+
const emptyList = {
361+
CommonPrefixes: [],
362+
Contents: [],
363+
Versions: [],
364+
IsTruncated: false,
365+
};
366+
const res = handleResult(listParams, requestMaxKeys, encoding, authInfo, bucketName, emptyList, log);
383367
return [res, corsHeaders];
368+
}
369+
370+
let list;
371+
try {
372+
list = await getObjectListing(bucketName, listParams, log);
384373
} catch (err) {
385-
log.error('unhandled error in bucketGet', { error: err });
386-
throw errors.InternalError;
374+
log.debug('error processing request', { error: err });
375+
monitoring.promMetrics('GET', bucketName, err.code, 'listBucket');
376+
377+
err.additionalResHeaders = corsHeaders;
378+
throw err;
387379
}
380+
381+
const res = handleResult(listParams, requestMaxKeys, encoding, authInfo, bucketName, list, log);
382+
return [res, corsHeaders];
388383
}
389384

390385
module.exports = {
391386
processVersions,
392387
processMasterVersions,
393-
bucketGet: callbackify(bucketGet),
388+
bucketGet: (...args) => {
389+
const callback = args.at(-1);
390+
const argsWithoutCallback = args.slice(0, -1);
391+
392+
bucketGet(...argsWithoutCallback)
393+
.then(result => callback(null, ...result))
394+
.catch(callback);
395+
},
394396
};
395397

lib/api/objectGetLegalHold.js

Lines changed: 56 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
const { callbackify } = require('util');
21
const { errors, errorInstances, s3middleware } = require('arsenal');
32

43
const { decodeVersionId, getVersionIdResHeader }
@@ -39,69 +38,68 @@ async function objectGetLegalHold(authInfo, request, log) {
3938
request,
4039
};
4140

42-
let bucket;
43-
let objectMD;
44-
45-
try {
46-
({ bucket, objectMD } = await new Promise((resolve, reject) => {
47-
standardMetadataValidateBucketAndObj(
48-
metadataValParams, request.actionImplicitDenies, log,
49-
(err, bucket, objectMD) => {
50-
if (err) {
51-
log.trace('request authorization failed', { method: 'objectGetLegalHold', error: err });
52-
return reject(err);
53-
}
54-
return resolve({ bucket, objectMD });
55-
});
56-
}));
57-
58-
if (!objectMD) {
59-
const err = versionId ? errors.NoSuchVersion : errors.NoSuchKey;
60-
log.trace('error no object metadata found', { method: 'objectGetLegalHold', error: err });
61-
throw err;
62-
}
63-
64-
if (objectMD.isDeleteMarker) {
65-
if (versionId) {
66-
log.trace('requested version is delete marker', { method: 'objectGetLegalHold' });
67-
// FIXME we should return a `x-amz-delete-marker: true` header, see S3C-7592
68-
throw errors.MethodNotAllowed;
69-
}
41+
const { bucket, objectMD } = await new Promise((resolve, reject) => {
42+
standardMetadataValidateBucketAndObj(
43+
metadataValParams, request.actionImplicitDenies, log,
44+
(err, bucket, objectMD) => {
45+
if (err) {
46+
log.trace('request authorization failed', { method: 'objectGetLegalHold', error: err });
47+
return reject(err);
48+
}
49+
return resolve({ bucket, objectMD });
50+
});
51+
});
52+
53+
54+
if (!objectMD) {
55+
const err = versionId ? errors.NoSuchVersion : errors.NoSuchKey;
56+
log.trace('error no object metadata found', { method: 'objectGetLegalHold', error: err });
57+
throw err;
58+
}
7059

71-
log.trace('most recent version is delete marker', { method: 'objectGetLegalHold' });
60+
if (objectMD.isDeleteMarker) {
61+
if (versionId) {
62+
log.trace('requested version is delete marker', { method: 'objectGetLegalHold' });
7263
// FIXME we should return a `x-amz-delete-marker: true` header, see S3C-7592
73-
throw errors.NoSuchKey;
64+
throw errors.MethodNotAllowed;
7465
}
7566

76-
if (!bucket.isObjectLockEnabled()) {
77-
log.trace('object lock not enabled on bucket', { method: 'objectGetRetention' });
78-
throw errorInstances.InvalidRequest.customizeDescription('Bucket is missing Object Lock Configuration');
79-
}
67+
log.trace('most recent version is delete marker', { method: 'objectGetLegalHold' });
68+
// FIXME we should return a `x-amz-delete-marker: true` header, see S3C-7592
69+
throw errors.NoSuchKey;
70+
}
8071

81-
const { legalHold } = objectMD;
82-
const xml = convertToXml(legalHold);
83-
if (xml === '') {
84-
throw errors.NoSuchObjectLockConfiguration;
85-
}
72+
if (!bucket.isObjectLockEnabled()) {
73+
log.trace('object lock not enabled on bucket', { method: 'objectGetRetention' });
74+
throw errorInstances.InvalidRequest.customizeDescription('Bucket is missing Object Lock Configuration');
75+
}
8676

87-
const additionalResHeaders = collectCorsHeaders(request.headers.origin, request.method, bucket);
88-
89-
pushMetric('getObjectLegalHold', log, {
90-
authInfo,
91-
bucket: bucketName,
92-
keys: [objectKey],
93-
versionId: objectMD ? objectMD.versionId : undefined,
94-
location: objectMD ? objectMD.dataStoreName : undefined,
95-
});
96-
const verCfg = bucket.getVersioningConfiguration();
97-
additionalResHeaders['x-amz-version-id'] = getVersionIdResHeader(verCfg, objectMD);
98-
99-
return [xml, additionalResHeaders];
100-
} catch (err) {
101-
const additionalResHeaders = collectCorsHeaders(request.headers.origin, request.method, bucket);
102-
err.additionalResHeaders = additionalResHeaders;
103-
throw err;
77+
const { legalHold } = objectMD;
78+
const xml = convertToXml(legalHold);
79+
if (xml === '') {
80+
throw errors.NoSuchObjectLockConfiguration;
10481
}
82+
83+
const additionalResHeaders = collectCorsHeaders(request.headers.origin, request.method, bucket);
84+
85+
pushMetric('getObjectLegalHold', log, {
86+
authInfo,
87+
bucket: bucketName,
88+
keys: [objectKey],
89+
versionId: objectMD ? objectMD.versionId : undefined,
90+
location: objectMD ? objectMD.dataStoreName : undefined,
91+
});
92+
const verCfg = bucket.getVersioningConfiguration();
93+
additionalResHeaders['x-amz-version-id'] = getVersionIdResHeader(verCfg, objectMD);
94+
95+
return [xml, additionalResHeaders];
10596
}
10697

107-
module.exports = callbackify(objectGetLegalHold);
98+
module.exports = (...args) => {
99+
const callback = args.at(-1);
100+
const argsWithoutCallback = args.slice(0, -1);
101+
102+
objectGetLegalHold(...argsWithoutCallback)
103+
.then(result => callback(null, ...result))
104+
.catch(callback);
105+
};

0 commit comments

Comments
 (0)