Skip to content

fix utf8#13

Merged
seeker-zuo merged 1 commit into
wp-labs:mainfrom
zwk4zhendeC:main
May 26, 2026
Merged

fix utf8#13
seeker-zuo merged 1 commit into
wp-labs:mainfrom
zwk4zhendeC:main

Conversation

@zwk4zhendeC

Copy link
Copy Markdown
Contributor

Fix copy_raw handling for invalid UTF-8 payloads

Summary

修复 copy_raw 在原始日志包含非法 UTF-8 字节时导致解析结果进入 miss 的问题。

本次修复位置在 wp-lang

/Users/zwk/src_code/wp-labs/wp-lang/src/ast/ann_func.rs

修复后,copy_raw 对 bytes payload 使用 lossy UTF-8 方式生成 raw_msg,非法字节会以替代字符展示,不再导致整条日志解析失败。

Problem

当 WPL 规则使用 #[copy_raw(name:"raw_msg")] 时,规则匹配成功后会把原始日志写入 raw_msg 字段。

在原始日志是 bytes payload 且包含非法 UTF-8 字节时,copy_raw 原先会使用严格 UTF-8 转换处理原始 bytes。转换失败后,annotation 阶段返回错误,导致已经匹配成功的日志最终进入 miss。

实际用户现象:

src_key: tcp_1  | data:
180.57.30.148 - - [21/Jan/2025:01:40:02 +0800] "GET /nginx-logo.png HTTP/1.1" 500 368 "http://207.131.38.110/�����" ...
target wpl: /example/nginx_raw
Error: data error

JSON 场景同样会出现:

{"sip":"10.0.220.200","dip":"10.0.220.201","�����":"2","log_type":"pg������"}
target wpl: /example/nginx_json
Error: data error

Changes

src/ast/ann_func.rs

调整 RawCopy::proc 中对 bytes payload 的处理。

修改前:

RawData::Bytes(raw) => match std::str::from_utf8(raw) {
    Ok(str) => {
        data.append(DataField::from_chars(self.raw_key.clone(), str.to_string()));
    }
    Err(e) => {
        return Err(...);
    }
}

修改后:

RawData::Bytes(raw) => {
    data.append(DataField::from_chars(
        self.raw_key.clone(),
        String::from_utf8_lossy(raw).into_owned(),
    ));
}

同时对 RawData::ArcBytes 做同样处理。

这样 RawData::StringRawData::BytesRawData::ArcBytes 三类 payload 在 copy_raw 下都可以稳定写入 raw_msg

Tests

新增测试:

test_copy_fun_handles_invalid_utf8_bytes
test_copy_fun_handles_invalid_utf8_arc_bytes

覆盖场景:

  • RawData::Bytes 中包含非法 UTF-8 字节。
  • RawData::ArcBytes 中包含非法 UTF-8 字节。
  • copy_raw 不返回错误。
  • raw_msg 字段内容等于 lossy UTF-8 后的结果。

保留并通过既有测试:

test_copy_fun
test_tag_fun

Verification

已在 wp-lang 仓库执行:

cargo fmt --all
cargo test ast::ann_func::tests::test_copy_fun
cargo test

验证结果:

cargo test ast::ann_func::tests::test_copy_fun
  3 passed; 0 failed

cargo test
  418 passed; 0 failed

User Impact

修复前:

日志主规则匹配成功
copy_raw 写入 raw_msg 时失败
整条日志进入 miss

修复后:

日志主规则匹配成功
copy_raw 正常写入 raw_msg
日志正常输出到业务 sink

非法字节在 raw_msg 中会显示为替代字符

Risk

风险较低。

该改动只影响 copy_raw 对 bytes payload 的处理方式。

行为变化:

  • 之前非法 UTF-8 bytes 会导致 copy_raw 返回错误。
  • 现在非法 UTF-8 bytes 会被替换为 并写入 raw_msg

如果未来需要保留完全原始的二进制内容,应新增专门的 bytes/base64/hex 类型或编码策略,而不应继续放入 chars 类型字段。

Related Issue

tmp/copy-raw-invalid-utf8-issue.md

@codecov

codecov Bot commented May 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@seeker-zuo seeker-zuo merged commit b71ef5c into wp-labs:main May 26, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants