From 457c30eb89830d92c1697a987d0e84d0b1c0aec2 Mon Sep 17 00:00:00 2001 From: Tomas Della Vedova Date: Thu, 10 Sep 2020 15:22:33 +0200 Subject: [PATCH] Fix maxRetries request option handling (#1296) --- lib/Transport.js | 3 +- test/unit/transport.test.js | 92 +++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 1 deletion(-) diff --git a/lib/Transport.js b/lib/Transport.js index a53e73b03..b32ae8c9b 100644 --- a/lib/Transport.js +++ b/lib/Transport.js @@ -120,7 +120,8 @@ class Transport { // a copy of the stream to be able to send it again, but since we don't know in advance // the size of the stream, we risk to take too much memory. // Furthermore, copying everytime the stream is very a expensive operation. - const maxRetries = isStream(params.body) ? 0 : options.maxRetries || this.maxRetries + const maxRetries = isStream(params.body) || isStream(params.bulkBody) + ? 0 : (typeof options.maxRetries === 'number' ? options.maxRetries : this.maxRetries) const compression = options.compression !== undefined ? options.compression : this.compression var request = { abort: noop } diff --git a/test/unit/transport.test.js b/test/unit/transport.test.js index bdd9bdeb2..18a62a2ce 100644 --- a/test/unit/transport.test.js +++ b/test/unit/transport.test.js @@ -662,6 +662,98 @@ test('Should not retry if the body is a stream', t => { }) }) +test('Should not retry if the bulkBody is a stream', t => { + t.plan(2) + + var count = 0 + function handler (req, res) { + count++ + res.setHeader('Content-Type', 'application/json;utf=8') + res.statusCode = 504 + res.end(JSON.stringify({ error: true })) + } + + buildServer(handler, ({ port }, server) => { + const pool = new ConnectionPool({ Connection }) + pool.addConnection([{ + url: new URL(`http://localhost:${port}`), + id: 'node1' + }, { + url: new URL(`http://localhost:${port}`), + id: 'node2' + }, { + url: new URL(`http://localhost:${port}`), + id: 'node3' + }]) + + const transport = new Transport({ + emit: () => {}, + connectionPool: pool, + serializer: new Serializer(), + maxRetries: 1, + sniffInterval: false, + sniffOnStart: false + }) + + transport.request({ + method: 'POST', + path: '/hello', + bulkBody: intoStream(JSON.stringify([{ hello: 'world' }])) + }, (err, { body }) => { + t.ok(err instanceof ResponseError) + t.strictEqual(count, 1) + server.stop() + }) + }) +}) + +test('No retry', t => { + t.plan(2) + + var count = 0 + function handler (req, res) { + count++ + res.setHeader('Content-Type', 'application/json;utf=8') + res.statusCode = 504 + res.end(JSON.stringify({ error: true })) + } + + buildServer(handler, ({ port }, server) => { + const pool = new ConnectionPool({ Connection }) + pool.addConnection([{ + url: new URL(`http://localhost:${port}`), + id: 'node1' + }, { + url: new URL(`http://localhost:${port}`), + id: 'node2' + }, { + url: new URL(`http://localhost:${port}`), + id: 'node3' + }]) + + const transport = new Transport({ + emit: () => {}, + connectionPool: pool, + serializer: new Serializer(), + maxRetries: 3, + sniffInterval: false, + sniffOnStart: false + }) + + transport.request({ + method: 'POST', + path: '/hello', + body: intoStream(JSON.stringify({ hello: 'world' })) + }, { + maxRetries: 0 + }, (err, { body }) => { + t.ok(err instanceof ResponseError) + t.strictEqual(count, 1) + server.stop() + }) + }) +}) + test('Custom retry mechanism', t => { t.plan(2)