diff --git a/patch_v2/ncm_app/bench/http_truncate_sim.c b/patch_v2/ncm_app/bench/http_truncate_sim.c index a1dce32..1ac2d13 100644 --- a/patch_v2/ncm_app/bench/http_truncate_sim.c +++ b/patch_v2/ncm_app/bench/http_truncate_sim.c @@ -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; } diff --git a/patch_v2/ncm_app/core/ncm_http.c b/patch_v2/ncm_app/core/ncm_http.c index 5fbfe2d..fdf0ddf 100644 --- a/patch_v2/ncm_app/core/ncm_http.c +++ b/patch_v2/ncm_app/core/ncm_http.c @@ -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: