-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmiddlewareMain.ts
129 lines (125 loc) · 4.17 KB
/
middlewareMain.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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import { DenoMiddleWare } from "./DenoMiddleWare.ts";
import { reverse_proxy } from "./reverse_proxy.ts";
/**
* 主要中间件处理函数
*
* @param request 请求对象,包含请求的方法和URL等信息
* @param info 请求的额外信息,例如远程地址
* @param next 中间件链中的下一个函数,用于继续处理请求或结束请求处理
* @returns 返回一个响应对象
*/
export async function middlewareMain(
...[request, info, next]: Parameters<DenoMiddleWare>
): Promise<Response> {
const nextUrl = new URL(request.url);
console.log(
JSON.stringify(
{
method: request.method,
url: request.url,
headers: Object.fromEntries(request.headers),
},
null,
4,
),
);
const token = Deno.env.get("token");
if (!token) {
return next(request, info);
}
const requestHeaders = new Headers(request.headers);
requestHeaders.append(
"Forwarded",
`by=${nextUrl.host}; for=${info.remoteAddr.hostname}; host=${nextUrl.host}; proto=${
nextUrl.href.startsWith("https://") ? "https" : "http"
}`,
);
if (nextUrl.pathname.startsWith("/token/" + token + "/http/")) {
let url = new URL(
"http://" + nextUrl.pathname.slice(6 + ("/token/" + token).length),
);
url.search = nextUrl.search;
/* 循环处理多重前缀 */
while (url.pathname.startsWith("/token/" + token + "/http/")) {
url = new URL(
"http://" + url.pathname.slice(6 + ("/token/" + token).length),
);
url.search = nextUrl.search;
}
console.log(
JSON.stringify(
{
method: request.method,
url: request.url,
headers: Object.fromEntries(request.headers),
},
null,
4,
),
);
// const requestHeaders = new Headers(request.headers);
requestHeaders.set("host", url.hostname);
// url.protocol = "https";
// url.hostname = hostname;
// url.port = String(443);
// url.pathname = url.pathname; //.replace(/^\//, '');
return await reverse_proxy(url, requestHeaders, request);
}
if (nextUrl.pathname.startsWith("/token/" + token + "/https/")) {
let url = new URL(
"https://" +
nextUrl.pathname.slice(6 + 1 + ("/token/" + token).length),
);
/* 添加search */
url.search = nextUrl.search;
/* 循环处理多重前缀 */
while (url.pathname.startsWith("/token/" + token + "/https/")) {
url = new URL(
"https://" +
url.pathname.slice(6 + 1 + ("/token/" + token).length),
);
/* 添加search */
url.search = nextUrl.search;
}
console.log(
JSON.stringify(
{
method: request.method,
url: request.url,
headers: Object.fromEntries(request.headers),
},
null,
4,
),
);
requestHeaders.set("host", url.hostname);
// url.protocol = "https";
// url.hostname = hostname;
// url.port = String(443);
// url.pathname = url.pathname; //.replace(/^\//, '');
// return NextResponse.rewrite(url, {
// headers: requestHeaders,
// });
return await reverse_proxy(url, requestHeaders, request);
}
const resp = await next(request, info);
// resp.headers.set("server", "fresh server");
console.log(
JSON.stringify(
{
response: {
headers: Object.fromEntries(resp.headers),
status: resp.status,
},
request: {
method: request.method,
url: request.url,
headers: Object.fromEntries(request.headers),
},
},
null,
4,
),
);
return resp;
}