-
-
Notifications
You must be signed in to change notification settings - Fork 7
/
cookie_client.ts
73 lines (57 loc) · 2.37 KB
/
cookie_client.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import type { Agent, Dispatcher } from 'undici';
import { Client, RedirectHandler } from 'undici';
import { kDispatch, kMaxRedirections, kUrl } from 'undici/lib/core/symbols';
import type { CookieOptions } from '../cookie_options';
import { createCookieHeaderValue } from '../utils/create_cookie_header_value';
import { validateCookieOptions } from '../utils/validate_cookie_options';
import { CookieHandler } from './cookie_handler';
import { convertToHeadersObject } from './utils/convert_to_headers_object';
const kCookieOptions = Symbol('cookieOptions');
function createCookieClient<BaseClient extends Client = Client, BaseClientOptions = Client.Options>(
BaseClientClass: new (origin: string | URL, options: BaseClientOptions) => BaseClient,
) {
type CookieClientOptions = BaseClientOptions & {
cookies?: CookieOptions | undefined;
};
// @ts-expect-error ...
class CookieClient extends BaseClientClass {
private [kCookieOptions]: CookieOptions | undefined;
constructor(
url: string | URL,
{ cookies: cookieOpts, ...options }: CookieClientOptions = {} as CookieClientOptions,
) {
super(url, options as BaseClientOptions);
if (cookieOpts) {
validateCookieOptions(cookieOpts);
this[kCookieOptions] = cookieOpts;
}
}
override [kDispatch](opts: Agent.DispatchOptions, handler: Dispatcher.DispatchHandlers) {
const { maxRedirections = this[kMaxRedirections] } = opts;
if (maxRedirections) {
opts = { ...opts, maxRedirections: 0 };
handler = new RedirectHandler(this, maxRedirections, opts, handler);
}
const cookieOptions = this[kCookieOptions];
if (cookieOptions) {
const origin = opts.origin || this[kUrl].origin;
const requestUrl = new URL(opts.path, origin).toString();
const headers = convertToHeadersObject(opts.headers);
const cookieHeader = createCookieHeaderValue({
cookieOptions,
passedValues: [headers['cookie']],
requestUrl,
});
if (cookieHeader) {
headers['cookie'] = cookieHeader;
}
opts = { ...opts, headers };
handler = new CookieHandler(requestUrl, cookieOptions, handler);
}
return super[kDispatch](opts, handler);
}
}
return CookieClient;
}
const CookieClient = createCookieClient(Client);
export { CookieClient, createCookieClient };