问题描述
更新到最新版本后,使用第三方转换后端获取订阅时,如果节点数量较多,会返回以下错误:
{
"error": "Internal Server Error",
"message": "external nodes callback secret is missing"
}
节点数量较少时转换正常。
该问题在同时使用第三方转换后端和远程模板时较容易复现。
相关 Issue:#397
原因分析
当前实现会先将完整节点列表内联到第三方转换请求的 url 参数中。当 URL 长度超过 6000 字符或节点数量超过 80 个时,项目会切
换到临时回调模式。
临时回调模式依赖 CALLBACK_TOKEN_SECRET 或 COOKIE_SECRET。如果未配置对应密钥,项目会在生成回调令牌时抛出:
external nodes callback secret is missing
因此,节点数量只是触发回调分支的条件,实际的 500 错误来自项目内部缺少回调密钥。
此外,当前流程会先写入临时节点缓存,再生成回调令牌。如果令牌生成失败,可能留下无效的临时缓存写入,操作不具备原子性。
复现步骤
- 配置第三方 subconverter 后端。
- 使用包含较多节点的订阅,例如超过 80 个节点。
- 不配置 CALLBACK_TOKEN_SECRET 和 COOKIE_SECRET。
- 请求 Clash 等需要第三方转换的订阅链接。
- 服务返回 500,并提示回调密钥缺失。
期望行为
项目已有 Base64 订阅输出能力,可以将当前订阅地址转换为:
https://example.com/<subscription-path>?base64&callback_token=external
建议修复
- 第三方转换请求的 url 参数统一使用当前订阅的
?base64&callback_token=external 地址。
- 不再内联完整节点列表。
- 不再根据节点数量或 URL 长度切换临时回调模式。
这样既能修复回调密钥缺失导致的 500,也能避免完整节点列表造成 URL 过长。
问题描述
更新到最新版本后,使用第三方转换后端获取订阅时,如果节点数量较多,会返回以下错误:
{ "error": "Internal Server Error", "message": "external nodes callback secret is missing" }节点数量较少时转换正常。
该问题在同时使用第三方转换后端和远程模板时较容易复现。
相关 Issue:#397
原因分析
当前实现会先将完整节点列表内联到第三方转换请求的 url 参数中。当 URL 长度超过 6000 字符或节点数量超过 80 个时,项目会切
换到临时回调模式。
临时回调模式依赖 CALLBACK_TOKEN_SECRET 或 COOKIE_SECRET。如果未配置对应密钥,项目会在生成回调令牌时抛出:
external nodes callback secret is missing因此,节点数量只是触发回调分支的条件,实际的 500 错误来自项目内部缺少回调密钥。
此外,当前流程会先写入临时节点缓存,再生成回调令牌。如果令牌生成失败,可能留下无效的临时缓存写入,操作不具备原子性。
复现步骤
期望行为
项目已有 Base64 订阅输出能力,可以将当前订阅地址转换为:
https://example.com/<subscription-path>?base64&callback_token=external建议修复
?base64&callback_token=external地址。这样既能修复回调密钥缺失导致的 500,也能避免完整节点列表造成 URL 过长。