deepv-code 1.0.182 → 1.0.183
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/dvcode.js +635 -635
- package/package.json +1 -1
- package/bundle/assets/help/README.md +0 -113
- package/bundle/assets/sounds/README.md +0 -74
- package/bundle/node_modules/undici/LICENSE +0 -21
- package/bundle/node_modules/undici/README.md +0 -472
- package/bundle/node_modules/undici/docs/docs/api/Agent.md +0 -83
- package/bundle/node_modules/undici/docs/docs/api/BalancedPool.md +0 -99
- package/bundle/node_modules/undici/docs/docs/api/CacheStorage.md +0 -30
- package/bundle/node_modules/undici/docs/docs/api/CacheStore.md +0 -151
- package/bundle/node_modules/undici/docs/docs/api/Client.md +0 -281
- package/bundle/node_modules/undici/docs/docs/api/ClientStats.md +0 -27
- package/bundle/node_modules/undici/docs/docs/api/Connector.md +0 -115
- package/bundle/node_modules/undici/docs/docs/api/ContentType.md +0 -57
- package/bundle/node_modules/undici/docs/docs/api/Cookies.md +0 -101
- package/bundle/node_modules/undici/docs/docs/api/Debug.md +0 -62
- package/bundle/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +0 -204
- package/bundle/node_modules/undici/docs/docs/api/Dispatcher.md +0 -1200
- package/bundle/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +0 -159
- package/bundle/node_modules/undici/docs/docs/api/Errors.md +0 -49
- package/bundle/node_modules/undici/docs/docs/api/EventSource.md +0 -45
- package/bundle/node_modules/undici/docs/docs/api/Fetch.md +0 -52
- package/bundle/node_modules/undici/docs/docs/api/H2CClient.md +0 -262
- package/bundle/node_modules/undici/docs/docs/api/MockAgent.md +0 -603
- package/bundle/node_modules/undici/docs/docs/api/MockCallHistory.md +0 -197
- package/bundle/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +0 -43
- package/bundle/node_modules/undici/docs/docs/api/MockClient.md +0 -77
- package/bundle/node_modules/undici/docs/docs/api/MockErrors.md +0 -12
- package/bundle/node_modules/undici/docs/docs/api/MockPool.md +0 -548
- package/bundle/node_modules/undici/docs/docs/api/Pool.md +0 -84
- package/bundle/node_modules/undici/docs/docs/api/PoolStats.md +0 -35
- package/bundle/node_modules/undici/docs/docs/api/ProxyAgent.md +0 -227
- package/bundle/node_modules/undici/docs/docs/api/RedirectHandler.md +0 -96
- package/bundle/node_modules/undici/docs/docs/api/RetryAgent.md +0 -45
- package/bundle/node_modules/undici/docs/docs/api/RetryHandler.md +0 -117
- package/bundle/node_modules/undici/docs/docs/api/Util.md +0 -25
- package/bundle/node_modules/undici/docs/docs/api/WebSocket.md +0 -85
- package/bundle/node_modules/undici/docs/docs/api/api-lifecycle.md +0 -91
- package/bundle/node_modules/undici/docs/docs/best-practices/client-certificate.md +0 -64
- package/bundle/node_modules/undici/docs/docs/best-practices/mocking-request.md +0 -190
- package/bundle/node_modules/undici/docs/docs/best-practices/proxy.md +0 -127
- package/bundle/node_modules/undici/docs/docs/best-practices/writing-tests.md +0 -20
- package/bundle/node_modules/undici/index-fetch.js +0 -35
- package/bundle/node_modules/undici/index.d.ts +0 -3
- package/bundle/node_modules/undici/index.js +0 -183
- package/bundle/node_modules/undici/lib/api/abort-signal.js +0 -59
- package/bundle/node_modules/undici/lib/api/api-connect.js +0 -110
- package/bundle/node_modules/undici/lib/api/api-pipeline.js +0 -252
- package/bundle/node_modules/undici/lib/api/api-request.js +0 -199
- package/bundle/node_modules/undici/lib/api/api-stream.js +0 -209
- package/bundle/node_modules/undici/lib/api/api-upgrade.js +0 -110
- package/bundle/node_modules/undici/lib/api/index.js +0 -7
- package/bundle/node_modules/undici/lib/api/readable.js +0 -558
- package/bundle/node_modules/undici/lib/api/util.js +0 -95
- package/bundle/node_modules/undici/lib/cache/memory-cache-store.js +0 -234
- package/bundle/node_modules/undici/lib/cache/sqlite-cache-store.js +0 -461
- package/bundle/node_modules/undici/lib/core/connect.js +0 -164
- package/bundle/node_modules/undici/lib/core/constants.js +0 -143
- package/bundle/node_modules/undici/lib/core/diagnostics.js +0 -196
- package/bundle/node_modules/undici/lib/core/errors.js +0 -244
- package/bundle/node_modules/undici/lib/core/request.js +0 -397
- package/bundle/node_modules/undici/lib/core/symbols.js +0 -68
- package/bundle/node_modules/undici/lib/core/tree.js +0 -160
- package/bundle/node_modules/undici/lib/core/util.js +0 -988
- package/bundle/node_modules/undici/lib/dispatcher/agent.js +0 -135
- package/bundle/node_modules/undici/lib/dispatcher/balanced-pool.js +0 -206
- package/bundle/node_modules/undici/lib/dispatcher/client-h1.js +0 -1615
- package/bundle/node_modules/undici/lib/dispatcher/client-h2.js +0 -798
- package/bundle/node_modules/undici/lib/dispatcher/client.js +0 -614
- package/bundle/node_modules/undici/lib/dispatcher/dispatcher-base.js +0 -161
- package/bundle/node_modules/undici/lib/dispatcher/dispatcher.js +0 -48
- package/bundle/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +0 -151
- package/bundle/node_modules/undici/lib/dispatcher/fixed-queue.js +0 -159
- package/bundle/node_modules/undici/lib/dispatcher/h2c-client.js +0 -122
- package/bundle/node_modules/undici/lib/dispatcher/pool-base.js +0 -191
- package/bundle/node_modules/undici/lib/dispatcher/pool.js +0 -118
- package/bundle/node_modules/undici/lib/dispatcher/proxy-agent.js +0 -275
- package/bundle/node_modules/undici/lib/dispatcher/retry-agent.js +0 -35
- package/bundle/node_modules/undici/lib/global.js +0 -32
- package/bundle/node_modules/undici/lib/handler/cache-handler.js +0 -448
- package/bundle/node_modules/undici/lib/handler/cache-revalidation-handler.js +0 -124
- package/bundle/node_modules/undici/lib/handler/decorator-handler.js +0 -67
- package/bundle/node_modules/undici/lib/handler/redirect-handler.js +0 -227
- package/bundle/node_modules/undici/lib/handler/retry-handler.js +0 -342
- package/bundle/node_modules/undici/lib/handler/unwrap-handler.js +0 -96
- package/bundle/node_modules/undici/lib/handler/wrap-handler.js +0 -95
- package/bundle/node_modules/undici/lib/interceptor/cache.js +0 -372
- package/bundle/node_modules/undici/lib/interceptor/dns.js +0 -432
- package/bundle/node_modules/undici/lib/interceptor/dump.js +0 -111
- package/bundle/node_modules/undici/lib/interceptor/redirect.js +0 -21
- package/bundle/node_modules/undici/lib/interceptor/response-error.js +0 -95
- package/bundle/node_modules/undici/lib/interceptor/retry.js +0 -19
- package/bundle/node_modules/undici/lib/llhttp/.gitkeep +0 -0
- package/bundle/node_modules/undici/lib/llhttp/constants.d.ts +0 -97
- package/bundle/node_modules/undici/lib/llhttp/constants.js +0 -498
- package/bundle/node_modules/undici/lib/llhttp/constants.js.map +0 -1
- package/bundle/node_modules/undici/lib/llhttp/llhttp-wasm.js +0 -15
- package/bundle/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +0 -15
- package/bundle/node_modules/undici/lib/llhttp/utils.d.ts +0 -2
- package/bundle/node_modules/undici/lib/llhttp/utils.js +0 -15
- package/bundle/node_modules/undici/lib/llhttp/utils.js.map +0 -1
- package/bundle/node_modules/undici/lib/mock/mock-agent.js +0 -224
- package/bundle/node_modules/undici/lib/mock/mock-call-history.js +0 -248
- package/bundle/node_modules/undici/lib/mock/mock-client.js +0 -64
- package/bundle/node_modules/undici/lib/mock/mock-errors.js +0 -19
- package/bundle/node_modules/undici/lib/mock/mock-interceptor.js +0 -209
- package/bundle/node_modules/undici/lib/mock/mock-pool.js +0 -64
- package/bundle/node_modules/undici/lib/mock/mock-symbols.js +0 -31
- package/bundle/node_modules/undici/lib/mock/mock-utils.js +0 -433
- package/bundle/node_modules/undici/lib/mock/pending-interceptors-formatter.js +0 -43
- package/bundle/node_modules/undici/lib/util/cache.js +0 -368
- package/bundle/node_modules/undici/lib/util/date.js +0 -259
- package/bundle/node_modules/undici/lib/util/stats.js +0 -32
- package/bundle/node_modules/undici/lib/util/timers.js +0 -423
- package/bundle/node_modules/undici/lib/web/cache/cache.js +0 -862
- package/bundle/node_modules/undici/lib/web/cache/cachestorage.js +0 -152
- package/bundle/node_modules/undici/lib/web/cache/util.js +0 -45
- package/bundle/node_modules/undici/lib/web/cookies/constants.js +0 -12
- package/bundle/node_modules/undici/lib/web/cookies/index.js +0 -199
- package/bundle/node_modules/undici/lib/web/cookies/parse.js +0 -322
- package/bundle/node_modules/undici/lib/web/cookies/util.js +0 -282
- package/bundle/node_modules/undici/lib/web/eventsource/eventsource-stream.js +0 -399
- package/bundle/node_modules/undici/lib/web/eventsource/eventsource.js +0 -484
- package/bundle/node_modules/undici/lib/web/eventsource/util.js +0 -37
- package/bundle/node_modules/undici/lib/web/fetch/LICENSE +0 -21
- package/bundle/node_modules/undici/lib/web/fetch/body.js +0 -532
- package/bundle/node_modules/undici/lib/web/fetch/constants.js +0 -131
- package/bundle/node_modules/undici/lib/web/fetch/data-url.js +0 -744
- package/bundle/node_modules/undici/lib/web/fetch/dispatcher-weakref.js +0 -46
- package/bundle/node_modules/undici/lib/web/fetch/formdata-parser.js +0 -501
- package/bundle/node_modules/undici/lib/web/fetch/formdata.js +0 -263
- package/bundle/node_modules/undici/lib/web/fetch/global.js +0 -40
- package/bundle/node_modules/undici/lib/web/fetch/headers.js +0 -719
- package/bundle/node_modules/undici/lib/web/fetch/index.js +0 -2258
- package/bundle/node_modules/undici/lib/web/fetch/request.js +0 -1099
- package/bundle/node_modules/undici/lib/web/fetch/response.js +0 -636
- package/bundle/node_modules/undici/lib/web/fetch/util.js +0 -1782
- package/bundle/node_modules/undici/lib/web/fetch/webidl.js +0 -740
- package/bundle/node_modules/undici/lib/web/websocket/connection.js +0 -325
- package/bundle/node_modules/undici/lib/web/websocket/constants.js +0 -126
- package/bundle/node_modules/undici/lib/web/websocket/events.js +0 -331
- package/bundle/node_modules/undici/lib/web/websocket/frame.js +0 -138
- package/bundle/node_modules/undici/lib/web/websocket/permessage-deflate.js +0 -70
- package/bundle/node_modules/undici/lib/web/websocket/receiver.js +0 -454
- package/bundle/node_modules/undici/lib/web/websocket/sender.js +0 -109
- package/bundle/node_modules/undici/lib/web/websocket/stream/websocketerror.js +0 -83
- package/bundle/node_modules/undici/lib/web/websocket/stream/websocketstream.js +0 -485
- package/bundle/node_modules/undici/lib/web/websocket/util.js +0 -338
- package/bundle/node_modules/undici/lib/web/websocket/websocket.js +0 -686
- package/bundle/node_modules/undici/package.json +0 -149
- package/bundle/node_modules/undici/scripts/strip-comments.js +0 -10
- package/bundle/node_modules/undici/types/README.md +0 -6
- package/bundle/node_modules/undici/types/agent.d.ts +0 -35
- package/bundle/node_modules/undici/types/api.d.ts +0 -43
- package/bundle/node_modules/undici/types/balanced-pool.d.ts +0 -29
- package/bundle/node_modules/undici/types/cache-interceptor.d.ts +0 -172
- package/bundle/node_modules/undici/types/cache.d.ts +0 -36
- package/bundle/node_modules/undici/types/client-stats.d.ts +0 -15
- package/bundle/node_modules/undici/types/client.d.ts +0 -110
- package/bundle/node_modules/undici/types/connector.d.ts +0 -34
- package/bundle/node_modules/undici/types/content-type.d.ts +0 -21
- package/bundle/node_modules/undici/types/cookies.d.ts +0 -30
- package/bundle/node_modules/undici/types/diagnostics-channel.d.ts +0 -66
- package/bundle/node_modules/undici/types/dispatcher.d.ts +0 -281
- package/bundle/node_modules/undici/types/env-http-proxy-agent.d.ts +0 -21
- package/bundle/node_modules/undici/types/errors.d.ts +0 -171
- package/bundle/node_modules/undici/types/eventsource.d.ts +0 -61
- package/bundle/node_modules/undici/types/fetch.d.ts +0 -210
- package/bundle/node_modules/undici/types/formdata.d.ts +0 -108
- package/bundle/node_modules/undici/types/global-dispatcher.d.ts +0 -9
- package/bundle/node_modules/undici/types/global-origin.d.ts +0 -7
- package/bundle/node_modules/undici/types/h2c-client.d.ts +0 -75
- package/bundle/node_modules/undici/types/handlers.d.ts +0 -15
- package/bundle/node_modules/undici/types/header.d.ts +0 -160
- package/bundle/node_modules/undici/types/index.d.ts +0 -75
- package/bundle/node_modules/undici/types/interceptors.d.ts +0 -34
- package/bundle/node_modules/undici/types/mock-agent.d.ts +0 -68
- package/bundle/node_modules/undici/types/mock-call-history.d.ts +0 -111
- package/bundle/node_modules/undici/types/mock-client.d.ts +0 -25
- package/bundle/node_modules/undici/types/mock-errors.d.ts +0 -12
- package/bundle/node_modules/undici/types/mock-interceptor.d.ts +0 -93
- package/bundle/node_modules/undici/types/mock-pool.d.ts +0 -25
- package/bundle/node_modules/undici/types/patch.d.ts +0 -29
- package/bundle/node_modules/undici/types/pool-stats.d.ts +0 -19
- package/bundle/node_modules/undici/types/pool.d.ts +0 -41
- package/bundle/node_modules/undici/types/proxy-agent.d.ts +0 -29
- package/bundle/node_modules/undici/types/readable.d.ts +0 -68
- package/bundle/node_modules/undici/types/retry-agent.d.ts +0 -8
- package/bundle/node_modules/undici/types/retry-handler.d.ts +0 -116
- package/bundle/node_modules/undici/types/util.d.ts +0 -18
- package/bundle/node_modules/undici/types/utility.d.ts +0 -7
- package/bundle/node_modules/undici/types/webidl.d.ts +0 -266
- package/bundle/node_modules/undici/types/websocket.d.ts +0 -184
|
@@ -1,322 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const { maxNameValuePairSize, maxAttributeValueSize } = require('./constants')
|
|
4
|
-
const { isCTLExcludingHtab } = require('./util')
|
|
5
|
-
const { collectASequenceOfCodePointsFast } = require('../fetch/data-url')
|
|
6
|
-
const assert = require('node:assert')
|
|
7
|
-
const { unescape } = require('node:querystring')
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* @description Parses the field-value attributes of a set-cookie header string.
|
|
11
|
-
* @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4
|
|
12
|
-
* @param {string} header
|
|
13
|
-
* @returns {import('./index').Cookie|null} if the header is invalid, null will be returned
|
|
14
|
-
*/
|
|
15
|
-
function parseSetCookie (header) {
|
|
16
|
-
// 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F
|
|
17
|
-
// character (CTL characters excluding HTAB): Abort these steps and
|
|
18
|
-
// ignore the set-cookie-string entirely.
|
|
19
|
-
if (isCTLExcludingHtab(header)) {
|
|
20
|
-
return null
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
let nameValuePair = ''
|
|
24
|
-
let unparsedAttributes = ''
|
|
25
|
-
let name = ''
|
|
26
|
-
let value = ''
|
|
27
|
-
|
|
28
|
-
// 2. If the set-cookie-string contains a %x3B (";") character:
|
|
29
|
-
if (header.includes(';')) {
|
|
30
|
-
// 1. The name-value-pair string consists of the characters up to,
|
|
31
|
-
// but not including, the first %x3B (";"), and the unparsed-
|
|
32
|
-
// attributes consist of the remainder of the set-cookie-string
|
|
33
|
-
// (including the %x3B (";") in question).
|
|
34
|
-
const position = { position: 0 }
|
|
35
|
-
|
|
36
|
-
nameValuePair = collectASequenceOfCodePointsFast(';', header, position)
|
|
37
|
-
unparsedAttributes = header.slice(position.position)
|
|
38
|
-
} else {
|
|
39
|
-
// Otherwise:
|
|
40
|
-
|
|
41
|
-
// 1. The name-value-pair string consists of all the characters
|
|
42
|
-
// contained in the set-cookie-string, and the unparsed-
|
|
43
|
-
// attributes is the empty string.
|
|
44
|
-
nameValuePair = header
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// 3. If the name-value-pair string lacks a %x3D ("=") character, then
|
|
48
|
-
// the name string is empty, and the value string is the value of
|
|
49
|
-
// name-value-pair.
|
|
50
|
-
if (!nameValuePair.includes('=')) {
|
|
51
|
-
value = nameValuePair
|
|
52
|
-
} else {
|
|
53
|
-
// Otherwise, the name string consists of the characters up to, but
|
|
54
|
-
// not including, the first %x3D ("=") character, and the (possibly
|
|
55
|
-
// empty) value string consists of the characters after the first
|
|
56
|
-
// %x3D ("=") character.
|
|
57
|
-
const position = { position: 0 }
|
|
58
|
-
name = collectASequenceOfCodePointsFast(
|
|
59
|
-
'=',
|
|
60
|
-
nameValuePair,
|
|
61
|
-
position
|
|
62
|
-
)
|
|
63
|
-
value = nameValuePair.slice(position.position + 1)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// 4. Remove any leading or trailing WSP characters from the name
|
|
67
|
-
// string and the value string.
|
|
68
|
-
name = name.trim()
|
|
69
|
-
value = value.trim()
|
|
70
|
-
|
|
71
|
-
// 5. If the sum of the lengths of the name string and the value string
|
|
72
|
-
// is more than 4096 octets, abort these steps and ignore the set-
|
|
73
|
-
// cookie-string entirely.
|
|
74
|
-
if (name.length + value.length > maxNameValuePairSize) {
|
|
75
|
-
return null
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// 6. The cookie-name is the name string, and the cookie-value is the
|
|
79
|
-
// value string.
|
|
80
|
-
// https://datatracker.ietf.org/doc/html/rfc6265
|
|
81
|
-
// To maximize compatibility with user agents, servers that wish to
|
|
82
|
-
// store arbitrary data in a cookie-value SHOULD encode that data, for
|
|
83
|
-
// example, using Base64 [RFC4648].
|
|
84
|
-
return {
|
|
85
|
-
name, value: unescape(value), ...parseUnparsedAttributes(unparsedAttributes)
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Parses the remaining attributes of a set-cookie header
|
|
91
|
-
* @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4
|
|
92
|
-
* @param {string} unparsedAttributes
|
|
93
|
-
* @param {Object.<string, unknown>} [cookieAttributeList={}]
|
|
94
|
-
*/
|
|
95
|
-
function parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) {
|
|
96
|
-
// 1. If the unparsed-attributes string is empty, skip the rest of
|
|
97
|
-
// these steps.
|
|
98
|
-
if (unparsedAttributes.length === 0) {
|
|
99
|
-
return cookieAttributeList
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// 2. Discard the first character of the unparsed-attributes (which
|
|
103
|
-
// will be a %x3B (";") character).
|
|
104
|
-
assert(unparsedAttributes[0] === ';')
|
|
105
|
-
unparsedAttributes = unparsedAttributes.slice(1)
|
|
106
|
-
|
|
107
|
-
let cookieAv = ''
|
|
108
|
-
|
|
109
|
-
// 3. If the remaining unparsed-attributes contains a %x3B (";")
|
|
110
|
-
// character:
|
|
111
|
-
if (unparsedAttributes.includes(';')) {
|
|
112
|
-
// 1. Consume the characters of the unparsed-attributes up to, but
|
|
113
|
-
// not including, the first %x3B (";") character.
|
|
114
|
-
cookieAv = collectASequenceOfCodePointsFast(
|
|
115
|
-
';',
|
|
116
|
-
unparsedAttributes,
|
|
117
|
-
{ position: 0 }
|
|
118
|
-
)
|
|
119
|
-
unparsedAttributes = unparsedAttributes.slice(cookieAv.length)
|
|
120
|
-
} else {
|
|
121
|
-
// Otherwise:
|
|
122
|
-
|
|
123
|
-
// 1. Consume the remainder of the unparsed-attributes.
|
|
124
|
-
cookieAv = unparsedAttributes
|
|
125
|
-
unparsedAttributes = ''
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Let the cookie-av string be the characters consumed in this step.
|
|
129
|
-
|
|
130
|
-
let attributeName = ''
|
|
131
|
-
let attributeValue = ''
|
|
132
|
-
|
|
133
|
-
// 4. If the cookie-av string contains a %x3D ("=") character:
|
|
134
|
-
if (cookieAv.includes('=')) {
|
|
135
|
-
// 1. The (possibly empty) attribute-name string consists of the
|
|
136
|
-
// characters up to, but not including, the first %x3D ("=")
|
|
137
|
-
// character, and the (possibly empty) attribute-value string
|
|
138
|
-
// consists of the characters after the first %x3D ("=")
|
|
139
|
-
// character.
|
|
140
|
-
const position = { position: 0 }
|
|
141
|
-
|
|
142
|
-
attributeName = collectASequenceOfCodePointsFast(
|
|
143
|
-
'=',
|
|
144
|
-
cookieAv,
|
|
145
|
-
position
|
|
146
|
-
)
|
|
147
|
-
attributeValue = cookieAv.slice(position.position + 1)
|
|
148
|
-
} else {
|
|
149
|
-
// Otherwise:
|
|
150
|
-
|
|
151
|
-
// 1. The attribute-name string consists of the entire cookie-av
|
|
152
|
-
// string, and the attribute-value string is empty.
|
|
153
|
-
attributeName = cookieAv
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// 5. Remove any leading or trailing WSP characters from the attribute-
|
|
157
|
-
// name string and the attribute-value string.
|
|
158
|
-
attributeName = attributeName.trim()
|
|
159
|
-
attributeValue = attributeValue.trim()
|
|
160
|
-
|
|
161
|
-
// 6. If the attribute-value is longer than 1024 octets, ignore the
|
|
162
|
-
// cookie-av string and return to Step 1 of this algorithm.
|
|
163
|
-
if (attributeValue.length > maxAttributeValueSize) {
|
|
164
|
-
return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// 7. Process the attribute-name and attribute-value according to the
|
|
168
|
-
// requirements in the following subsections. (Notice that
|
|
169
|
-
// attributes with unrecognized attribute-names are ignored.)
|
|
170
|
-
const attributeNameLowercase = attributeName.toLowerCase()
|
|
171
|
-
|
|
172
|
-
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1
|
|
173
|
-
// If the attribute-name case-insensitively matches the string
|
|
174
|
-
// "Expires", the user agent MUST process the cookie-av as follows.
|
|
175
|
-
if (attributeNameLowercase === 'expires') {
|
|
176
|
-
// 1. Let the expiry-time be the result of parsing the attribute-value
|
|
177
|
-
// as cookie-date (see Section 5.1.1).
|
|
178
|
-
const expiryTime = new Date(attributeValue)
|
|
179
|
-
|
|
180
|
-
// 2. If the attribute-value failed to parse as a cookie date, ignore
|
|
181
|
-
// the cookie-av.
|
|
182
|
-
|
|
183
|
-
cookieAttributeList.expires = expiryTime
|
|
184
|
-
} else if (attributeNameLowercase === 'max-age') {
|
|
185
|
-
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2
|
|
186
|
-
// If the attribute-name case-insensitively matches the string "Max-
|
|
187
|
-
// Age", the user agent MUST process the cookie-av as follows.
|
|
188
|
-
|
|
189
|
-
// 1. If the first character of the attribute-value is not a DIGIT or a
|
|
190
|
-
// "-" character, ignore the cookie-av.
|
|
191
|
-
const charCode = attributeValue.charCodeAt(0)
|
|
192
|
-
|
|
193
|
-
if ((charCode < 48 || charCode > 57) && attributeValue[0] !== '-') {
|
|
194
|
-
return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// 2. If the remainder of attribute-value contains a non-DIGIT
|
|
198
|
-
// character, ignore the cookie-av.
|
|
199
|
-
if (!/^\d+$/.test(attributeValue)) {
|
|
200
|
-
return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// 3. Let delta-seconds be the attribute-value converted to an integer.
|
|
204
|
-
const deltaSeconds = Number(attributeValue)
|
|
205
|
-
|
|
206
|
-
// 4. Let cookie-age-limit be the maximum age of the cookie (which
|
|
207
|
-
// SHOULD be 400 days or less, see Section 4.1.2.2).
|
|
208
|
-
|
|
209
|
-
// 5. Set delta-seconds to the smaller of its present value and cookie-
|
|
210
|
-
// age-limit.
|
|
211
|
-
// deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs)
|
|
212
|
-
|
|
213
|
-
// 6. If delta-seconds is less than or equal to zero (0), let expiry-
|
|
214
|
-
// time be the earliest representable date and time. Otherwise, let
|
|
215
|
-
// the expiry-time be the current date and time plus delta-seconds
|
|
216
|
-
// seconds.
|
|
217
|
-
// const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds
|
|
218
|
-
|
|
219
|
-
// 7. Append an attribute to the cookie-attribute-list with an
|
|
220
|
-
// attribute-name of Max-Age and an attribute-value of expiry-time.
|
|
221
|
-
cookieAttributeList.maxAge = deltaSeconds
|
|
222
|
-
} else if (attributeNameLowercase === 'domain') {
|
|
223
|
-
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3
|
|
224
|
-
// If the attribute-name case-insensitively matches the string "Domain",
|
|
225
|
-
// the user agent MUST process the cookie-av as follows.
|
|
226
|
-
|
|
227
|
-
// 1. Let cookie-domain be the attribute-value.
|
|
228
|
-
let cookieDomain = attributeValue
|
|
229
|
-
|
|
230
|
-
// 2. If cookie-domain starts with %x2E ("."), let cookie-domain be
|
|
231
|
-
// cookie-domain without its leading %x2E (".").
|
|
232
|
-
if (cookieDomain[0] === '.') {
|
|
233
|
-
cookieDomain = cookieDomain.slice(1)
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// 3. Convert the cookie-domain to lower case.
|
|
237
|
-
cookieDomain = cookieDomain.toLowerCase()
|
|
238
|
-
|
|
239
|
-
// 4. Append an attribute to the cookie-attribute-list with an
|
|
240
|
-
// attribute-name of Domain and an attribute-value of cookie-domain.
|
|
241
|
-
cookieAttributeList.domain = cookieDomain
|
|
242
|
-
} else if (attributeNameLowercase === 'path') {
|
|
243
|
-
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4
|
|
244
|
-
// If the attribute-name case-insensitively matches the string "Path",
|
|
245
|
-
// the user agent MUST process the cookie-av as follows.
|
|
246
|
-
|
|
247
|
-
// 1. If the attribute-value is empty or if the first character of the
|
|
248
|
-
// attribute-value is not %x2F ("/"):
|
|
249
|
-
let cookiePath = ''
|
|
250
|
-
if (attributeValue.length === 0 || attributeValue[0] !== '/') {
|
|
251
|
-
// 1. Let cookie-path be the default-path.
|
|
252
|
-
cookiePath = '/'
|
|
253
|
-
} else {
|
|
254
|
-
// Otherwise:
|
|
255
|
-
|
|
256
|
-
// 1. Let cookie-path be the attribute-value.
|
|
257
|
-
cookiePath = attributeValue
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// 2. Append an attribute to the cookie-attribute-list with an
|
|
261
|
-
// attribute-name of Path and an attribute-value of cookie-path.
|
|
262
|
-
cookieAttributeList.path = cookiePath
|
|
263
|
-
} else if (attributeNameLowercase === 'secure') {
|
|
264
|
-
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5
|
|
265
|
-
// If the attribute-name case-insensitively matches the string "Secure",
|
|
266
|
-
// the user agent MUST append an attribute to the cookie-attribute-list
|
|
267
|
-
// with an attribute-name of Secure and an empty attribute-value.
|
|
268
|
-
|
|
269
|
-
cookieAttributeList.secure = true
|
|
270
|
-
} else if (attributeNameLowercase === 'httponly') {
|
|
271
|
-
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6
|
|
272
|
-
// If the attribute-name case-insensitively matches the string
|
|
273
|
-
// "HttpOnly", the user agent MUST append an attribute to the cookie-
|
|
274
|
-
// attribute-list with an attribute-name of HttpOnly and an empty
|
|
275
|
-
// attribute-value.
|
|
276
|
-
|
|
277
|
-
cookieAttributeList.httpOnly = true
|
|
278
|
-
} else if (attributeNameLowercase === 'samesite') {
|
|
279
|
-
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7
|
|
280
|
-
// If the attribute-name case-insensitively matches the string
|
|
281
|
-
// "SameSite", the user agent MUST process the cookie-av as follows:
|
|
282
|
-
|
|
283
|
-
// 1. Let enforcement be "Default".
|
|
284
|
-
let enforcement = 'Default'
|
|
285
|
-
|
|
286
|
-
const attributeValueLowercase = attributeValue.toLowerCase()
|
|
287
|
-
// 2. If cookie-av's attribute-value is a case-insensitive match for
|
|
288
|
-
// "None", set enforcement to "None".
|
|
289
|
-
if (attributeValueLowercase.includes('none')) {
|
|
290
|
-
enforcement = 'None'
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
// 3. If cookie-av's attribute-value is a case-insensitive match for
|
|
294
|
-
// "Strict", set enforcement to "Strict".
|
|
295
|
-
if (attributeValueLowercase.includes('strict')) {
|
|
296
|
-
enforcement = 'Strict'
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// 4. If cookie-av's attribute-value is a case-insensitive match for
|
|
300
|
-
// "Lax", set enforcement to "Lax".
|
|
301
|
-
if (attributeValueLowercase.includes('lax')) {
|
|
302
|
-
enforcement = 'Lax'
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
// 5. Append an attribute to the cookie-attribute-list with an
|
|
306
|
-
// attribute-name of "SameSite" and an attribute-value of
|
|
307
|
-
// enforcement.
|
|
308
|
-
cookieAttributeList.sameSite = enforcement
|
|
309
|
-
} else {
|
|
310
|
-
cookieAttributeList.unparsed ??= []
|
|
311
|
-
|
|
312
|
-
cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`)
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// 8. Return to Step 1 of this algorithm.
|
|
316
|
-
return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList)
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
module.exports = {
|
|
320
|
-
parseSetCookie,
|
|
321
|
-
parseUnparsedAttributes
|
|
322
|
-
}
|
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @param {string} value
|
|
5
|
-
* @returns {boolean}
|
|
6
|
-
*/
|
|
7
|
-
function isCTLExcludingHtab (value) {
|
|
8
|
-
for (let i = 0; i < value.length; ++i) {
|
|
9
|
-
const code = value.charCodeAt(i)
|
|
10
|
-
|
|
11
|
-
if (
|
|
12
|
-
(code >= 0x00 && code <= 0x08) ||
|
|
13
|
-
(code >= 0x0A && code <= 0x1F) ||
|
|
14
|
-
code === 0x7F
|
|
15
|
-
) {
|
|
16
|
-
return true
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return false
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
CHAR = <any US-ASCII character (octets 0 - 127)>
|
|
24
|
-
token = 1*<any CHAR except CTLs or separators>
|
|
25
|
-
separators = "(" | ")" | "<" | ">" | "@"
|
|
26
|
-
| "," | ";" | ":" | "\" | <">
|
|
27
|
-
| "/" | "[" | "]" | "?" | "="
|
|
28
|
-
| "{" | "}" | SP | HT
|
|
29
|
-
* @param {string} name
|
|
30
|
-
*/
|
|
31
|
-
function validateCookieName (name) {
|
|
32
|
-
for (let i = 0; i < name.length; ++i) {
|
|
33
|
-
const code = name.charCodeAt(i)
|
|
34
|
-
|
|
35
|
-
if (
|
|
36
|
-
code < 0x21 || // exclude CTLs (0-31), SP and HT
|
|
37
|
-
code > 0x7E || // exclude non-ascii and DEL
|
|
38
|
-
code === 0x22 || // "
|
|
39
|
-
code === 0x28 || // (
|
|
40
|
-
code === 0x29 || // )
|
|
41
|
-
code === 0x3C || // <
|
|
42
|
-
code === 0x3E || // >
|
|
43
|
-
code === 0x40 || // @
|
|
44
|
-
code === 0x2C || // ,
|
|
45
|
-
code === 0x3B || // ;
|
|
46
|
-
code === 0x3A || // :
|
|
47
|
-
code === 0x5C || // \
|
|
48
|
-
code === 0x2F || // /
|
|
49
|
-
code === 0x5B || // [
|
|
50
|
-
code === 0x5D || // ]
|
|
51
|
-
code === 0x3F || // ?
|
|
52
|
-
code === 0x3D || // =
|
|
53
|
-
code === 0x7B || // {
|
|
54
|
-
code === 0x7D // }
|
|
55
|
-
) {
|
|
56
|
-
throw new Error('Invalid cookie name')
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
|
|
63
|
-
cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
|
|
64
|
-
; US-ASCII characters excluding CTLs,
|
|
65
|
-
; whitespace DQUOTE, comma, semicolon,
|
|
66
|
-
; and backslash
|
|
67
|
-
* @param {string} value
|
|
68
|
-
*/
|
|
69
|
-
function validateCookieValue (value) {
|
|
70
|
-
let len = value.length
|
|
71
|
-
let i = 0
|
|
72
|
-
|
|
73
|
-
// if the value is wrapped in DQUOTE
|
|
74
|
-
if (value[0] === '"') {
|
|
75
|
-
if (len === 1 || value[len - 1] !== '"') {
|
|
76
|
-
throw new Error('Invalid cookie value')
|
|
77
|
-
}
|
|
78
|
-
--len
|
|
79
|
-
++i
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
while (i < len) {
|
|
83
|
-
const code = value.charCodeAt(i++)
|
|
84
|
-
|
|
85
|
-
if (
|
|
86
|
-
code < 0x21 || // exclude CTLs (0-31)
|
|
87
|
-
code > 0x7E || // non-ascii and DEL (127)
|
|
88
|
-
code === 0x22 || // "
|
|
89
|
-
code === 0x2C || // ,
|
|
90
|
-
code === 0x3B || // ;
|
|
91
|
-
code === 0x5C // \
|
|
92
|
-
) {
|
|
93
|
-
throw new Error('Invalid cookie value')
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* path-value = <any CHAR except CTLs or ";">
|
|
100
|
-
* @param {string} path
|
|
101
|
-
*/
|
|
102
|
-
function validateCookiePath (path) {
|
|
103
|
-
for (let i = 0; i < path.length; ++i) {
|
|
104
|
-
const code = path.charCodeAt(i)
|
|
105
|
-
|
|
106
|
-
if (
|
|
107
|
-
code < 0x20 || // exclude CTLs (0-31)
|
|
108
|
-
code === 0x7F || // DEL
|
|
109
|
-
code === 0x3B // ;
|
|
110
|
-
) {
|
|
111
|
-
throw new Error('Invalid cookie path')
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* I have no idea why these values aren't allowed to be honest,
|
|
118
|
-
* but Deno tests these. - Khafra
|
|
119
|
-
* @param {string} domain
|
|
120
|
-
*/
|
|
121
|
-
function validateCookieDomain (domain) {
|
|
122
|
-
if (
|
|
123
|
-
domain.startsWith('-') ||
|
|
124
|
-
domain.endsWith('.') ||
|
|
125
|
-
domain.endsWith('-')
|
|
126
|
-
) {
|
|
127
|
-
throw new Error('Invalid cookie domain')
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const IMFDays = [
|
|
132
|
-
'Sun', 'Mon', 'Tue', 'Wed',
|
|
133
|
-
'Thu', 'Fri', 'Sat'
|
|
134
|
-
]
|
|
135
|
-
|
|
136
|
-
const IMFMonths = [
|
|
137
|
-
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
|
|
138
|
-
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
|
|
139
|
-
]
|
|
140
|
-
|
|
141
|
-
const IMFPaddedNumbers = Array(61).fill(0).map((_, i) => i.toString().padStart(2, '0'))
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1
|
|
145
|
-
* @param {number|Date} date
|
|
146
|
-
IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT
|
|
147
|
-
; fixed length/zone/capitalization subset of the format
|
|
148
|
-
; see Section 3.3 of [RFC5322]
|
|
149
|
-
|
|
150
|
-
day-name = %x4D.6F.6E ; "Mon", case-sensitive
|
|
151
|
-
/ %x54.75.65 ; "Tue", case-sensitive
|
|
152
|
-
/ %x57.65.64 ; "Wed", case-sensitive
|
|
153
|
-
/ %x54.68.75 ; "Thu", case-sensitive
|
|
154
|
-
/ %x46.72.69 ; "Fri", case-sensitive
|
|
155
|
-
/ %x53.61.74 ; "Sat", case-sensitive
|
|
156
|
-
/ %x53.75.6E ; "Sun", case-sensitive
|
|
157
|
-
date1 = day SP month SP year
|
|
158
|
-
; e.g., 02 Jun 1982
|
|
159
|
-
|
|
160
|
-
day = 2DIGIT
|
|
161
|
-
month = %x4A.61.6E ; "Jan", case-sensitive
|
|
162
|
-
/ %x46.65.62 ; "Feb", case-sensitive
|
|
163
|
-
/ %x4D.61.72 ; "Mar", case-sensitive
|
|
164
|
-
/ %x41.70.72 ; "Apr", case-sensitive
|
|
165
|
-
/ %x4D.61.79 ; "May", case-sensitive
|
|
166
|
-
/ %x4A.75.6E ; "Jun", case-sensitive
|
|
167
|
-
/ %x4A.75.6C ; "Jul", case-sensitive
|
|
168
|
-
/ %x41.75.67 ; "Aug", case-sensitive
|
|
169
|
-
/ %x53.65.70 ; "Sep", case-sensitive
|
|
170
|
-
/ %x4F.63.74 ; "Oct", case-sensitive
|
|
171
|
-
/ %x4E.6F.76 ; "Nov", case-sensitive
|
|
172
|
-
/ %x44.65.63 ; "Dec", case-sensitive
|
|
173
|
-
year = 4DIGIT
|
|
174
|
-
|
|
175
|
-
GMT = %x47.4D.54 ; "GMT", case-sensitive
|
|
176
|
-
|
|
177
|
-
time-of-day = hour ":" minute ":" second
|
|
178
|
-
; 00:00:00 - 23:59:60 (leap second)
|
|
179
|
-
|
|
180
|
-
hour = 2DIGIT
|
|
181
|
-
minute = 2DIGIT
|
|
182
|
-
second = 2DIGIT
|
|
183
|
-
*/
|
|
184
|
-
function toIMFDate (date) {
|
|
185
|
-
if (typeof date === 'number') {
|
|
186
|
-
date = new Date(date)
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return `${IMFDays[date.getUTCDay()]}, ${IMFPaddedNumbers[date.getUTCDate()]} ${IMFMonths[date.getUTCMonth()]} ${date.getUTCFullYear()} ${IMFPaddedNumbers[date.getUTCHours()]}:${IMFPaddedNumbers[date.getUTCMinutes()]}:${IMFPaddedNumbers[date.getUTCSeconds()]} GMT`
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
max-age-av = "Max-Age=" non-zero-digit *DIGIT
|
|
194
|
-
; In practice, both expires-av and max-age-av
|
|
195
|
-
; are limited to dates representable by the
|
|
196
|
-
; user agent.
|
|
197
|
-
* @param {number} maxAge
|
|
198
|
-
*/
|
|
199
|
-
function validateCookieMaxAge (maxAge) {
|
|
200
|
-
if (maxAge < 0) {
|
|
201
|
-
throw new Error('Invalid cookie max-age')
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* @see https://www.rfc-editor.org/rfc/rfc6265#section-4.1.1
|
|
207
|
-
* @param {import('./index').Cookie} cookie
|
|
208
|
-
*/
|
|
209
|
-
function stringify (cookie) {
|
|
210
|
-
if (cookie.name.length === 0) {
|
|
211
|
-
return null
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
validateCookieName(cookie.name)
|
|
215
|
-
validateCookieValue(cookie.value)
|
|
216
|
-
|
|
217
|
-
const out = [`${cookie.name}=${cookie.value}`]
|
|
218
|
-
|
|
219
|
-
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.1
|
|
220
|
-
// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.2
|
|
221
|
-
if (cookie.name.startsWith('__Secure-')) {
|
|
222
|
-
cookie.secure = true
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
if (cookie.name.startsWith('__Host-')) {
|
|
226
|
-
cookie.secure = true
|
|
227
|
-
cookie.domain = null
|
|
228
|
-
cookie.path = '/'
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
if (cookie.secure) {
|
|
232
|
-
out.push('Secure')
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
if (cookie.httpOnly) {
|
|
236
|
-
out.push('HttpOnly')
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
if (typeof cookie.maxAge === 'number') {
|
|
240
|
-
validateCookieMaxAge(cookie.maxAge)
|
|
241
|
-
out.push(`Max-Age=${cookie.maxAge}`)
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
if (cookie.domain) {
|
|
245
|
-
validateCookieDomain(cookie.domain)
|
|
246
|
-
out.push(`Domain=${cookie.domain}`)
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
if (cookie.path) {
|
|
250
|
-
validateCookiePath(cookie.path)
|
|
251
|
-
out.push(`Path=${cookie.path}`)
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
if (cookie.expires && cookie.expires.toString() !== 'Invalid Date') {
|
|
255
|
-
out.push(`Expires=${toIMFDate(cookie.expires)}`)
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
if (cookie.sameSite) {
|
|
259
|
-
out.push(`SameSite=${cookie.sameSite}`)
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
for (const part of cookie.unparsed) {
|
|
263
|
-
if (!part.includes('=')) {
|
|
264
|
-
throw new Error('Invalid unparsed')
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
const [key, ...value] = part.split('=')
|
|
268
|
-
|
|
269
|
-
out.push(`${key.trim()}=${value.join('=')}`)
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
return out.join('; ')
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
module.exports = {
|
|
276
|
-
isCTLExcludingHtab,
|
|
277
|
-
validateCookieName,
|
|
278
|
-
validateCookiePath,
|
|
279
|
-
validateCookieValue,
|
|
280
|
-
toIMFDate,
|
|
281
|
-
stringify
|
|
282
|
-
}
|