1- const { callbackify } = require ( 'util' ) ;
21const querystring = require ( 'querystring' ) ;
32const { errors, errorInstances, versioning, s3middleware } = require ( 'arsenal' ) ;
43const 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 */
281281async 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
390385module . 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
0 commit comments