import debugLib from 'debug';
import msUrlTokenDecode from '../msUrlTokenDecode';
const CHUNKS_PREFIX = 'chunks-';
const debug = debugLib('SlimmingWorld:readChunkedCookie');
/**
* Reads a cookie stored by ASP.NET core ChunkingCookieManager
* @param cookieStore {Object} an object containing all cookies
* @param cookieName {string} the name of the cookie to read
*
* @returns {Buffer|null} A buffer containing the cookie payload if set, null otherwise
*/
function readChunkedCookie(cookieStore, cookieName) {
if (!cookieStore || !cookieStore[cookieName]) {
return null;
}
let payload = cookieStore[cookieName];
if (payload.slice(0, CHUNKS_PREFIX.length) === CHUNKS_PREFIX) {
const numChunksMatch = payload.match(/^chunks-(\d+)/);
if (!numChunksMatch) {
debug('Warning: Cannot extract number of chunks from cookie');
return null;
}
const numChunks = parseInt(numChunksMatch[1], 10);
payload = '';
for (let i = 1; i <= numChunks; i++) {
const chunkCookiePayload = cookieStore[`${cookieName}C${i}`];
if (!chunkCookiePayload) {
debug(`Warning: could not find cookie chunk #${i}`);
return null;
}
payload += chunkCookiePayload;
}
}
return msUrlTokenDecode(payload);
}
export default readChunkedCookie;