X-Git-Url: http://git.squeep.com/?p=squeep-api-dingus;a=blobdiff_plain;f=lib%2Fcommon.js;fp=lib%2Fcommon.js;h=162b751ef23805d30bbf97eb71a69f367adf3d59;hp=6b72129223cf88e8248706afa5679f853eb5d5ae;hb=0c4ba588448691056be3bab76cfc478a7f8ca320;hpb=b1c646fce3ad04c3c35796f4c57acf8157ea3291 diff --git a/lib/common.js b/lib/common.js index 6b72129..162b751 100644 --- a/lib/common.js +++ b/lib/common.js @@ -194,7 +194,68 @@ const unfoldHeaderLines = (lines) => { return lines; }; +/** + * Adds a new cookie. + * @param {http.ServerResponse} res + * @param {String} name + * @param {String} value + * @param {Object=} opt + * @param {String=} opt.domain + * @param {Date=} opt.expires + * @param {Boolean=} opt.httpOnly + * @param {Number=} opt.maxAge + * @param {String=} opt.path + * @param {String=} opt.sameSite + * @param {Boolean=} opt.secure + */ +function addCookie(res, name, value, opt = {}) { + const options = { + domain: undefined, + expires: undefined, + httpOnly: false, + maxAge: undefined, + path: undefined, + sameSite: undefined, + secure: false, + ...opt, + }; + // TODO: validate name, value + const cookieParts = [ + `${name}=${value}`, + ]; + if (options.domain) { + cookieParts.push(`Domain=${options.domain}`); + } + if (options.expires) { + if (!(options.expires instanceof Date)) { + throw new TypeError('cookie expires must be Date'); + } + cookieParts.push(`Expires=${options.expires.toUTCString()}`); + } + if (options.httpOnly) { + cookieParts.push('HttpOnly'); + } + if (options.maxAge) { + cookieParts.push(`Max-Age=${options.maxAge}`); + } + if (options.path) { + cookieParts.push(`Path=${options.path}`); + } + if (options.sameSite) { + if (!(['Strict', 'Lax', 'None'].includes(options.sameSite))) { + throw new RangeError('cookie sameSite value not valid'); + } + cookieParts.push(`SameSite=${options.sameSite}`); + } + if (options.secure) { + cookieParts.push('Secure'); + } + res.appendHeader(Enum.Header.SetCookie, cookieParts.join('; ')); +} + + module.exports = { + addCookie, fileScope, generateETag, get,