From 38a99f65e071932becb5eea9b8552a9d02988b58 Mon Sep 17 00:00:00 2001 From: Elias-Serneels Date: Tue, 11 Jan 2022 18:25:03 +0100 Subject: [PATCH] Add support for multi-value headers in onResponse (#423) Co-authored-by: Elias Serneels (miaa Guard) --- lib/requestIterator.js | 24 +++++++++++++++--------- package.json | 2 ++ test/run.test.js | 23 +++++++++++++++++++++++ 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/lib/requestIterator.js b/lib/requestIterator.js index a8fa5761..7886e592 100644 --- a/lib/requestIterator.js +++ b/lib/requestIterator.js @@ -4,15 +4,21 @@ const hyperid = require('hyperid')(true) const inherits = require('util').inherits const requestBuilder = require('./httpRequestBuilder') const clone = require('lodash.clonedeep') - -const toHeaderKeyValue = (headersArray) => { - const headersKeyValue = {} - - for (let i = 0; i < headersArray.length - 1; ++i) { - headersKeyValue[headersArray[i]] = headersArray[i + 1] - } - - return headersKeyValue +const chunk = require('lodash.chunk') +const flatten = require('lodash.flatten') + +const toHeaderKeyValue = (rawHeaders) => { + const tupleHeaders = chunk(rawHeaders, 2) + const headers = {} + tupleHeaders.forEach((val) => { + const currentValue = headers[val[0]] + if (!currentValue) { + headers[val[0]] = val[1] + } else { + headers[val[0]] = flatten([currentValue, val[1]]) + } + }) + return headers } function RequestIterator (opts) { diff --git a/package.json b/package.json index 4ca76b85..325b9e8c 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,9 @@ "hdr-histogram-percentiles-obj": "^3.0.0", "http-parser-js": "^0.5.2", "hyperid": "^3.0.0", + "lodash.chunk": "^4.2.0", "lodash.clonedeep": "^4.5.0", + "lodash.flatten": "^4.4.0", "manage-path": "^2.0.0", "on-net-listen": "^1.1.1", "pretty-bytes": "^5.4.1", diff --git a/test/run.test.js b/test/run.test.js index fa1c57e0..ad33d8fc 100644 --- a/test/run.test.js +++ b/test/run.test.js @@ -940,3 +940,26 @@ test('should get headers passed from server onResponse callback', async t => { t.end() }) + +test('should get multi-value headers passed from server onResponse callback', async t => { + t.plan(3) + const server = helper.startServer({ responses: [{ statusCode: 200, body: 'ok', headers: { 'set-cookie': [123, 456, 789] } }] }) + + await initJob({ + url: 'http://localhost:' + server.address().port, + connections: 1, + amount: 1, + requests: [ + { + method: 'GET', + onResponse (status, body, context, headers) { + t.same(status, 200) + t.same(body, 'ok') + t.same(headers['set-cookie'], [123, 456, 789]) + } + } + ] + }) + + t.end() +})