回答編集履歴

7

追記

2023/07/18 13:49

投稿

退会済みユーザー
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

ついき

2023/07/18 13:37

投稿

退会済みユーザー
test CHANGED
@@ -1,6 +1,8 @@
1
1
  いささか力技ですし汎用性に乏しいですが、下記のようになるでしょうか。
2
2
 
3
+ > 「expires」の値の「, 」で正常に分割できない
4
+ ですよね~。日付のカンマが邪魔。
3
- アプローチとしては、日付のカンマが厄介なので、これを先にrfc2822の正規表現で抜き出してマジックナンバーに一時的に変えてやります。
5
+ だからアプローチとしては、**日付のカンマを先にrfc2822の正規表現で抜き出してマジックナンバーに一時的に変えてやります。**
4
6
  あとは「, 」でクッキーの組に分けて、各組をさらにパースしてやる感じで。
5
7
 
6
8
  + キーの順番がバラバラなのは仕方ないと割り切ってください。「オブジェクトでまとめる」という要件ですし。

5

tuiki

2023/07/18 13:36

投稿

退会済みユーザー
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

修正

2023/07/18 13:31

投稿

退会済みユーザー
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

修正

2023/07/18 13:28

投稿

退会済みユーザー
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
- // クッキーの組(segments)に分ける
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
- let cookieParts = cookiePair.split('=');
28
+ const parts = cookiePair.split('=');
29
- cookie.key = cookieParts[0];
29
+ cookie.key = parts[0];
30
- cookie.value = cookieParts[1];
30
+ cookie.value = parts.slice(1).join("=");
31
31
  } else if (cookiePair.includes('=')) {
32
- parts = cookiePair.split('=', 2);
32
+ const parts = cookiePair.split('=');
33
33
  const key_ = parts[0];
34
- const val_ = parts[1].replace(TIMESTAMP_IDENTIFIER, ',');
34
+ const val_ = parts.slice(1).join("=").replace(TIMESTAMP_IDENTIFIER, ',');
35
35
  cookie[key_] = val_;
36
36
  } else {
37
37
  cookie[cookiePair] = true;

2

修正

2023/07/18 13:17

投稿

退会済みユーザー
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

 

2023/07/18 13:15

投稿

退会済みユーザー
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