Spaces:
Runtime error
Runtime error
| const { parseSetCookie } = require('./parse') | |
| const { stringify, getHeadersList } = require('./util') | |
| const { webidl } = require('../fetch/webidl') | |
| const { Headers } = require('../fetch/headers') | |
| /** | |
| * @typedef {Object} Cookie | |
| * @property {string} name | |
| * @property {string} value | |
| * @property {Date|number|undefined} expires | |
| * @property {number|undefined} maxAge | |
| * @property {string|undefined} domain | |
| * @property {string|undefined} path | |
| * @property {boolean|undefined} secure | |
| * @property {boolean|undefined} httpOnly | |
| * @property {'Strict'|'Lax'|'None'} sameSite | |
| * @property {string[]} unparsed | |
| */ | |
| /** | |
| * @param {Headers} headers | |
| * @returns {Record<string, string>} | |
| */ | |
| function getCookies (headers) { | |
| webidl.argumentLengthCheck(arguments, 1, { header: 'getCookies' }) | |
| webidl.brandCheck(headers, Headers, { strict: false }) | |
| const cookie = headers.get('cookie') | |
| const out = {} | |
| if (!cookie) { | |
| return out | |
| } | |
| for (const piece of cookie.split(';')) { | |
| const [name, ...value] = piece.split('=') | |
| out[name.trim()] = value.join('=') | |
| } | |
| return out | |
| } | |
| /** | |
| * @param {Headers} headers | |
| * @param {string} name | |
| * @param {{ path?: string, domain?: string }|undefined} attributes | |
| * @returns {void} | |
| */ | |
| function deleteCookie (headers, name, attributes) { | |
| webidl.argumentLengthCheck(arguments, 2, { header: 'deleteCookie' }) | |
| webidl.brandCheck(headers, Headers, { strict: false }) | |
| name = webidl.converters.DOMString(name) | |
| attributes = webidl.converters.DeleteCookieAttributes(attributes) | |
| // Matches behavior of | |
| // https://github.com/denoland/deno_std/blob/63827b16330b82489a04614027c33b7904e08be5/http/cookie.ts#L278 | |
| setCookie(headers, { | |
| name, | |
| value: '', | |
| expires: new Date(0), | |
| ...attributes | |
| }) | |
| } | |
| /** | |
| * @param {Headers} headers | |
| * @returns {Cookie[]} | |
| */ | |
| function getSetCookies (headers) { | |
| webidl.argumentLengthCheck(arguments, 1, { header: 'getSetCookies' }) | |
| webidl.brandCheck(headers, Headers, { strict: false }) | |
| const cookies = getHeadersList(headers).cookies | |
| if (!cookies) { | |
| return [] | |
| } | |
| // In older versions of undici, cookies is a list of name:value. | |
| return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair)) | |
| } | |
| /** | |
| * @param {Headers} headers | |
| * @param {Cookie} cookie | |
| * @returns {void} | |
| */ | |
| function setCookie (headers, cookie) { | |
| webidl.argumentLengthCheck(arguments, 2, { header: 'setCookie' }) | |
| webidl.brandCheck(headers, Headers, { strict: false }) | |
| cookie = webidl.converters.Cookie(cookie) | |
| const str = stringify(cookie) | |
| if (str) { | |
| headers.append('Set-Cookie', stringify(cookie)) | |
| } | |
| } | |
| webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ | |
| { | |
| converter: webidl.nullableConverter(webidl.converters.DOMString), | |
| key: 'path', | |
| defaultValue: null | |
| }, | |
| { | |
| converter: webidl.nullableConverter(webidl.converters.DOMString), | |
| key: 'domain', | |
| defaultValue: null | |
| } | |
| ]) | |
| webidl.converters.Cookie = webidl.dictionaryConverter([ | |
| { | |
| converter: webidl.converters.DOMString, | |
| key: 'name' | |
| }, | |
| { | |
| converter: webidl.converters.DOMString, | |
| key: 'value' | |
| }, | |
| { | |
| converter: webidl.nullableConverter((value) => { | |
| if (typeof value === 'number') { | |
| return webidl.converters['unsigned long long'](value) | |
| } | |
| return new Date(value) | |
| }), | |
| key: 'expires', | |
| defaultValue: null | |
| }, | |
| { | |
| converter: webidl.nullableConverter(webidl.converters['long long']), | |
| key: 'maxAge', | |
| defaultValue: null | |
| }, | |
| { | |
| converter: webidl.nullableConverter(webidl.converters.DOMString), | |
| key: 'domain', | |
| defaultValue: null | |
| }, | |
| { | |
| converter: webidl.nullableConverter(webidl.converters.DOMString), | |
| key: 'path', | |
| defaultValue: null | |
| }, | |
| { | |
| converter: webidl.nullableConverter(webidl.converters.boolean), | |
| key: 'secure', | |
| defaultValue: null | |
| }, | |
| { | |
| converter: webidl.nullableConverter(webidl.converters.boolean), | |
| key: 'httpOnly', | |
| defaultValue: null | |
| }, | |
| { | |
| converter: webidl.converters.USVString, | |
| key: 'sameSite', | |
| allowedValues: ['Strict', 'Lax', 'None'] | |
| }, | |
| { | |
| converter: webidl.sequenceConverter(webidl.converters.DOMString), | |
| key: 'unparsed', | |
| defaultValue: [] | |
| } | |
| ]) | |
| module.exports = { | |
| getCookies, | |
| deleteCookie, | |
| getSetCookies, | |
| setCookie | |
| } | |