diff --git a/packages/repeater/src/request-runner/Request.spec.ts b/packages/repeater/src/request-runner/Request.spec.ts index 16613a24..61df7918 100644 --- a/packages/repeater/src/request-runner/Request.spec.ts +++ b/packages/repeater/src/request-runner/Request.spec.ts @@ -84,5 +84,18 @@ describe('Request', () => { 'x-a2': 'a2' }); }); + + it('should join headers if multiple values is present', () => { + const request = new Request({ + url: 'http://foo.bar', + protocol: Protocol.HTTP + }); + + request.setHeaders({ host: ['example.com', 'example1.com'] }); + + expect(request.headers).toEqual({ + host: 'example.com, example1.com' + }); + }); }); }); diff --git a/packages/repeater/src/request-runner/Request.ts b/packages/repeater/src/request-runner/Request.ts index c7af8694..176ba768 100644 --- a/packages/repeater/src/request-runner/Request.ts +++ b/packages/repeater/src/request-runner/Request.ts @@ -11,6 +11,22 @@ export interface RequestOptions { } export class Request { + public static readonly SINGLE_VALUE_HEADERS: ReadonlySet = + new Set([ + 'authorization', + 'content-disposition', + 'content-length', + 'content-type', + 'from', + 'host', + 'if-modified-since', + 'if-unmodified-since', + 'location', + 'max-forwards', + 'proxy-authorization', + 'referer', + 'user-agent' + ]); public readonly protocol: Protocol; public readonly url: string; public readonly body?: string; @@ -46,16 +62,28 @@ export class Request { this.url = url; this.correlationIdRegex = this.normalizeCorrelationIdRegex(correlationIdRegex); - this._headers = headers; + this.setHeaders(headers); this.precheckBody(body); this.body = body; } public setHeaders(headers: Record): void { - this._headers = { + const mergedHeaders = { ...this._headers, ...headers }; + + this._headers = Object.fromEntries( + Object.entries(mergedHeaders).map( + ([field, value]: [string, string | string[]]) => [ + field, + Array.isArray(value) && + Request.SINGLE_VALUE_HEADERS.has(field.toLowerCase()) + ? value.join(', ') + : value + ] + ) + ); } private validateUrl(url: string): void {