-
Notifications
You must be signed in to change notification settings - Fork 879
Expand file tree
/
Copy pathrouter.ts
More file actions
60 lines (49 loc) · 1.45 KB
/
Copy pathrouter.ts
File metadata and controls
60 lines (49 loc) · 1.45 KB
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
import type * as http from 'node:http';
import type { ProxyServerOptions } from 'httpxy';
import isPlainObject from 'is-plain-obj';
import { Debug } from './debug.js';
import type { Options } from './index.js';
const debug = Debug.extend('router');
export async function getTarget<
TReq extends http.IncomingMessage = http.IncomingMessage,
TRes extends http.ServerResponse = http.ServerResponse,
>(req: TReq, config: Options<TReq, TRes>) {
let newTarget;
const router = config.router;
if (isPlainObject(router)) {
newTarget = getTargetFromProxyTable(req, router);
} else if (typeof router === 'function') {
newTarget = await router(req);
}
return newTarget;
}
function getTargetFromProxyTable<TReq extends http.IncomingMessage>(
req: TReq,
table: Record<string, ProxyServerOptions['target']>,
) {
let result;
const host = req.headers.host ?? '';
const path = req.url ?? '';
const hostAndPath = host + path;
for (const [key, value] of Object.entries(table)) {
if (containsPath(key)) {
if (hostAndPath.indexOf(key) > -1) {
// match 'localhost:3000/api'
result = value;
debug('match: "%s" -> "%s"', key, result);
break;
}
} else {
if (key === host) {
// match 'localhost:3000'
result = value;
debug('match: "%s" -> "%s"', host, result);
break;
}
}
}
return result;
}
function containsPath(v: string) {
return v.indexOf('/') > -1;
}