type: 收敛测试 schemas 与协议层类型
This commit is contained in:
+36
-21
@@ -1,14 +1,23 @@
|
||||
"""
|
||||
TAF/WUP 帧解码器 — 将二进制帧转为可读摘要,用于日志输出
|
||||
"""
|
||||
|
||||
from typing import Any, cast
|
||||
from .taf_protocol import TafInputStream, TafType
|
||||
from .wup_protocol import normalize_wup_payload
|
||||
|
||||
# cmd 编号 → 名称
|
||||
CMD_NAMES = {
|
||||
0x03: "RPC_REQ", 0x04: "RPC_RSP", 0x0a: "AUTH",
|
||||
0x0b: "PUSH1", 0x10: "HB_SEND", 0x11: "HB_RECV",
|
||||
0x17: "CONFIRM", 0x18: "PUSH2", 0x21: "REGISTER", 0x22: "CONFIRM_RSP",
|
||||
0x03: "RPC_REQ",
|
||||
0x04: "RPC_RSP",
|
||||
0x0A: "AUTH",
|
||||
0x0B: "PUSH1",
|
||||
0x10: "HB_SEND",
|
||||
0x11: "HB_RECV",
|
||||
0x17: "CONFIRM",
|
||||
0x18: "PUSH2",
|
||||
0x21: "REGISTER",
|
||||
0x22: "CONFIRM_RSP",
|
||||
}
|
||||
|
||||
# TAIL_BYTES = 2c36004c5c6600
|
||||
@@ -18,10 +27,14 @@ _TAIL = bytes.fromhex("2c36004c5c6600")
|
||||
def _strip_tail(body: bytes) -> bytes:
|
||||
"""裁掉 body 末尾的 TAIL_BYTES"""
|
||||
if body.endswith(_TAIL):
|
||||
return body[:-len(_TAIL)]
|
||||
return body[: -len(_TAIL)]
|
||||
# 有时 TAIL 前还有 0c (ZERO tag)
|
||||
if len(body) > 1 and body[-len(_TAIL)-1:-len(_TAIL)] == b'\x0c' and body.endswith(_TAIL):
|
||||
return body[:-len(_TAIL)-1]
|
||||
if (
|
||||
len(body) > 1
|
||||
and body[-len(_TAIL) - 1 : -len(_TAIL)] == b"\x0c"
|
||||
and body.endswith(_TAIL)
|
||||
):
|
||||
return body[: -len(_TAIL) - 1]
|
||||
return body
|
||||
|
||||
|
||||
@@ -33,16 +46,18 @@ def _decode_taf_value(ins: TafInputStream, dtype: int, depth: int = 0) -> object
|
||||
return ins._read_int_value(dtype)
|
||||
if dtype in (TafType.FLOAT, TafType.DOUBLE):
|
||||
import struct as _s
|
||||
|
||||
if dtype == TafType.FLOAT:
|
||||
return round(_s.unpack('>f', ins.buf.read(4))[0], 4)
|
||||
return round(_s.unpack('>d', ins.buf.read(8))[0], 6)
|
||||
return round(_s.unpack(">f", ins.buf.read(4))[0], 4)
|
||||
return round(_s.unpack(">d", ins.buf.read(8))[0], 6)
|
||||
if dtype == TafType.STRING1:
|
||||
ln = ins.buf.read(1)[0]
|
||||
return ins.buf.read(ln).decode('utf-8', errors='replace')
|
||||
return ins.buf.read(ln).decode("utf-8", errors="replace")
|
||||
if dtype == TafType.STRING4:
|
||||
import struct as _s
|
||||
ln = _s.unpack('>I', ins.buf.read(4))[0]
|
||||
return ins.buf.read(ln).decode('utf-8', errors='replace')
|
||||
|
||||
ln = _s.unpack(">I", ins.buf.read(4))[0]
|
||||
return ins.buf.read(ln).decode("utf-8", errors="replace")
|
||||
if dtype == TafType.MAP:
|
||||
cnt = ins._read_int_len()
|
||||
m = {}
|
||||
@@ -106,14 +121,14 @@ def _extract_wup(body: bytes) -> bytes:
|
||||
return body
|
||||
# 大包格式: [1B prefix][4B wup_len][wup_body][tail]
|
||||
# prefix 可能是 0x00,必须优先于 4B total_len 判断。
|
||||
wup_len = int.from_bytes(body[1:5], 'big')
|
||||
if 5 + wup_len <= len(body) and body[5:7] == b'\x10\x03':
|
||||
return body[5:5 + wup_len]
|
||||
total_len = int.from_bytes(body[0:4], 'big')
|
||||
if 8 <= total_len <= len(body) and body[4:6] == b'\x10\x03':
|
||||
wup_len = int.from_bytes(body[1:5], "big")
|
||||
if 5 + wup_len <= len(body) and body[5:7] == b"\x10\x03":
|
||||
return body[5 : 5 + wup_len]
|
||||
total_len = int.from_bytes(body[0:4], "big")
|
||||
if 8 <= total_len <= len(body) and body[4:6] == b"\x10\x03":
|
||||
return body[:total_len]
|
||||
if 5 + wup_len <= len(body):
|
||||
return body[5:5 + wup_len]
|
||||
return body[5 : 5 + wup_len]
|
||||
return body
|
||||
|
||||
|
||||
@@ -127,7 +142,7 @@ def _decode_wup_body(body: bytes) -> dict:
|
||||
ins = TafInputStream(wup)
|
||||
|
||||
# 读 WUP 字段 tag1~tag10,读到 tag10 后停止(忽略尾部垃圾)
|
||||
sBuffer = b''
|
||||
sBuffer = b""
|
||||
while True:
|
||||
try:
|
||||
tag, dtype = ins.peek_head()
|
||||
@@ -267,8 +282,8 @@ def format_wss_log(body: bytes, cmd: int, seq: int, direction: str) -> str:
|
||||
return f"{prefix} {label}"
|
||||
|
||||
# AUTH
|
||||
if cmd == 0x0a:
|
||||
text = _strip_tail(body).decode('utf-8', errors='replace')
|
||||
if cmd == 0x0A:
|
||||
text = _strip_tail(body).decode("utf-8", errors="replace")
|
||||
return f"{prefix} AUTH {text[:100]}{'...' if len(text) > 100 else ''}"
|
||||
|
||||
# REGISTER / CONFIRM / PUSH 等
|
||||
@@ -302,7 +317,7 @@ def format_wss_log(body: bytes, cmd: int, seq: int, direction: str) -> str:
|
||||
fields = {}
|
||||
cmd_name = CMD_NAMES.get(cmd, f"0x{cmd:02x}")
|
||||
if fields:
|
||||
return f"{prefix} {cmd_name} {_fmt_fields(_truncate(fields))}"
|
||||
return f"{prefix} {cmd_name} {_fmt_fields(cast(dict[str, Any], _truncate(fields)))}"
|
||||
return f"{prefix} {cmd_name}"
|
||||
except Exception:
|
||||
cmd_name = CMD_NAMES.get(cmd, f"0x{cmd:02x}")
|
||||
|
||||
Reference in New Issue
Block a user