diff --git a/src/execute/oas3/parameter-builders.js b/src/execute/oas3/parameter-builders.js index 1f01d9cd2..91e78751a 100644 --- a/src/execute/oas3/parameter-builders.js +++ b/src/execute/oas3/parameter-builders.js @@ -106,6 +106,10 @@ export function header({ req, parameter, value }) { } } +const appendCookie = (req, cookieString) => { + req.headers.Cookie = req.headers.Cookie ? `${req.headers.Cookie}; ${cookieString}` : cookieString; +}; + export function cookie({ req, parameter, value }) { const { name: cookieName } = parameter; @@ -115,7 +119,7 @@ export function cookie({ req, parameter, value }) { const effectiveMediaType = Object.keys(parameter.content)[0]; const cookieValue = serialize(value, effectiveMediaType); - req.headers.Cookie = serializeCookie({ [cookieName]: cookieValue }); + appendCookie(req, serializeCookie({ [cookieName]: cookieValue })); return; } @@ -132,6 +136,6 @@ export function cookie({ req, parameter, value }) { ? `${cookieName}=${serializedValue}` : serializedValue; - req.headers.Cookie = serializeCookie({ [cookieName]: cookieValue }); + appendCookie(req, serializeCookie({ [cookieName]: cookieValue })); } } diff --git a/test/oas3/execute/style-explode/cookie.js b/test/oas3/execute/style-explode/cookie.js index ca442c7e3..662db206a 100644 --- a/test/oas3/execute/style-explode/cookie.js +++ b/test/oas3/execute/style-explode/cookie.js @@ -368,4 +368,62 @@ describe('OAS 3.0 - buildRequest w/ `style` & `explode` - cookie parameters', () }); }); }); + + describe('multiple cookie parameters', () => { + test('should build all cookie parameters into a single Cookie header', () => { + // Given + const spec = { + openapi: '3.0.4', + paths: { + '/users': { + get: { + operationId: 'myOperation', + parameters: [ + { + name: 'c1', + in: 'cookie', + }, + { + name: 'c2', + in: 'cookie', + explode: true, + }, + { + name: 'c3', + in: 'cookie', + content: { + 'application/json': { + schema: { + type: 'object', + }, + }, + }, + }, + ], + }, + }, + }, + }; + + // when + const req = buildRequest({ + spec, + operationId: 'myOperation', + parameters: { + c1: 'v1', + c2: ['a', 'b'], + c3: { a: 1 }, + }, + }); + + expect(req).toEqual({ + method: 'GET', + url: '/users', + credentials: 'same-origin', + headers: { + Cookie: 'c1=v1; c2=c2%3Da%26c2%3Db; c3={%22a%22:1}', + }, + }); + }); + }); });