@@ -458,6 +458,73 @@ test('Should handle 206 partial content - bad-etag', async t => {
458458 }
459459} )
460460
461+ test ( '#4970 - Should reject resumed partial content when body exceeds Content-Range' , async t => {
462+ t = tspl ( t , { plan : 5 } )
463+
464+ let x = 0
465+ const injectedResponse = 'HTTP/1.1 302 Found\r\nLocation: http://evil.com\r\nContent-Length: 0\r\n\r\n'
466+ const server = createServer ( { joinDuplicateHeaders : true } , ( req , res ) => {
467+ if ( x === 0 ) {
468+ t . ok ( true , 'pass' )
469+ res . setHeader ( 'content-length' , '5' )
470+ res . setHeader ( 'etag' , '123' )
471+ res . write ( 'use' )
472+ setTimeout ( ( ) => {
473+ res . destroy ( )
474+ } , 1e2 )
475+ } else if ( x === 1 ) {
476+ t . deepStrictEqual ( req . headers . range , 'bytes=3-4' )
477+ t . deepStrictEqual ( req . headers [ 'if-match' ] , '123' )
478+ res . statusCode = 206
479+ res . setHeader ( 'etag' , '123' )
480+ res . setHeader ( 'content-range' , 'bytes 3-4/5' )
481+ res . end ( `r1${ injectedResponse } ` )
482+ }
483+ x ++
484+ } )
485+
486+ const requestOptions = {
487+ method : 'GET' ,
488+ path : '/' ,
489+ headers : {
490+ 'content-type' : 'application/json'
491+ } ,
492+ retryOptions : {
493+ retry : ( err , { state, opts } , done ) => {
494+ if ( err . message . includes ( 'other side closed' ) ) {
495+ setTimeout ( done , 100 )
496+ return
497+ }
498+
499+ return done ( err )
500+ }
501+ }
502+ }
503+
504+ server . listen ( 0 )
505+
506+ await once ( server , 'listening' )
507+
508+ const client = new Client (
509+ `http://localhost:${ server . address ( ) . port } `
510+ ) . compose ( retry ( ) )
511+
512+ after ( async ( ) => {
513+ await client . close ( )
514+ server . close ( )
515+
516+ await once ( server , 'close' )
517+ } )
518+
519+ const response = await client . request ( requestOptions )
520+ t . strictEqual ( response . statusCode , 200 )
521+ await t . rejects ( response . body . text ( ) , {
522+ name : 'RequestRetryError' ,
523+ code : 'UND_ERR_REQ_RETRY' ,
524+ message : 'Content-Range mismatch'
525+ } )
526+ } )
527+
461528test ( 'retrying a request with a body' , async t => {
462529 t = tspl ( t , { plan : 2 } )
463530 let counter = 0
0 commit comments