@famir/http-tools 0.0.3 → 0.0.4
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/README.md +1 -1
- package/dist/body.d.ts +3 -3
- package/dist/body.js +1 -1
- package/dist/body.js.map +1 -1
- package/dist/body.test.d.ts +1 -0
- package/dist/body.test.js +175 -0
- package/dist/body.test.js.map +1 -0
- package/dist/cheerio.js.map +1 -1
- package/dist/content-type.d.ts +2 -3
- package/dist/content-type.js +2 -7
- package/dist/content-type.js.map +1 -1
- package/dist/cookies.test.d.ts +1 -0
- package/dist/cookies.test.js +365 -0
- package/dist/cookies.test.js.map +1 -0
- package/dist/headers.d.ts +1 -0
- package/dist/headers.js +5 -2
- package/dist/headers.js.map +1 -1
- package/dist/headers.test.d.ts +1 -0
- package/dist/headers.test.js +314 -0
- package/dist/headers.test.js.map +1 -0
- package/dist/isbot.js.map +1 -1
- package/dist/message.d.ts +3 -3
- package/dist/message.js +1 -1
- package/dist/message.js.map +1 -1
- package/dist/message.test.d.ts +1 -0
- package/dist/message.test.js +138 -0
- package/dist/message.test.js.map +1 -0
- package/dist/method.js.map +1 -1
- package/dist/method.test.d.ts +1 -0
- package/dist/method.test.js +89 -0
- package/dist/method.test.js.map +1 -0
- package/dist/query-string.d.ts +4 -6
- package/dist/query-string.js +2 -7
- package/dist/query-string.js.map +1 -1
- package/dist/rewrite-url.test.d.ts +1 -0
- package/dist/rewrite-url.test.js +322 -0
- package/dist/rewrite-url.test.js.map +1 -0
- package/dist/status.js.map +1 -1
- package/dist/status.test.d.ts +1 -0
- package/dist/status.test.js +106 -0
- package/dist/status.test.js.map +1 -0
- package/dist/ua-parser.js.map +1 -1
- package/dist/url.d.ts +3 -3
- package/dist/url.js.map +1 -1
- package/dist/url.test.d.ts +1 -0
- package/dist/url.test.js +201 -0
- package/dist/url.test.js.map +1 -0
- package/package.json +3 -2
package/README.md
CHANGED
package/dist/body.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HttpBody, HttpJson, HttpQueryString, HttpText } from '@famir/http-proto';
|
|
2
|
-
import {
|
|
2
|
+
import { FormatQueryStringOptions, ParseQueryStringOptions } from './query-string.js';
|
|
3
3
|
export declare class HttpBodyWrap {
|
|
4
4
|
#private;
|
|
5
5
|
static fromScratch(): HttpBodyWrap;
|
|
@@ -16,8 +16,8 @@ export declare class HttpBodyWrap {
|
|
|
16
16
|
setText(text: HttpText, charset?: string): this;
|
|
17
17
|
getJson(charset?: string): HttpJson;
|
|
18
18
|
setJson(json: HttpJson, charset?: string): this;
|
|
19
|
-
readonly parseQueryStringOptions:
|
|
20
|
-
readonly formatQueryStringOptions:
|
|
19
|
+
readonly parseQueryStringOptions: ParseQueryStringOptions;
|
|
20
|
+
readonly formatQueryStringOptions: FormatQueryStringOptions;
|
|
21
21
|
getQueryString(charset?: string): HttpQueryString;
|
|
22
22
|
setQueryString(queryString: HttpQueryString, charset?: string): this;
|
|
23
23
|
reset(): this;
|
package/dist/body.js
CHANGED
package/dist/body.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body.js","sourceRoot":"","sources":["../src/body.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AACnC,OAAO,EACL,iBAAiB,
|
|
1
|
+
{"version":3,"file":"body.js","sourceRoot":"","sources":["../src/body.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { describe, it } from 'node:test';
|
|
3
|
+
import { HttpBodyWrap } from './body.js';
|
|
4
|
+
describe('HttpBodyWrap', () => {
|
|
5
|
+
describe('fromScratch', () => {
|
|
6
|
+
it('should create wrapper with default value', () => {
|
|
7
|
+
const body = HttpBodyWrap.fromScratch();
|
|
8
|
+
assert.strictEqual(body.length, 0);
|
|
9
|
+
assert.deepStrictEqual(body.get(), Buffer.alloc(0));
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
describe('clone', () => {
|
|
13
|
+
it('should clone wrapper', () => {
|
|
14
|
+
const original = new HttpBodyWrap(Buffer.from('test'));
|
|
15
|
+
const cloned = original.clone();
|
|
16
|
+
assert.deepStrictEqual(cloned, original);
|
|
17
|
+
assert.notStrictEqual(cloned, original);
|
|
18
|
+
});
|
|
19
|
+
it('should original and cloned buffers are identicals', () => {
|
|
20
|
+
const original = new HttpBodyWrap(Buffer.from('hello'));
|
|
21
|
+
const cloned = original.clone();
|
|
22
|
+
assert.deepStrictEqual(cloned.get(), original.get());
|
|
23
|
+
assert.notStrictEqual(cloned.get(), original.get());
|
|
24
|
+
});
|
|
25
|
+
it('should clone has independent state', () => {
|
|
26
|
+
const original = new HttpBodyWrap(Buffer.from('test'));
|
|
27
|
+
const cloned = original.clone();
|
|
28
|
+
cloned.set(Buffer.from('hello'));
|
|
29
|
+
assert.deepStrictEqual(original.get(), Buffer.from('test'));
|
|
30
|
+
assert.deepStrictEqual(cloned.get(), Buffer.from('hello'));
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('freeze', () => {
|
|
34
|
+
it('should freeze and prevent modifications', () => {
|
|
35
|
+
const body = HttpBodyWrap.fromScratch();
|
|
36
|
+
body.freeze();
|
|
37
|
+
assert.strictEqual(body.isFrozen, true);
|
|
38
|
+
assert.throws(() => body.set(Buffer.from('test')), /frozen/);
|
|
39
|
+
});
|
|
40
|
+
it('should return this for chaining', () => {
|
|
41
|
+
const body = HttpBodyWrap.fromScratch();
|
|
42
|
+
const that = body.freeze();
|
|
43
|
+
assert.strictEqual(that, body);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('length', () => {
|
|
47
|
+
it('should return buffer length', () => {
|
|
48
|
+
const body = new HttpBodyWrap(Buffer.from('hello'));
|
|
49
|
+
assert.strictEqual(body.length, 5);
|
|
50
|
+
body.set(Buffer.from('hello world'));
|
|
51
|
+
assert.strictEqual(body.length, 11);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe('get/set', () => {
|
|
55
|
+
it('should get body data', () => {
|
|
56
|
+
const body = new HttpBodyWrap(Buffer.from('test'));
|
|
57
|
+
assert.deepStrictEqual(body.get(), Buffer.from('test'));
|
|
58
|
+
});
|
|
59
|
+
it('should set and get body data', () => {
|
|
60
|
+
const body = HttpBodyWrap.fromScratch();
|
|
61
|
+
body.set(Buffer.from('test'));
|
|
62
|
+
assert.deepStrictEqual(body.get(), Buffer.from('test'));
|
|
63
|
+
});
|
|
64
|
+
it('should return this for chaining', () => {
|
|
65
|
+
const body = HttpBodyWrap.fromScratch();
|
|
66
|
+
const that = body.set(Buffer.from('test'));
|
|
67
|
+
assert.strictEqual(that, body);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('base64', () => {
|
|
71
|
+
it('should get base64 encoded', () => {
|
|
72
|
+
const body = new HttpBodyWrap(Buffer.from('test'));
|
|
73
|
+
assert.strictEqual(body.getBase64(), 'dGVzdA==');
|
|
74
|
+
});
|
|
75
|
+
it('should set and get base64 encoded', () => {
|
|
76
|
+
const body = HttpBodyWrap.fromScratch();
|
|
77
|
+
body.setBase64('dGVzdA==');
|
|
78
|
+
assert.deepStrictEqual(body.get(), Buffer.from('test'));
|
|
79
|
+
});
|
|
80
|
+
it('should cache base64 result', () => {
|
|
81
|
+
const body = new HttpBodyWrap(Buffer.from('test'));
|
|
82
|
+
const base64_1 = body.getBase64();
|
|
83
|
+
const base64_2 = body.getBase64();
|
|
84
|
+
assert.strictEqual(base64_1, base64_2);
|
|
85
|
+
});
|
|
86
|
+
it('should return this for chaining', () => {
|
|
87
|
+
const body = HttpBodyWrap.fromScratch();
|
|
88
|
+
const that = body.setBase64('dGVzdA==');
|
|
89
|
+
assert.strictEqual(that, body);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe('text', () => {
|
|
93
|
+
it('should get text encoded', () => {
|
|
94
|
+
const body = new HttpBodyWrap(Buffer.from('hello'));
|
|
95
|
+
assert.strictEqual(body.getText(), 'hello');
|
|
96
|
+
});
|
|
97
|
+
it('should set and get text encoded', () => {
|
|
98
|
+
const body = HttpBodyWrap.fromScratch();
|
|
99
|
+
body.setText('hello');
|
|
100
|
+
assert.deepStrictEqual(body.get(), Buffer.from('hello'));
|
|
101
|
+
});
|
|
102
|
+
it('should cache text result', () => {
|
|
103
|
+
const body = new HttpBodyWrap(Buffer.from('test'));
|
|
104
|
+
const text1 = body.getText();
|
|
105
|
+
const text2 = body.getText();
|
|
106
|
+
assert.strictEqual(text1, text2);
|
|
107
|
+
});
|
|
108
|
+
it('should return this for chaining', () => {
|
|
109
|
+
const body = HttpBodyWrap.fromScratch();
|
|
110
|
+
const that = body.setText('test');
|
|
111
|
+
assert.strictEqual(that, body);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe('json', () => {
|
|
115
|
+
it('should get parsed json body', () => {
|
|
116
|
+
const body = new HttpBodyWrap(Buffer.from('{"key":"value"}'));
|
|
117
|
+
const json = body.getJson();
|
|
118
|
+
assert.deepStrictEqual(json, { key: 'value' });
|
|
119
|
+
});
|
|
120
|
+
it('should set and get json body', () => {
|
|
121
|
+
const body = HttpBodyWrap.fromScratch();
|
|
122
|
+
const obj = { name: 'test', count: 42 };
|
|
123
|
+
body.setJson(obj);
|
|
124
|
+
assert.deepStrictEqual(body.getJson(), obj);
|
|
125
|
+
});
|
|
126
|
+
it('should throw on invalid json', () => {
|
|
127
|
+
const body = new HttpBodyWrap(Buffer.from('invalid json'));
|
|
128
|
+
assert.throws(() => body.getJson(), /SyntaxError/);
|
|
129
|
+
});
|
|
130
|
+
it('should cache json result', () => {
|
|
131
|
+
const body = new HttpBodyWrap(Buffer.from('{"a":1}'));
|
|
132
|
+
const json1 = body.getJson();
|
|
133
|
+
const json2 = body.getJson();
|
|
134
|
+
assert.strictEqual(json1, json2);
|
|
135
|
+
});
|
|
136
|
+
it('should return this for chaining', () => {
|
|
137
|
+
const body = HttpBodyWrap.fromScratch();
|
|
138
|
+
const that = body.setJson({ a: 1 });
|
|
139
|
+
assert.strictEqual(that, body);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
describe('query-string', () => {
|
|
143
|
+
it('should get query-string body', () => {
|
|
144
|
+
const body = new HttpBodyWrap(Buffer.from('key=value&name=test'));
|
|
145
|
+
const queryString = body.getQueryString();
|
|
146
|
+
assert.deepStrictEqual(queryString, { key: 'value', name: 'test' });
|
|
147
|
+
});
|
|
148
|
+
it('should get and set query-string body', () => {
|
|
149
|
+
const body = HttpBodyWrap.fromScratch();
|
|
150
|
+
const queryString = { name: 'test', count: 42 };
|
|
151
|
+
body.setQueryString(queryString);
|
|
152
|
+
assert.deepStrictEqual(body.getQueryString(), queryString);
|
|
153
|
+
});
|
|
154
|
+
it('should cache query string result', () => {
|
|
155
|
+
const body = new HttpBodyWrap(Buffer.from('a=1&b=2'));
|
|
156
|
+
const queryString_1 = body.getQueryString();
|
|
157
|
+
const queryString_2 = body.getQueryString();
|
|
158
|
+
assert.strictEqual(queryString_1, queryString_2);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe('reset', () => {
|
|
162
|
+
it('should reset to default body', () => {
|
|
163
|
+
const body = new HttpBodyWrap(Buffer.from('test'));
|
|
164
|
+
assert.strictEqual(body.length, 4);
|
|
165
|
+
body.reset();
|
|
166
|
+
assert.strictEqual(body.length, 0);
|
|
167
|
+
});
|
|
168
|
+
it('should return this for chaining', () => {
|
|
169
|
+
const body = HttpBodyWrap.fromScratch();
|
|
170
|
+
const that = body.reset();
|
|
171
|
+
assert.strictEqual(that, body);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
//# sourceMappingURL=body.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body.test.js","sourceRoot":"","sources":["../src/body.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cheerio.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cheerio.js","sourceRoot":"","sources":["../src/cheerio.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cheerio.js","sourceRoot":"","sources":["../src/cheerio.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,SAAS,CAAA"}
|
package/dist/content-type.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { HttpContentType } from '@famir/http-proto';
|
|
2
1
|
export declare const HTTP_CONTENT_TYPE_NAMES: readonly ["text", "html", "css", "javascript", "json", "xml", "urlEncoded"];
|
|
3
2
|
export type HttpContentTypeName = (typeof HTTP_CONTENT_TYPE_NAMES)[number];
|
|
4
3
|
export type HttpContentTypes = Record<HttpContentTypeName, string[]>;
|
|
5
|
-
export
|
|
6
|
-
export
|
|
4
|
+
export { parse as parseContentType } from 'content-type';
|
|
5
|
+
export { format as formatContentType } from 'content-type';
|
package/dist/content-type.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import contenttype from 'content-type';
|
|
2
1
|
export const HTTP_CONTENT_TYPE_NAMES = [
|
|
3
2
|
'text',
|
|
4
3
|
'html',
|
|
@@ -8,10 +7,6 @@ export const HTTP_CONTENT_TYPE_NAMES = [
|
|
|
8
7
|
'xml',
|
|
9
8
|
'urlEncoded',
|
|
10
9
|
];
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
export function formatContentType(contentType) {
|
|
15
|
-
return contenttype.format(contentType);
|
|
16
|
-
}
|
|
10
|
+
export { parse as parseContentType } from 'content-type';
|
|
11
|
+
export { format as formatContentType } from 'content-type';
|
|
17
12
|
//# sourceMappingURL=content-type.js.map
|
package/dist/content-type.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-type.js","sourceRoot":"","sources":["../src/content-type.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"content-type.js","sourceRoot":"","sources":["../src/content-type.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,MAAM;IACN,MAAM;IACN,KAAK;IACL,YAAY;IACZ,MAAM;IACN,KAAK;IACL,YAAY;CACJ,CAAA;AAkBV,OAAO,EAAE,KAAK,IAAI,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAMxD,OAAO,EAAE,MAAM,IAAI,iBAAiB,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { describe, it } from 'node:test';
|
|
3
|
+
import { formatCookies, formatSetCookies, parseCookies, parseSetCookies } from './cookies.js';
|
|
4
|
+
describe('parseCookies', () => {
|
|
5
|
+
describe('basic parsing', () => {
|
|
6
|
+
it('should parse single cookie', () => {
|
|
7
|
+
const parsed = parseCookies(['session=abc123']);
|
|
8
|
+
assert.strictEqual(parsed['session'], 'abc123');
|
|
9
|
+
});
|
|
10
|
+
it('should parse multiple cookies from single string', () => {
|
|
11
|
+
const parsed = parseCookies(['session=abc123; user=john']);
|
|
12
|
+
assert.strictEqual(parsed['session'], 'abc123');
|
|
13
|
+
assert.strictEqual(parsed['user'], 'john');
|
|
14
|
+
});
|
|
15
|
+
it('should parse multiple cookie from array of strings', () => {
|
|
16
|
+
const parsed = parseCookies(['session=abc123', 'user=john']);
|
|
17
|
+
assert.strictEqual(parsed['session'], 'abc123');
|
|
18
|
+
assert.strictEqual(parsed['user'], 'john');
|
|
19
|
+
});
|
|
20
|
+
it('should handle whitespace around cookies', () => {
|
|
21
|
+
const parsed = parseCookies([' session=abc123 ; user=john ']);
|
|
22
|
+
assert.strictEqual(parsed['session'], 'abc123');
|
|
23
|
+
assert.strictEqual(parsed['user'], 'john');
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('cookie values', () => {
|
|
27
|
+
it('should parse cookie with empty value', () => {
|
|
28
|
+
const parsed = parseCookies(['empty=']);
|
|
29
|
+
assert.strictEqual(parsed['empty'], '');
|
|
30
|
+
});
|
|
31
|
+
it('should parse cookie with special characters', () => {
|
|
32
|
+
const parsed = parseCookies(['data=abc%20def%3D123']);
|
|
33
|
+
assert.strictEqual(parsed['data'], 'abc%20def%3D123');
|
|
34
|
+
});
|
|
35
|
+
it('should handle multiple equals signs in value', () => {
|
|
36
|
+
const parsed = parseCookies(['token=abc=def=ghi']);
|
|
37
|
+
assert.strictEqual(parsed['token'], 'abc=def=ghi');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe('edge cases', () => {
|
|
41
|
+
it('should handle empty array', () => {
|
|
42
|
+
const parsed = parseCookies([]);
|
|
43
|
+
assert.deepStrictEqual(parsed, {});
|
|
44
|
+
});
|
|
45
|
+
it('should ignore invalid cookies', () => {
|
|
46
|
+
const parsed = parseCookies(['valid=value', 'invalid']);
|
|
47
|
+
assert.strictEqual(parsed['valid'], 'value');
|
|
48
|
+
assert.strictEqual(parsed['invalid'], undefined);
|
|
49
|
+
});
|
|
50
|
+
it('should skip empty strings', () => {
|
|
51
|
+
const parsed = parseCookies(['session=abc', '', 'user=john']);
|
|
52
|
+
assert.strictEqual(parsed['session'], 'abc');
|
|
53
|
+
assert.strictEqual(parsed['user'], 'john');
|
|
54
|
+
});
|
|
55
|
+
it('should handle semicolon-only strings', () => {
|
|
56
|
+
const parsed = parseCookies([';;;']);
|
|
57
|
+
assert.deepStrictEqual(parsed, {});
|
|
58
|
+
});
|
|
59
|
+
it('should handle duplicate cookie names', () => {
|
|
60
|
+
const parsed = parseCookies(['name=value1; name=value2']);
|
|
61
|
+
assert.strictEqual(parsed['name'], 'value2');
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('formatCookies', () => {
|
|
66
|
+
describe('basic formatting', () => {
|
|
67
|
+
it('should format single cookie', () => {
|
|
68
|
+
const formatted = formatCookies({ session: 'abc123' });
|
|
69
|
+
assert.match(formatted, /session=abc123/);
|
|
70
|
+
});
|
|
71
|
+
it('should format multiple cookies', () => {
|
|
72
|
+
const formatted = formatCookies({ session: 'abc123', user: 'john' });
|
|
73
|
+
assert.match(formatted, /session=abc123/);
|
|
74
|
+
assert.match(formatted, /user=john/);
|
|
75
|
+
assert.strictEqual(formatted.includes(';'), true);
|
|
76
|
+
});
|
|
77
|
+
it('should skip null values', () => {
|
|
78
|
+
const formatted = formatCookies({ session: 'abc123', empty: null });
|
|
79
|
+
assert.match(formatted, /session=abc123/);
|
|
80
|
+
});
|
|
81
|
+
it('should skip undefined values', () => {
|
|
82
|
+
const formatted = formatCookies({ session: 'abc123', empty: undefined });
|
|
83
|
+
assert.match(formatted, /session=abc123/);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe('special values', () => {
|
|
87
|
+
it('should format cookie with empty value', () => {
|
|
88
|
+
const formatted = formatCookies({ empty: '' });
|
|
89
|
+
assert.match(formatted, /empty=/);
|
|
90
|
+
});
|
|
91
|
+
it('should handle special characters', () => {
|
|
92
|
+
const formatted = formatCookies({ token: 'abc=def;ghi' });
|
|
93
|
+
assert.match(formatted, /token=abc=def;ghi/);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe('roundtrip', () => {
|
|
97
|
+
it('should parse and format correctly', () => {
|
|
98
|
+
const original = { session: 'test123', userId: 'user1' };
|
|
99
|
+
const formatted = formatCookies(original);
|
|
100
|
+
const parsed = parseCookies([formatted]);
|
|
101
|
+
assert.strictEqual(parsed['session'], original['session']);
|
|
102
|
+
assert.strictEqual(parsed['userId'], original['userId']);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe('parseSetCookies', () => {
|
|
107
|
+
describe('basic parsing', () => {
|
|
108
|
+
it('should parse set-cookie with value only', () => {
|
|
109
|
+
const parsed = parseSetCookies(['session=abc123']);
|
|
110
|
+
assert.ok(parsed['session']);
|
|
111
|
+
assert.strictEqual(parsed['session'].value, 'abc123');
|
|
112
|
+
});
|
|
113
|
+
it('should parse set-cookie with path', () => {
|
|
114
|
+
const parsed = parseSetCookies(['session=abc123; Path=/api']);
|
|
115
|
+
assert.ok(parsed['session']);
|
|
116
|
+
assert.strictEqual(parsed['session'].value, 'abc123');
|
|
117
|
+
assert.strictEqual(parsed['session'].path, '/api');
|
|
118
|
+
});
|
|
119
|
+
it('should parse set-cookie with domain', () => {
|
|
120
|
+
const parsed = parseSetCookies(['session=abc123; Domain=.example.com']);
|
|
121
|
+
assert.ok(parsed['session']);
|
|
122
|
+
assert.strictEqual(parsed['session'].value, 'abc123');
|
|
123
|
+
assert.strictEqual(parsed['session'].domain, 'example.com');
|
|
124
|
+
});
|
|
125
|
+
it('should parse multiple set-cookies', () => {
|
|
126
|
+
const parsed = parseSetCookies(['a=1; Path=/', 'b=2; Domain=.example.com']);
|
|
127
|
+
assert.ok(parsed['a']);
|
|
128
|
+
assert.ok(parsed['b']);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe('cookie flags', () => {
|
|
132
|
+
it('should parse secure flag', () => {
|
|
133
|
+
const parsed = parseSetCookies(['session=abc; Secure']);
|
|
134
|
+
assert.ok(parsed['session']);
|
|
135
|
+
assert.strictEqual(parsed['session'].secure, true);
|
|
136
|
+
});
|
|
137
|
+
it('should parse httpOnly flag', () => {
|
|
138
|
+
const parsed = parseSetCookies(['session=abc; HttpOnly']);
|
|
139
|
+
assert.ok(parsed['session']);
|
|
140
|
+
assert.strictEqual(parsed['session'].httpOnly, true);
|
|
141
|
+
});
|
|
142
|
+
it('should parse sameSite flag', () => {
|
|
143
|
+
const parsed = parseSetCookies(['session=abc; SameSite=Strict']);
|
|
144
|
+
assert.ok(parsed['session']);
|
|
145
|
+
assert.strictEqual(parsed['session'].sameSite, 'strict');
|
|
146
|
+
});
|
|
147
|
+
it('should parse multiple flags', () => {
|
|
148
|
+
const parsed = parseSetCookies(['session=abc; Secure; HttpOnly; SameSite=Lax']);
|
|
149
|
+
assert.ok(parsed['session']);
|
|
150
|
+
assert.strictEqual(parsed['session'].secure, true);
|
|
151
|
+
assert.strictEqual(parsed['session'].httpOnly, true);
|
|
152
|
+
assert.strictEqual(parsed['session'].sameSite, 'lax');
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
describe('expiration', () => {
|
|
156
|
+
it('should parse expires date', () => {
|
|
157
|
+
const parsed = parseSetCookies(['session=abc; Expires=Wed, 09 Jun 2021 10:18:14 GMT']);
|
|
158
|
+
assert.ok(parsed['session']);
|
|
159
|
+
assert.strictEqual(parsed['session'].expires, 1623233894000);
|
|
160
|
+
});
|
|
161
|
+
it('should parse max-age', () => {
|
|
162
|
+
const parsed = parseSetCookies(['session=abc; Max-Age=3600']);
|
|
163
|
+
assert.ok(parsed['session']);
|
|
164
|
+
assert.strictEqual(parsed['session'].maxAge, 3600);
|
|
165
|
+
});
|
|
166
|
+
it('should handle both expires and max-age', () => {
|
|
167
|
+
const parsed = parseSetCookies([
|
|
168
|
+
'session=abc; Expires=Wed, 09 Jun 2021 10:18:14 GMT; Max-Age=3600',
|
|
169
|
+
]);
|
|
170
|
+
assert.ok(parsed['session']);
|
|
171
|
+
assert.strictEqual(parsed['session'].expires, 1623233894000);
|
|
172
|
+
assert.strictEqual(parsed['session'].maxAge, 3600);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe('edge cases', () => {
|
|
176
|
+
it('should handle empty array', () => {
|
|
177
|
+
const parsed = parseSetCookies([]);
|
|
178
|
+
assert.deepStrictEqual(parsed, {});
|
|
179
|
+
});
|
|
180
|
+
it('should ignore invalid set-cookies', () => {
|
|
181
|
+
const parsed = parseSetCookies(['invalid', 'valid=value']);
|
|
182
|
+
assert.strictEqual(parsed['invalid'], undefined);
|
|
183
|
+
assert.ok(parsed['valid']);
|
|
184
|
+
assert.strictEqual(parsed['valid'].value, 'value');
|
|
185
|
+
});
|
|
186
|
+
it('should handle case insensitive attributes', () => {
|
|
187
|
+
const parsed = parseSetCookies(['session=abc; PATH=/; DOMAIN=.example.com']);
|
|
188
|
+
assert.ok(parsed['session']);
|
|
189
|
+
assert.strictEqual(parsed['session'].value, 'abc');
|
|
190
|
+
assert.strictEqual(parsed['session'].path, '/');
|
|
191
|
+
assert.strictEqual(parsed['session'].domain, 'example.com');
|
|
192
|
+
});
|
|
193
|
+
it('should handle duplicate attributes', () => {
|
|
194
|
+
const parsed = parseSetCookies(['session=abc; Path=/api; Path=/']);
|
|
195
|
+
assert.ok(parsed['session']);
|
|
196
|
+
assert.strictEqual(parsed['session'].path, '/');
|
|
197
|
+
});
|
|
198
|
+
it('should handle whitespace in attributes', () => {
|
|
199
|
+
const parsed = parseSetCookies(['session = abc ; Path = / ; Secure']);
|
|
200
|
+
assert.ok(parsed['session']);
|
|
201
|
+
assert.strictEqual(parsed['session'].value, 'abc');
|
|
202
|
+
assert.strictEqual(parsed['session'].path, '/');
|
|
203
|
+
assert.strictEqual(parsed['session'].secure, true);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
describe('formatSetCookies', () => {
|
|
208
|
+
describe('basic formatting', () => {
|
|
209
|
+
it('should format set-cookie with value only', () => {
|
|
210
|
+
const formatted = formatSetCookies({ session: { value: 'abc123' } });
|
|
211
|
+
assert.match(formatted.join('\n'), /session=abc123/);
|
|
212
|
+
});
|
|
213
|
+
it('should format with path', () => {
|
|
214
|
+
const formatted = formatSetCookies({
|
|
215
|
+
session: { value: 'abc', path: '/api' },
|
|
216
|
+
});
|
|
217
|
+
assert.match(formatted.join('\n'), /session=abc; Path=\/api/);
|
|
218
|
+
});
|
|
219
|
+
it('should format with domain', () => {
|
|
220
|
+
const formatted = formatSetCookies({
|
|
221
|
+
session: { value: 'abc', domain: 'example.com' },
|
|
222
|
+
});
|
|
223
|
+
assert.match(formatted.join('\n'), /session=abc; Domain=example\.com/);
|
|
224
|
+
});
|
|
225
|
+
it('should format multiple cookies', () => {
|
|
226
|
+
const formatted = formatSetCookies({
|
|
227
|
+
a: { value: '1' },
|
|
228
|
+
b: { value: '2' },
|
|
229
|
+
});
|
|
230
|
+
assert.match(formatted.join('\n'), /a=1/);
|
|
231
|
+
assert.match(formatted.join('\n'), /b=2/);
|
|
232
|
+
assert.strictEqual(formatted.length, 2);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
describe('flags formatting', () => {
|
|
236
|
+
it('should format secure flag', () => {
|
|
237
|
+
const formatted = formatSetCookies({
|
|
238
|
+
session: { value: 'abc', secure: true },
|
|
239
|
+
});
|
|
240
|
+
assert.match(formatted.join('\n'), /session=abc; Secure/);
|
|
241
|
+
});
|
|
242
|
+
it('should format httpOnly flag', () => {
|
|
243
|
+
const formatted = formatSetCookies({
|
|
244
|
+
session: { value: 'abc', httpOnly: true },
|
|
245
|
+
});
|
|
246
|
+
assert.match(formatted.join('\n'), /session=abc; HttpOnly/);
|
|
247
|
+
});
|
|
248
|
+
it('should format sameSite attribute', () => {
|
|
249
|
+
const formatted = formatSetCookies({
|
|
250
|
+
session: { value: 'abc', sameSite: 'Strict' },
|
|
251
|
+
});
|
|
252
|
+
assert.match(formatted.join('\n'), /session=abc; SameSite=Strict/);
|
|
253
|
+
});
|
|
254
|
+
it('should format multiple flags', () => {
|
|
255
|
+
const formatted = formatSetCookies({
|
|
256
|
+
session: {
|
|
257
|
+
value: 'abc',
|
|
258
|
+
secure: true,
|
|
259
|
+
httpOnly: true,
|
|
260
|
+
sameSite: 'Lax',
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
assert.match(formatted.join('\n'), /Secure/);
|
|
264
|
+
assert.match(formatted.join('\n'), /HttpOnly/);
|
|
265
|
+
assert.match(formatted.join('\n'), /SameSite=Lax/);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
describe('expiration formatting', () => {
|
|
269
|
+
it('should format expires timestamp', () => {
|
|
270
|
+
const formatted = formatSetCookies({
|
|
271
|
+
session: { value: 'abc', expires: 1623233894000 },
|
|
272
|
+
});
|
|
273
|
+
assert.match(formatted.join('\n'), /session=abc; Expires=Wed, 09 Jun 2021 10:18:14 GMT/);
|
|
274
|
+
});
|
|
275
|
+
it('should format max-age', () => {
|
|
276
|
+
const formatted = formatSetCookies({
|
|
277
|
+
session: { value: 'abc', maxAge: 3600 },
|
|
278
|
+
});
|
|
279
|
+
assert.match(formatted.join('\n'), /session=abc; Max-Age=3600/);
|
|
280
|
+
});
|
|
281
|
+
it('should skip null expires', () => {
|
|
282
|
+
const formatted = formatSetCookies({
|
|
283
|
+
session: { value: 'abc', expires: null },
|
|
284
|
+
});
|
|
285
|
+
assert.match(formatted.join('\n'), /session=abc/);
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
describe('null/undefined handling', () => {
|
|
289
|
+
it('should skip null cookies', () => {
|
|
290
|
+
const formatted = formatSetCookies({
|
|
291
|
+
session: null,
|
|
292
|
+
});
|
|
293
|
+
assert.strictEqual(formatted.length, 0);
|
|
294
|
+
});
|
|
295
|
+
it('should skip undefined cookies', () => {
|
|
296
|
+
const formatted = formatSetCookies({
|
|
297
|
+
session: undefined,
|
|
298
|
+
});
|
|
299
|
+
assert.strictEqual(formatted.length, 0);
|
|
300
|
+
});
|
|
301
|
+
it('should skip null attributes', () => {
|
|
302
|
+
const formatted = formatSetCookies({
|
|
303
|
+
session: {
|
|
304
|
+
value: 'abc',
|
|
305
|
+
path: null,
|
|
306
|
+
domain: null,
|
|
307
|
+
},
|
|
308
|
+
});
|
|
309
|
+
const str = formatted.join('\n');
|
|
310
|
+
assert.strictEqual(str.includes('Path=null'), false);
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
describe('roundtrip', () => {
|
|
314
|
+
it('should parse and format set-cookies correctly', () => {
|
|
315
|
+
const original = 'session=abc123; Path=/; Secure; HttpOnly';
|
|
316
|
+
const parsed = parseSetCookies([original]);
|
|
317
|
+
const formatted = formatSetCookies(parsed);
|
|
318
|
+
assert.match(formatted.join('\n'), /session=abc123/);
|
|
319
|
+
assert.match(formatted.join('\n'), /Path=\//);
|
|
320
|
+
assert.match(formatted.join('\n'), /Secure/);
|
|
321
|
+
assert.match(formatted.join('\n'), /HttpOnly/);
|
|
322
|
+
});
|
|
323
|
+
it('should preserve values through roundtrip', () => {
|
|
324
|
+
const original = {
|
|
325
|
+
session: {
|
|
326
|
+
value: 'xyz789',
|
|
327
|
+
path: '/api',
|
|
328
|
+
domain: 'example.com',
|
|
329
|
+
secure: true,
|
|
330
|
+
httpOnly: true,
|
|
331
|
+
sameSite: 'strict',
|
|
332
|
+
},
|
|
333
|
+
};
|
|
334
|
+
const formatted = formatSetCookies(original);
|
|
335
|
+
const parsed = parseSetCookies(formatted);
|
|
336
|
+
assert.ok(parsed['session']);
|
|
337
|
+
assert.strictEqual(parsed['session'].value, original['session'].value);
|
|
338
|
+
assert.strictEqual(parsed['session'].path, original['session'].path);
|
|
339
|
+
assert.strictEqual(parsed['session'].domain, original['session'].domain);
|
|
340
|
+
assert.strictEqual(parsed['session'].secure, original['session'].secure);
|
|
341
|
+
assert.strictEqual(parsed['session'].httpOnly, original['session'].httpOnly);
|
|
342
|
+
assert.strictEqual(parsed['session'].sameSite, original['session'].sameSite);
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
describe('edge cases', () => {
|
|
346
|
+
it('should handle empty cookies object', () => {
|
|
347
|
+
const formatted = formatSetCookies({});
|
|
348
|
+
assert.strictEqual(formatted.length, 0);
|
|
349
|
+
});
|
|
350
|
+
it('should handle special characters in value', () => {
|
|
351
|
+
const formatted = formatSetCookies({
|
|
352
|
+
token: { value: 'abc=def;ghi[jkl]' },
|
|
353
|
+
});
|
|
354
|
+
assert.strictEqual(formatted.length, 1);
|
|
355
|
+
});
|
|
356
|
+
it('should handle very long values', () => {
|
|
357
|
+
const longValue = 'x'.repeat(4096);
|
|
358
|
+
const formatted = formatSetCookies({
|
|
359
|
+
data: { value: longValue },
|
|
360
|
+
});
|
|
361
|
+
assert.match(formatted.join('\n'), new RegExp(`data=${longValue}`));
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
//# sourceMappingURL=cookies.test.js.map
|