diff --git a/lib/pxcontext.js b/lib/pxcontext.js index 9f349f7..242aeb4 100644 --- a/lib/pxcontext.js +++ b/lib/pxcontext.js @@ -3,6 +3,7 @@ const { v4: uuidv4 } = require('uuid'); const { CookieOrigin } = require('./enums/CookieOrigin'); const pxUtil = require('./pxutil'); const pxJWT = require('./pxjwt'); +const constants = require('./utils/constants'); class PxContext { constructor(config, req, additionalFields) { @@ -43,7 +44,13 @@ class PxContext { } else { let cookies = req.cookies; if (config.CUSTOM_COOKIE_HEADER && req.headers[config.CUSTOM_COOKIE_HEADER]) { - cookies = pxUtil.parseCookieHeader(req.headers[config.CUSTOM_COOKIE_HEADER]); + const customCookies = pxUtil.parseCookieHeader(req.headers[config.CUSTOM_COOKIE_HEADER]); + if (customCookies) { + const customCookieString = JSON.stringify(customCookies); + const cookiesHeaderString = JSON.stringify(cookies); + const cookiesString = [cookiesHeaderString, customCookieString].filter(Boolean).join(constants.COOKIE_SEPARATOR); + cookies = this.cookieStringToUniqueObject(cookiesString); + } } this.requestCookieNames = Object.keys(cookies); @@ -147,6 +154,19 @@ class PxContext { // eslint-disable-next-line eqeqeq return (this.pxde && this.pxde['breached_account'] && this.pxdeVerified) != null; } + + cookieStringToUniqueObject(cookiesString) { + if (!cookiesString) { + return {}; + } + const mergedString = this.mergeCookieStrings(cookiesString); + return Object.assign({}, ...Object.entries(JSON.parse(mergedString)).map(([key, value]) => ({ [key]: value }))); + } + + mergeCookieStrings(cookieString) { + const [cookiesHeader, customCookies] = cookieString.split(constants.COOKIE_SEPARATOR).map(JSON.parse); + return JSON.stringify({ ...cookiesHeader, ...customCookies }); + } } module.exports = PxContext; diff --git a/lib/utils/constants.js b/lib/utils/constants.js index a71e60f..aa8de74 100644 --- a/lib/utils/constants.js +++ b/lib/utils/constants.js @@ -34,6 +34,7 @@ const TOKEN_SEPARATOR = '.'; const APP_USER_ID_FIELD_NAME = 'app_user_id'; const JWT_ADDITIONAL_FIELDS_FIELD_NAME = 'jwt_additional_fields'; const CROSS_TAB_SESSION = 'cross_tab_session'; +const COOKIE_SEPARATOR = ';'; module.exports = { MILLISECONDS_IN_SECOND, @@ -64,4 +65,5 @@ module.exports = { APP_USER_ID_FIELD_NAME, JWT_ADDITIONAL_FIELDS_FIELD_NAME, CROSS_TAB_SESSION, + COOKIE_SEPARATOR, };