回答編集履歴
7
追記
test
CHANGED
@@ -49,3 +49,11 @@
|
|
49
49
|
s = "XSRF-TOKEN=m1PFe1BVJVap7HZ2IugHUC82tMaymy4; expires=Thu, 17-Aug-2023 08:45:36 GMT; path=/; domain=.ppy.sh; secure, osu_session=akJpdiI6InQycEZXYWVWdGdpSOUMieidGFnIjoiIn0%3D; expires=Thu, 17-Aug-2023 08:45:36 GMT; path=/; domain=.ppy.sh; secure; httponly";
|
50
50
|
|
51
51
|
console.log(parseCookies(s));
|
52
|
+
```
|
53
|
+
|
54
|
+
|
55
|
+
---
|
56
|
+
|
57
|
+
試してないですが、こういうのもあるそうです。
|
58
|
+
set-cookie-parser -npm
|
59
|
+
https://www.npmjs.com/package/set-cookie-parser
|
6
ついき
test
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
いささか力技ですし汎用性に乏しいですが、下記のようになるでしょうか。
|
2
2
|
|
3
|
+
> 「expires」の値の「, 」で正常に分割できない
|
4
|
+
ですよね~。日付のカンマが邪魔。
|
3
|
-
アプローチとしては、日付のカンマ
|
5
|
+
だからアプローチとしては、**日付のカンマを先にrfc2822の正規表現で抜き出してマジックナンバーに一時的に変えてやります。**
|
4
6
|
あとは「, 」でクッキーの組に分けて、各組をさらにパースしてやる感じで。
|
5
7
|
|
6
8
|
+ キーの順番がバラバラなのは仕方ないと割り切ってください。「オブジェクトでまとめる」という要件ですし。
|
5
tuiki
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
あとは「, 」でクッキーの組に分けて、各組をさらにパースしてやる感じで。
|
5
5
|
|
6
6
|
+ キーの順番がバラバラなのは仕方ないと割り切ってください。「オブジェクトでまとめる」という要件ですし。
|
7
|
-
+ rfc2822形式の日付文字列以外で、値にカンマ+半角スペースが入っているようなクッキーには対応してません。(これは個別に対応するしかないでしょう)
|
7
|
+
+ rfc2822形式の日付文字列以外で、値にカンマ+半角スペースが入っているようなクッキーには対応してません。(これは個別に対応するしかないでしょう。そもそも[仕様がきちんとしてないっぽい](https://stackoverflow.com/questions/2880047/is-it-possible-to-set-more-than-one-cookie-with-a-single-set-cookie)という話)
|
8
8
|
```js
|
9
9
|
const TIMESTAMP_IDENTIFIER = '$_TIMESTAMP_$';
|
10
10
|
|
4
修正
test
CHANGED
@@ -14,13 +14,12 @@
|
|
14
14
|
}
|
15
15
|
|
16
16
|
function parseCookies(cookiesString) {
|
17
|
-
result = [];
|
18
17
|
// 日付のカンマを一時的に別の文字列に修正
|
19
18
|
const parsed = parseRFC2822(cookiesString);
|
20
19
|
// クッキーの組に分ける
|
21
20
|
const segments = parsed.split(', ');
|
22
21
|
// segmentごとにクッキー解析
|
23
|
-
result = segments.map(segment => {
|
22
|
+
const result = segments.map(segment => {
|
24
23
|
const cookiePairs = segment.split('; ');
|
25
24
|
let cookie = {};
|
26
25
|
cookiePairs.forEach((cookiePair, index) => {
|
3
修正
test
CHANGED
@@ -16,8 +16,8 @@
|
|
16
16
|
function parseCookies(cookiesString) {
|
17
17
|
result = [];
|
18
18
|
// 日付のカンマを一時的に別の文字列に修正
|
19
|
-
const parsed = parseRFC2822(cookiesString)
|
19
|
+
const parsed = parseRFC2822(cookiesString);
|
20
|
-
// クッキーの組
|
20
|
+
// クッキーの組に分ける
|
21
21
|
const segments = parsed.split(', ');
|
22
22
|
// segmentごとにクッキー解析
|
23
23
|
result = segments.map(segment => {
|
@@ -25,13 +25,13 @@
|
|
25
25
|
let cookie = {};
|
26
26
|
cookiePairs.forEach((cookiePair, index) => {
|
27
27
|
if (index === 0) {
|
28
|
-
|
28
|
+
const parts = cookiePair.split('=');
|
29
|
-
cookie.key =
|
29
|
+
cookie.key = parts[0];
|
30
|
-
cookie.value =
|
30
|
+
cookie.value = parts.slice(1).join("=");
|
31
31
|
} else if (cookiePair.includes('=')) {
|
32
|
-
parts = cookiePair.split('='
|
32
|
+
const parts = cookiePair.split('=');
|
33
33
|
const key_ = parts[0];
|
34
|
-
const val_ = parts
|
34
|
+
const val_ = parts.slice(1).join("=").replace(TIMESTAMP_IDENTIFIER, ',');
|
35
35
|
cookie[key_] = val_;
|
36
36
|
} else {
|
37
37
|
cookie[cookiePair] = true;
|
2
修正
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
あとは「, 」でクッキーの組に分けて、各組をさらにパースしてやる感じで。
|
5
5
|
|
6
6
|
+ キーの順番がバラバラなのは仕方ないと割り切ってください。「オブジェクトでまとめる」という要件ですし。
|
7
|
-
+ rfc2822形式の日付文字列以外で、値にカンマが入っているようなクッキーには対応してません。(これは個別に対応するしかないでしょう)
|
7
|
+
+ rfc2822形式の日付文字列以外で、値にカンマ+半角スペースが入っているようなクッキーには対応してません。(これは個別に対応するしかないでしょう)
|
8
8
|
```js
|
9
9
|
const TIMESTAMP_IDENTIFIER = '$_TIMESTAMP_$';
|
10
10
|
|
1
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
あとは「, 」でクッキーの組に分けて、各組をさらにパースしてやる感じで。
|
5
5
|
|
6
6
|
+ キーの順番がバラバラなのは仕方ないと割り切ってください。「オブジェクトでまとめる」という要件ですし。
|
7
|
-
|
7
|
+
+ rfc2822形式の日付文字列以外で、値にカンマが入っているようなクッキーには対応してません。(これは個別に対応するしかないでしょう)
|
8
8
|
```js
|
9
9
|
const TIMESTAMP_IDENTIFIER = '$_TIMESTAMP_$';
|
10
10
|
|