-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathworker.js
131 lines (115 loc) · 3.86 KB
/
worker.js
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
130
131
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
const specialCases = {
"https://18comic.vip/": {
"Origin": "DELETE",
"Referer": "https://18comic.vip/"
},
"*": {
"Origin": "DELETE",
"Referer": "DELETE"
}
}
// 修正:处理请求头
function handleSpecialCases(request) {
const url = new URL(request.url);
const actualUrlStr = url.pathname.replace("/", "") + url.search + url.hash;
const actualUrl = new URL(actualUrlStr);
const rules = specialCases[url.hostname] || specialCases["*"];
const headers = new Headers(request.headers); // 复制原始请求头
for (const [key, value] of Object.entries(rules)) {
switch (value) {
case "KEEP":
break;
case "DELETE":
headers.delete(key); // 删除指定请求头
break;
default:
headers.set(key, value); // 设置或覆盖请求头
break;
}
}
// 返回一个新的 Request 对象
return new Request(actualUrl, {
headers: headers,
method: request.method,
body: request.body
});
}
async function handlePostRequest(request) {
try {
const { url, method, headers: customHeaders, body } = await request.json();
const headers = new Headers(customHeaders);
const modifiedRequest = new Request(url, {
method,
headers,
body: body ? JSON.stringify(body) : null
});
const response = await fetch(modifiedRequest);
const responseHeaders = new Headers(response.headers);
responseHeaders.set('Access-Control-Allow-Origin', '*');
responseHeaders.set('X-Proxy-Success', 'true');
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: responseHeaders
});
} catch (error) {
const headers = new Headers();
headers.set('Access-Control-Allow-Origin', '*');
headers.set('X-Proxy-Success', 'false');
return new Response('请求转发失败', {
status: 500,
statusText: 'Internal Server Error',
headers: headers
});
}
}
async function handleRequest(request) {
// 处理 OPTIONS 请求(预检请求)
if (request.method === 'OPTIONS') {
const headers = new Headers();
headers.set('Access-Control-Allow-Origin', '*');
headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization, User-Agent, Accept, Accept-Encoding, Accept-Language, Cache-Control, Cookie, Referer, Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-Fetch-Dest, Sec-Fetch-Mode, Sec-Fetch-Site, Sec-Fetch-User, Upgrade-Insecure-Requests');
return new Response(null, { headers });
}
const url = new URL(request.url);
if (url.pathname === "/") {
if (request.method === 'POST') {
return handlePostRequest(request);
} else {
return new Response("Please enter the link after the /")
}
}
try {
// 处理特殊请求头
const modifiedRequest = handleSpecialCases(request);
// 转发请求并获取响应
const response = await fetch(modifiedRequest);
// 处理响应头
const responseHeaders = new Headers(response.headers);
responseHeaders.set('Access-Control-Allow-Origin', '*');
responseHeaders.set('X-Proxy-Success', 'true');
// 返回新的响应对象
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: responseHeaders
});
} catch (error) {
// 处理转发失败的情况
const headers = new Headers();
headers.set('Access-Control-Allow-Origin', '*');
headers.set('X-Proxy-Success', 'false');
return new Response('请求转发失败', {
status: 500,
statusText: 'Internal Server Error',
headers: headers
});
}
}
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});