订阅线路的类型、延迟和测速都改走 provider 接口
404 不是 bug。内核的 /proxies 只返回全局名字表(内置出站、自有线路、策略组),
订阅线路不在里面——跟「订阅线路不能被入站直接引用」是同一条约束,我没想到它同样
适用于运行时接口。所以 /proxies/{订阅线路}/delay 一律 404,而订阅线路的卡片也一直
没有协议和延迟,因为那些数据同样查不到。
现在运行时状态从两处合成:/proxies 给内置出站和策略组,/providers/proxies 给订阅线路
(它返回的线路本来就带完整的协议和延迟历史)。测速按线路归属选接口,订阅线路走
{订阅}/{线路}/healthcheck。实测该接口对同一条线路返回 200 和 325 毫秒。
This commit is contained in:
+11
-1
@@ -22,6 +22,14 @@ import type { Env } from './env.ts'
|
||||
*/
|
||||
const DELAY_PATH = /^\/(proxies|group)\/.+\/delay$/
|
||||
|
||||
/**
|
||||
* 订阅线路的健康检查。
|
||||
*
|
||||
* 订阅线路不在内核的全局名字表里,所以 /proxies/{名字}/delay 对它们一律 404——
|
||||
* 要测只能从它所属的订阅进去。整条订阅测用 {订阅}/healthcheck,单条用 {订阅}/{线路}/healthcheck。
|
||||
*/
|
||||
const HEALTHCHECK_PATH = /^\/providers\/proxies\/[^/]+(\/[^/]+)?\/healthcheck$/
|
||||
|
||||
/** 允许透传的管理接口路径。白名单而不是黑名单——多开一个口子要有意为之。 */
|
||||
const READABLE_KERNEL_PATHS = new Set([
|
||||
'/version',
|
||||
@@ -124,7 +132,9 @@ export function createRouter(env: Env, token: string) {
|
||||
|
||||
if (path.startsWith('/api/kernel/') && req.method === 'GET') {
|
||||
const target = path.slice('/api/kernel'.length)
|
||||
if (!READABLE_KERNEL_PATHS.has(target) && !DELAY_PATH.test(target)) {
|
||||
const allowed =
|
||||
READABLE_KERNEL_PATHS.has(target) || DELAY_PATH.test(target) || HEALTHCHECK_PATH.test(target)
|
||||
if (!allowed) {
|
||||
return json({ error: `不允许透传这个路径:${target}` }, 403)
|
||||
}
|
||||
const upstream = await proxyGet(env, target + url.search)
|
||||
|
||||
Reference in New Issue
Block a user