@@ -2,6 +2,9 @@ const assert = require('assert');
22const async = require ( 'async' ) ;
33const crypto = require ( 'crypto' ) ;
44const { parseString } = require ( 'xml2js' ) ;
5+ const { models } = require ( 'arsenal' ) ;
6+ const { ObjectMD, ObjectMDChecksum } = models ;
7+ const { algorithms } = require ( '../../../lib/api/apiUtils/integrity/validateChecksums' ) ;
58
69const { bucketPut } = require ( '../../../lib/api/bucketPut' ) ;
710const { cleanup, DummyRequestLogger, makeAuthInfo } = require ( '../helpers' ) ;
@@ -518,3 +521,155 @@ describe('objectGet API', () => {
518521 } ) ;
519522 } ) ;
520523} ) ;
524+
525+ describe ( 'objectGet API - x-amz-checksum-mode' , ( ) => {
526+ const checksumAlgorithms = [
527+ { name : 'sha256' , header : 'x-amz-checksum-sha256' } ,
528+ { name : 'sha1' , header : 'x-amz-checksum-sha1' } ,
529+ { name : 'crc32' , header : 'x-amz-checksum-crc32' } ,
530+ { name : 'crc32c' , header : 'x-amz-checksum-crc32c' } ,
531+ { name : 'crc64nvme' , header : 'x-amz-checksum-crc64nvme' } ,
532+ ] ;
533+
534+ const expectedDigests = { } ;
535+
536+ before ( done => {
537+ Promise . all ( checksumAlgorithms . map ( async ( { name } ) => {
538+ expectedDigests [ name ] = await algorithms [ name ] . digest ( postBody ) ;
539+ } ) ) . then ( ( ) => done ( ) , done ) ;
540+ } ) ;
541+
542+ beforeEach ( ( ) => cleanup ( ) ) ;
543+
544+ checksumAlgorithms . forEach ( ( { name, header } ) => {
545+ it ( `should return ${ header } and x-amz-checksum-type when mode is ENABLED` , done => {
546+ const md = new ObjectMD ( mdColdHelper . baseMd )
547+ . setChecksum ( new ObjectMDChecksum ( name , expectedDigests [ name ] , 'FULL_OBJECT' ) ) ;
548+ mdColdHelper . putBucketMock ( bucketName , null , ( ) =>
549+ mdColdHelper . putObjectMock ( bucketName , objectName , md , ( ) => {
550+ const req = {
551+ bucketName,
552+ namespace,
553+ objectKey : objectName ,
554+ headers : { 'x-amz-checksum-mode' : 'ENABLED' } ,
555+ url : `/${ bucketName } /${ objectName } ` ,
556+ query : { } ,
557+ } ;
558+ objectGet ( authInfo , req , false , log , ( err , _locator , headers ) => {
559+ assert . ifError ( err ) ;
560+ assert . strictEqual ( headers [ header ] , expectedDigests [ name ] ) ;
561+ assert . strictEqual ( headers [ 'x-amz-checksum-type' ] , 'FULL_OBJECT' ) ;
562+ done ( ) ;
563+ } ) ;
564+ } ) ) ;
565+ } ) ;
566+ } ) ;
567+
568+ it ( 'should not return checksum headers when mode is ENABLED but object has no checksum' , done => {
569+ mdColdHelper . putBucketMock ( bucketName , null , ( ) =>
570+ mdColdHelper . putObjectMock ( bucketName , objectName , undefined , ( ) => {
571+ const req = {
572+ bucketName,
573+ namespace,
574+ objectKey : objectName ,
575+ headers : { 'x-amz-checksum-mode' : 'ENABLED' } ,
576+ url : `/${ bucketName } /${ objectName } ` ,
577+ query : { } ,
578+ } ;
579+ objectGet ( authInfo , req , false , log , ( err , _locator , headers ) => {
580+ assert . ifError ( err ) ;
581+ checksumAlgorithms . forEach ( ( { header } ) =>
582+ assert . strictEqual ( headers [ header ] , undefined ) ) ;
583+ assert . strictEqual ( headers [ 'x-amz-checksum-type' ] , undefined ) ;
584+ done ( ) ;
585+ } ) ;
586+ } ) ) ;
587+ } ) ;
588+
589+ it ( 'should not return checksum headers when x-amz-checksum-mode is not set' , done => {
590+ const md = new ObjectMD ( mdColdHelper . baseMd )
591+ . setChecksum ( new ObjectMDChecksum ( 'sha256' , expectedDigests . sha256 , 'FULL_OBJECT' ) ) ;
592+ mdColdHelper . putBucketMock ( bucketName , null , ( ) =>
593+ mdColdHelper . putObjectMock ( bucketName , objectName , md , ( ) => {
594+ const req = {
595+ bucketName,
596+ namespace,
597+ objectKey : objectName ,
598+ headers : { } ,
599+ url : `/${ bucketName } /${ objectName } ` ,
600+ query : { } ,
601+ } ;
602+ objectGet ( authInfo , req , false , log , ( err , _locator , headers ) => {
603+ assert . ifError ( err ) ;
604+ checksumAlgorithms . forEach ( ( { header } ) =>
605+ assert . strictEqual ( headers [ header ] , undefined ) ) ;
606+ assert . strictEqual ( headers [ 'x-amz-checksum-type' ] , undefined ) ;
607+ done ( ) ;
608+ } ) ;
609+ } ) ) ;
610+ } ) ;
611+
612+ it ( 'should return InvalidArgument when x-amz-checksum-mode is not ENABLED' , done => {
613+ const req = {
614+ bucketName,
615+ namespace,
616+ objectKey : objectName ,
617+ headers : { 'x-amz-checksum-mode' : 'DISABLED' } ,
618+ url : `/${ bucketName } /${ objectName } ` ,
619+ query : { } ,
620+ } ;
621+ objectGet ( authInfo , req , false , log , err => {
622+ assert . strictEqual ( err . is . InvalidArgument , true ) ;
623+ done ( ) ;
624+ } ) ;
625+ } ) ;
626+
627+ it ( 'should not return checksum headers when Range header is set' , done => {
628+ const md = new ObjectMD ( mdColdHelper . baseMd )
629+ . setChecksum ( new ObjectMDChecksum ( 'sha256' , expectedDigests . sha256 , 'FULL_OBJECT' ) ) ;
630+ mdColdHelper . putBucketMock ( bucketName , null , ( ) =>
631+ mdColdHelper . putObjectMock ( bucketName , objectName , md , ( ) => {
632+ const req = {
633+ bucketName,
634+ namespace,
635+ objectKey : objectName ,
636+ headers : {
637+ 'x-amz-checksum-mode' : 'ENABLED' ,
638+ range : 'bytes=0-3' ,
639+ } ,
640+ url : `/${ bucketName } /${ objectName } ` ,
641+ query : { } ,
642+ } ;
643+ objectGet ( authInfo , req , false , log , ( err , _locator , headers ) => {
644+ assert . ifError ( err ) ;
645+ checksumAlgorithms . forEach ( ( { header } ) =>
646+ assert . strictEqual ( headers [ header ] , undefined ) ) ;
647+ assert . strictEqual ( headers [ 'x-amz-checksum-type' ] , undefined ) ;
648+ done ( ) ;
649+ } ) ;
650+ } ) ) ;
651+ } ) ;
652+
653+ it ( 'should not return checksum headers when partNumber is set' , done => {
654+ const md = new ObjectMD ( mdColdHelper . baseMd )
655+ . setChecksum ( new ObjectMDChecksum ( 'sha256' , expectedDigests . sha256 , 'FULL_OBJECT' ) ) ;
656+ mdColdHelper . putBucketMock ( bucketName , null , ( ) =>
657+ mdColdHelper . putObjectMock ( bucketName , objectName , md , ( ) => {
658+ const req = {
659+ bucketName,
660+ namespace,
661+ objectKey : objectName ,
662+ headers : { 'x-amz-checksum-mode' : 'ENABLED' } ,
663+ url : `/${ bucketName } /${ objectName } ` ,
664+ query : { partNumber : '1' } ,
665+ } ;
666+ objectGet ( authInfo , req , false , log , ( err , _locator , headers ) => {
667+ assert . ifError ( err ) ;
668+ checksumAlgorithms . forEach ( ( { header } ) =>
669+ assert . strictEqual ( headers [ header ] , undefined ) ) ;
670+ assert . strictEqual ( headers [ 'x-amz-checksum-type' ] , undefined ) ;
671+ done ( ) ;
672+ } ) ;
673+ } ) ) ;
674+ } ) ;
675+ } ) ;
0 commit comments