From ef04738fbd2ca4ccaf8694b083c3da85ece7f78f Mon Sep 17 00:00:00 2001 From: brettlangdon Date: Mon, 31 Jan 2022 14:51:07 -0500 Subject: [PATCH] fix(internal): allow tagset values to contain equal signs Revision to the original spec to allow equal signs in tag values to accommodate base64 encoded values. --- ddtrace/internal/_tagset.pyx | 10 +++++----- tests/tracer/test_tagset.py | 10 +++++++++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/ddtrace/internal/_tagset.pyx b/ddtrace/internal/_tagset.pyx index 8bf47763dea..554df0f40ff 100644 --- a/ddtrace/internal/_tagset.pyx +++ b/ddtrace/internal/_tagset.pyx @@ -2,8 +2,9 @@ Tagset eBNF:: tagset = tag, { ",", tag }; - tag = ( identifier - space ), "=", identifier; - identifier = { ? ASCII 32-126 ? - equal or comma }; + tag = key, "=", value; + key = { ? ASCII 32-126 ? - equal or comma or space }; + value = { ? ASCII 32-126 ? - comma }; equal or comma = "=" | ","; space = " "; """ @@ -64,10 +65,9 @@ cdef inline int is_valid_key_char(int c): # Same as is_valid_key_char except spaces are allowed cdef inline int is_valid_value_char(int c): - # string.printable - ",=" + # string.printable - "," # 44 = ","" - # 61 = "=" - return c == 32 or is_valid_key_char(c) + return c == 32 or is_equal(c) or is_valid_key_char(c) cpdef dict decode_tagset_string(str tagset): diff --git a/tests/tracer/test_tagset.py b/tests/tracer/test_tagset.py index 59141718652..6f6d92f3d56 100644 --- a/tests/tracer/test_tagset.py +++ b/tests/tracer/test_tagset.py @@ -29,6 +29,8 @@ ("key=value,", {"key": "value"}), # Values can have spaces ("key=value can have spaces", {"key": "value can have spaces"}), + # Values can have equals + ("key=value=value", {"key": "value=value"}), # Remove leading/trailing spaces from values ("key= value can have spaces ", {"key": "value can have spaces"}), # Non-space whitespace characters are allowed @@ -41,6 +43,13 @@ "_dd.p.upstream_services=bWNudWx0eS13ZWI|0|1;dHJhY2Utc3RhdHMtcXVlcnk|2|4,_dd.p.hello=world", {"_dd.p.upstream_services": "bWNudWx0eS13ZWI|0|1;dHJhY2Utc3RhdHMtcXVlcnk|2|4", "_dd.p.hello": "world"}, ), + ( + "_dd.p.upstream_services=bWNudWx0eS13ZWI===|0|1;dHJhY2Utc3RhdHMtcXVlcnk===|2|4,_dd.p.hello=world", + { + "_dd.p.upstream_services": "bWNudWx0eS13ZWI===|0|1;dHJhY2Utc3RhdHMtcXVlcnk===|2|4", + "_dd.p.hello": "world", + }, + ), ], ) def test_decode_tagset_string(header, expected): @@ -61,7 +70,6 @@ def test_decode_tagset_string(header, expected): "=value", # Extra leading comma ",key=value", - "key=value=value", "key=value,=value", "key=value,value", # Spaces are not allowed in keys