From d520a173a020683837761dcbc29bf0211c55a6f6 Mon Sep 17 00:00:00 2001 From: Lykin <137850705+tiny-craft@users.noreply.github.com> Date: Mon, 30 Mar 2026 10:11:14 +0800 Subject: [PATCH] pref: optimize msgpack convert --- backend/utils/convert/msgpack_convert.go | 27 ++++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/backend/utils/convert/msgpack_convert.go b/backend/utils/convert/msgpack_convert.go index 7bbe83d..e5ad527 100644 --- a/backend/utils/convert/msgpack_convert.go +++ b/backend/utils/convert/msgpack_convert.go @@ -30,7 +30,11 @@ func (c MsgpackConvert) Encode(str string) (string, bool) { return str, false } -func (MsgpackConvert) Decode(str string) (string, bool) { +func (c MsgpackConvert) Decode(str string) (string, bool) { + if !c.MaybeMsgpack(str) { + return str, false + } + var decodedStr string if err := msgpack.Unmarshal([]byte(str), &decodedStr); err == nil { return decodedStr, true @@ -39,24 +43,33 @@ func (MsgpackConvert) Decode(str string) (string, bool) { var obj map[string]any if err := msgpack.Unmarshal([]byte(str), &obj); err == nil { if b, err := json.Marshal(obj); err == nil { - if len(b) >= 10 { - return string(b), true - } + return string(b), true } } var arr []any if err := msgpack.Unmarshal([]byte(str), &arr); err == nil { if b, err := json.Marshal(arr); err == nil { - if len(b) >= 10 { - return string(b), true - } + return string(b), true } } return str, false } +func (c MsgpackConvert) MaybeMsgpack(input string) bool { + byt := []byte(input) + if len(byt) < 2 { + return false + } + + b := byt[0] + + // fixmap 0x80-0x8f, fixarray 0x90-0x9f + // array16 0xdc, array32 0xdd, map16 0xde, map32 0xdf + return (b >= 0x80 && b <= 0x9f) || (b >= 0xdc && b <= 0xdf) +} + func (c MsgpackConvert) TryFloatToInt(input any) any { switch val := input.(type) { case map[string]any: