fix: use tryParseJson in CeTool version detection to avoid premature promise failure on non-JSON responses

This commit is contained in:
copilot-swe-agent[bot]
2026-08-01 02:12:01 +00:00
committed by GitHub
parent 7299fd8762
commit 4bc880a41b
2 changed files with 38 additions and 22 deletions
@@ -391,6 +391,28 @@ public abstract class PanBase implements IPanTool, Closeable {
} }
} }
/**
* 尝试将响应体解析为 JsonObject,失败时静默返回 null(不调用 fail())。
* 适用于版本探测等场景:响应可能是 HTML,此时不应立即终止解析流程。
*
* @param res HttpResponse
* @return JsonObject,若响应体不是合法 JSON 则返回 null
*/
protected JsonObject tryParseJson(HttpResponse<?> res) {
String contentEncoding = res.getHeader("Content-Encoding");
try {
if ("gzip".equalsIgnoreCase(contentEncoding)) {
String decompressed = decompressGzip((Buffer) res.body());
return new JsonObject(decompressed);
} else {
return res.bodyAsJsonObject();
}
} catch (Exception e) {
log.debug("响应体不是合法JSON,跳过: {}", e.getMessage());
return null;
}
}
/** /**
* body To text的封装, 会自动处理异常, 会自动解压gzip * body To text的封装, 会自动处理异常, 会自动解压gzip
* @param res HttpResponse * @param res HttpResponse
@@ -81,18 +81,15 @@ public class CeTool extends PanBase {
// 禁止跟随重定向:assertPublicHost 只校验初始 host,自动 30x 会绕过 SSRF 防护 // 禁止跟随重定向:assertPublicHost 只校验初始 host,自动 30x 会绕过 SSRF 防护
clientNoRedirects.getAbs(pingUrlV4).send().onSuccess(res -> { clientNoRedirects.getAbs(pingUrlV4).send().onSuccess(res -> {
if (res.statusCode() == 200) { if (res.statusCode() == 200) {
try { // 使用 tryParseJson 而非 asJson,避免非JSON响应(如HTML)提前终止整个解析流程
JsonObject json = asJson(res); JsonObject json = tryParseJson(res);
// v4 ping 成功且返回有效JSON,使用 Ce4Tool // v4 ping 成功且返回有效JSON,使用 Ce4Tool
if (json != null && !json.isEmpty()) { if (json != null && !json.isEmpty()) {
log.debug("检测到Cloudreve 4.x (通过v4 ping)"); log.debug("检测到Cloudreve 4.x (通过v4 ping)");
delegateToCe4Tool(); delegateToCe4Tool();
return; return;
}
} catch (Exception e) {
// JSON解析失败,继续尝试 v3
log.debug("v4 ping返回非JSON响应,尝试v3");
} }
log.debug("v4 ping返回非JSON响应,尝试v3");
} }
// v4 ping失败或返回非JSON,尝试 v3 // v4 ping失败或返回非JSON,尝试 v3
tryV3Ping(baseUrl, key, pwd); tryV3Ping(baseUrl, key, pwd);
@@ -111,18 +108,15 @@ public class CeTool extends PanBase {
clientNoRedirects.getAbs(pingUrlV3).send().onSuccess(res -> { clientNoRedirects.getAbs(pingUrlV3).send().onSuccess(res -> {
if (res.statusCode() == 200) { if (res.statusCode() == 200) {
try { // 使用 tryParseJson 而非 asJson,避免非JSON响应(如HTML)提前终止整个解析流程
JsonObject json = asJson(res); JsonObject json = tryParseJson(res);
// v3 ping 成功且返回有效JSON,进一步验证是否为 v3 // v3 ping 成功且返回有效JSON,进一步验证是否为 v3
if (json != null && !json.isEmpty()) { if (json != null && !json.isEmpty()) {
// 尝试调用 v3 share API 来确认 // 尝试调用 v3 share API 来确认
verifyV3AndParse(baseUrl, key, pwd); verifyV3AndParse(baseUrl, key, pwd);
return; return;
}
} catch (Exception e) {
// JSON解析失败,不是Cloudreve盘
log.debug("v3 ping返回非JSON响应,不是Cloudreve盘");
} }
log.debug("v3 ping返回非JSON响应,不是Cloudreve盘");
} }
// v3 ping失败,不是Cloudreve盘 // v3 ping失败,不是Cloudreve盘
log.debug("v3 ping失败,尝试下一个解析器"); log.debug("v3 ping失败,尝试下一个解析器");