@@ -876,3 +876,106 @@ test('Should be able to properly pass the minTimeout to the RetryContext when co
876876
877877 await t . completed
878878} )
879+ test ( 'Issue#2986 - Handle custom 206' , { only : true } , async t => {
880+ t = tspl ( t , { plan : 8 } )
881+
882+ const chunks = [ ]
883+ let counter = 0
884+
885+ // Took from: https://github.com/nxtedition/nxt-lib/blob/4b001ebc2f22cf735a398f35ff800dd553fe5933/test/undici/retry.js#L47
886+ let x = 0
887+ const server = createServer ( ( req , res ) => {
888+ if ( x === 0 ) {
889+ t . deepStrictEqual ( req . headers . range , 'bytes=0-3' )
890+ res . setHeader ( 'etag' , 'asd' )
891+ res . write ( 'abc' )
892+ setTimeout ( ( ) => {
893+ res . destroy ( )
894+ } , 1e2 )
895+ } else if ( x === 1 ) {
896+ t . deepStrictEqual ( req . headers . range , 'bytes=3-' )
897+ res . setHeader ( 'content-range' , 'bytes 3-6/6' )
898+ res . setHeader ( 'etag' , 'asd' )
899+ res . statusCode = 206
900+ res . end ( 'def' )
901+ }
902+ x ++
903+ } )
904+
905+ const dispatchOptions = {
906+ retryOptions : {
907+ retry : function ( err , _ , done ) {
908+ counter ++
909+
910+ if ( err . code && err . code === 'UND_ERR_DESTROYED' ) {
911+ return done ( false )
912+ }
913+
914+ if ( err . statusCode === 206 ) return done ( err )
915+
916+ setTimeout ( done , 800 )
917+ }
918+ } ,
919+ method : 'GET' ,
920+ path : '/' ,
921+ headers : {
922+ 'content-type' : 'application/json'
923+ }
924+ }
925+
926+ server . listen ( 0 , ( ) => {
927+ const client = new Client ( `http://localhost:${ server . address ( ) . port } ` )
928+ const handler = new RetryHandler ( dispatchOptions , {
929+ dispatch : ( ...args ) => {
930+ return client . dispatch ( ...args )
931+ } ,
932+ handler : {
933+ onRequestSent ( ) {
934+ t . ok ( true , 'pass' )
935+ } ,
936+ onConnect ( ) {
937+ t . ok ( true , 'pass' )
938+ } ,
939+ onBodySent ( ) {
940+ t . ok ( true , 'pass' )
941+ } ,
942+ onHeaders ( status , _rawHeaders , resume , _statusMessage ) {
943+ t . strictEqual ( status , 200 )
944+ return true
945+ } ,
946+ onData ( chunk ) {
947+ chunks . push ( chunk )
948+ return true
949+ } ,
950+ onComplete ( ) {
951+ t . strictEqual ( Buffer . concat ( chunks ) . toString ( 'utf-8' ) , 'abcdef' )
952+ t . strictEqual ( counter , 1 )
953+ } ,
954+ onError ( ) {
955+ t . fail ( )
956+ }
957+ }
958+ } )
959+
960+ client . dispatch (
961+ {
962+ method : 'GET' ,
963+ path : '/' ,
964+ headers : {
965+ 'content-type' : 'application/json' ,
966+ Range : 'bytes=0-3'
967+ }
968+ } ,
969+ handler
970+ )
971+
972+ after ( async ( ) => {
973+ await client . close ( )
974+
975+ server . close ( )
976+ await once ( server , 'close' )
977+ } )
978+ } )
979+
980+ await t . completed
981+ } )
0 commit comments