fix(ncm): http_ret_norm 保留 NCM_ERR_JSON(评审 P2-1:畸形分块不再误报断网)
问题:http_run 在 body_feed 失败时返回 NCM_ERR_JSON(畸形 chunk 尺寸/帧体), 但 http_ret_norm 的白名单漏了它,落到 default 被改判 NCM_ERR_NET → 上层按网络类 进离线模式,明明是数据/协议错误却误报「网络不可用」,也会误导离线恢复重试。 修法:白名单补 NCM_ERR_JSON(已属 NCM 错误码的一律原样返回),并把「不得改判」 写进函数注释。测试:http_truncate_sim 新增畸形分块用例(chunk 尺寸行 "ZZ"), 期望 NCM_ERR_JSON;修前该用例会得到 -4。 验证:http_truncate_sim 13 PASS(原 8 截断 + 4 传输归一 + 1 本用例)。
This commit is contained in:
1 parent
2ca386973b
commit
b1d607d43f
2 files changed
+17
-1
No files matched your search
@@ -333,6 +333,19 @@ int main(void) {
|
||||
check("ca_load_fail -> NCM_ERR_TLS", r.rc == NCM_ERR_TLS, dbg);
|
||||
}
|
||||
|
||||
/* ---- 场景 13(M9):chunked 分块尺寸畸形("ZZ" 非十六进制)→ 数据错误 NCM_ERR_JSON,
|
||||
* 不得在 http_ret_norm 里被改判成 NCM_ERR_NET(否则误报离线)。 ---- */
|
||||
{
|
||||
static const char chunk[] =
|
||||
"HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\n\r\n"
|
||||
"ZZ\r\ndata"; /* 分块尺寸行非法 */
|
||||
static const tr_chunk_t script[] = { { (const unsigned char *)chunk, sizeof chunk - 1 } };
|
||||
case_result_t r = run_case(script, 1, 0);
|
||||
snprintf(dbg, sizeof dbg, "rc=%d", r.rc);
|
||||
check("chunked_bad_size -> NCM_ERR_JSON (数据错误,不改判 NET)",
|
||||
r.rc == NCM_ERR_JSON, dbg);
|
||||
}
|
||||
|
||||
printf("\n== HTTP TRUNCATE SIM: %s ==\n", g_fail ? "FAIL" : "ALL PASS");
|
||||
return g_fail ? 1 : 0;
|
||||
}
|
||||
@@ -325,7 +325,9 @@ static int body_feed(body_st *b, const unsigned char *data, size_t len, sink_t *
|
||||
/* 传输层返回值归一(M9):mbedtls 的裸负码(如握手失败 -0x7280)此前会原样穿透给上层,
|
||||
* 上层按 NCM_ERR_* 分类时落到「未知错误」,既判不了离线也判不了鉴权——断网时的失败因此
|
||||
* 不可信。此处统一收敛:超时 → NCM_ERR_TIMEOUT;证书校验失败 → NCM_ERR_TLS;其它传输失败
|
||||
* (DNS/连接/握手/读写/对端 reset)→ NCM_ERR_NET。 */
|
||||
* (DNS/连接/握手/读写/对端 reset)→ NCM_ERR_NET。
|
||||
* 已经是 NCM 错误码的一律原样返回(含 NCM_ERR_JSON:body 分块/帧体畸形是**数据**错误,
|
||||
* 不能改判成网络不可达,否则会误报离线)。 */
|
||||
static int http_ret_norm(int ret)
|
||||
{
|
||||
switch (ret) {
|
||||
@@ -336,6 +338,7 @@ static int http_ret_norm(int ret)
|
||||
case NCM_ERR_NET:
|
||||
case NCM_ERR_TLS:
|
||||
case NCM_ERR_TIMEOUT:
|
||||
case NCM_ERR_JSON:
|
||||
case NCM_ERR_FULL:
|
||||
return ret;
|
||||
default:
|
||||
|
||||
Reference in new issue
Block a user