From 15ccd6da08435d67637ea397eb97f13510fb5728 Mon Sep 17 00:00:00 2001 From: Vasiliy Mikhailov Date: Sat, 27 Jun 2026 03:44:30 +0000 Subject: [PATCH] Preserve attribute values containing an equals sign in AttributeParser The value was split on the equals sign without a limit, truncating values that contain an equals sign. Split with a limit of 2 to keep the full value. --- .../apache/rocketmq/common/attribute/AttributeParser.java | 2 +- .../rocketmq/common/attribute/AttributeParserTest.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/org/apache/rocketmq/common/attribute/AttributeParser.java b/common/src/main/java/org/apache/rocketmq/common/attribute/AttributeParser.java index da98c6dab85..2c01288aa84 100644 --- a/common/src/main/java/org/apache/rocketmq/common/attribute/AttributeParser.java +++ b/common/src/main/java/org/apache/rocketmq/common/attribute/AttributeParser.java @@ -44,7 +44,7 @@ public static Map parseToMap(String attributesModification) { String key; String value; if (kv.contains(ATTR_KEY_VALUE_EQUAL_SIGN)) { - String[] splits = kv.split(ATTR_KEY_VALUE_EQUAL_SIGN); + String[] splits = kv.split(ATTR_KEY_VALUE_EQUAL_SIGN, 2); key = splits[0]; value = splits[1]; if (!key.contains(ATTR_ADD_PLUS_SIGN)) { diff --git a/common/src/test/java/org/apache/rocketmq/common/attribute/AttributeParserTest.java b/common/src/test/java/org/apache/rocketmq/common/attribute/AttributeParserTest.java index a89587354b9..63d180b9cfb 100644 --- a/common/src/test/java/org/apache/rocketmq/common/attribute/AttributeParserTest.java +++ b/common/src/test/java/org/apache/rocketmq/common/attribute/AttributeParserTest.java @@ -121,6 +121,13 @@ public void testParseToString() { Assert.assertEquals(addSize + deleteSize, AttributeParser.parseToString(map).split(",").length); } + @Test + public void parseToMap_ValueContainingEqualsSign_PreservesFullValue() { + String attributesModification = "+key=val=ue"; + Map result = AttributeParser.parseToMap(attributesModification); + assertEquals("val=ue", result.get("+key")); + } + @Test public void testParseBetweenStringAndMapWithoutDistortion() { List testCases = Arrays.asList("-a", "+a=b,+c=d,+z=z,+e=e", "+a=b,-d", "+a=b", "-a,-b");