Skip to content

Commit a0ab0d8

Browse files
committed
fix(api): 立即处理HEAD请求以返回健康检查状态
将HEAD请求的处理逻辑提前到输入验证之前,直接返回200状态码和适当的响应头,避免不必要的上游请求处理。同时修复了GET请求处理中误包含HEAD方法的问题。
1 parent d2ab424 commit a0ab0d8

1 file changed

Lines changed: 17 additions & 20 deletions

File tree

src/app/api/doh/[provider]/route.ts

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,22 @@ async function handleDoH(request: NextRequest, providerId: string) {
8989
let responseStatus = 500;
9090

9191
try {
92+
// 0. Handle HEAD requests immediately (Health Check)
93+
if (request.method === 'HEAD') {
94+
responseStatus = 200;
95+
const responseHeaders = new Headers();
96+
responseHeaders.set('Cache-Control', 'no-store, max-age=0');
97+
responseHeaders.set('Pragma', 'no-cache');
98+
responseHeaders.set('Expires', '0');
99+
responseHeaders.set('Vary', 'Accept, Accept-Encoding');
100+
responseHeaders.set('Access-Control-Allow-Origin', '*');
101+
102+
return new NextResponse(null, {
103+
status: 200,
104+
headers: responseHeaders,
105+
});
106+
}
107+
92108
// 1. Input Validation
93109
const url = new URL(request.url);
94110
const validationError = validateRequest(url);
@@ -133,7 +149,7 @@ async function handleDoH(request: NextRequest, providerId: string) {
133149
const upstreamUrl = new URL(upstreamEndpoint);
134150

135151
// Pass through query params for GET, excluding internal ones
136-
if (request.method === 'GET' || request.method === 'HEAD') {
152+
if (request.method === 'GET') {
137153
url.searchParams.forEach((value, key) => {
138154
if (key !== 'upstream') { // Don't pass 'upstream' param to the DNS server
139155
upstreamUrl.searchParams.append(key, value);
@@ -159,25 +175,6 @@ async function handleDoH(request: NextRequest, providerId: string) {
159175
const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
160176

161177
try {
162-
// Handle HEAD method separately to return health status without fetching upstream body
163-
// But user requested to return health status directly for HEAD requests
164-
if (request.method === 'HEAD') {
165-
clearTimeout(timeoutId);
166-
responseStatus = 204;
167-
const responseHeaders = new Headers();
168-
// Strict Cache Control
169-
responseHeaders.set('Cache-Control', 'no-store, max-age=0');
170-
responseHeaders.set('Pragma', 'no-cache');
171-
responseHeaders.set('Expires', '0');
172-
responseHeaders.set('Vary', 'Accept, Accept-Encoding');
173-
responseHeaders.set('Access-Control-Allow-Origin', '*');
174-
175-
return new NextResponse(null, {
176-
status: 204,
177-
headers: responseHeaders,
178-
});
179-
}
180-
181178
const upstreamResponse = await fetch(upstreamUrl.toString(), {
182179
method: request.method,
183180
headers: headers,

0 commit comments

Comments
 (0)