Skip to content

Commit 0ec5a40

Browse files
authored
fix(#2986): bad start check (#2992)
* fix: bad start check * refactor: remove unnecessary checks
1 parent 83f36b7 commit 0ec5a40

File tree

2 files changed

+105
-4
lines changed

2 files changed

+105
-4
lines changed

lib/handler/retry-handler.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -242,14 +242,12 @@ class RetryHandler {
242242
}
243243

244244
const { start, size, end = size } = range
245-
246245
assert(
247-
start != null && Number.isFinite(start) && this.start !== start,
246+
start != null && Number.isFinite(start),
248247
'content-range mismatch'
249248
)
250-
assert(Number.isFinite(start))
251249
assert(
252-
end != null && Number.isFinite(end) && this.end !== end,
250+
end != null && Number.isFinite(end),
253251
'invalid content-length'
254252
)
255253

test/retry-handler.js

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)