diff --git a/src/analyzer/protocol/redis/redis.spicy b/src/analyzer/protocol/redis/redis.spicy index a2f23d4c6d..945ae8c83d 100644 --- a/src/analyzer/protocol/redis/redis.spicy +++ b/src/analyzer/protocol/redis/redis.spicy @@ -383,21 +383,40 @@ function bulk_string_content(bulk: RESP::BulkString): bytes { return b""; } +# Returns the bytes string value of this, or Null if it cannot. +function stringify(data: RESP::Data): optional { + if (data?.simple_error) + return data.simple_error.content; + else if (data?.bulk_error) + return bulk_string_content(data.bulk_error); + else if (data?.simple_string) + return data.simple_string.content; + else if (data?.bulk_string) + return bulk_string_content(data.bulk_string); + else if (data?.verbatim_string) + return bulk_string_content(data.verbatim_string); + else if (data?.boolean) + return data.boolean.val ? b"T" : b"F"; + else if (data?.array) { + local res = b"["; + local first = True; + for (ele in data.array.elements) { + if (!first) + res += b", "; + local ele_stringified = stringify(ele); + if (!ele_stringified) + return Null; + res += *ele_stringified; + first = False; + } + res += b"]"; + return res; + } + + return Null; +} + # Gets the server reply in a simpler form public function make_server_reply(data: RESP::ServerData): ReplyData { - local res: ReplyData = [$value = Null]; - if (data.data?.simple_error) - res.value = data.data.simple_error.content; - else if (data.data?.bulk_error) - res.value = bulk_string_content(data.data.bulk_error); - else if (data.data?.simple_string) - res.value = data.data.simple_string.content; - else if (data.data?.bulk_string) - res.value = bulk_string_content(data.data.bulk_string); - else if (data.data?.verbatim_string) - res.value = bulk_string_content(data.data.verbatim_string); - else if (data.data?.boolean) - res.value = data.data.boolean.val ? b"T" : b"F"; - - return res; + return [$value = stringify(data.data)]; } diff --git a/testing/btest/Baseline/scripts.base.protocols.redis.pubsub/redis.log b/testing/btest/Baseline/scripts.base.protocols.redis.pubsub/redis.log index 2f23f980ef..c9d2b81974 100644 --- a/testing/btest/Baseline/scripts.base.protocols.redis.pubsub/redis.log +++ b/testing/btest/Baseline/scripts.base.protocols.redis.pubsub/redis.log @@ -9,5 +9,5 @@ #types time string addr port addr port string string string bool string XXXXXXXXXX.XXXXXX CHhAvVGS1DHFjwGM9 127.0.0.1 56162 127.0.0.1 6379 SUBSCRIBE - - T - XXXXXXXXXX.XXXXXX ClEkJM2Vm5giqnMf4h 127.0.0.1 56163 127.0.0.1 6379 PUBLISH - - T - -XXXXXXXXXX.XXXXXX CHhAvVGS1DHFjwGM9 127.0.0.1 56162 127.0.0.1 6379 - - - T - +XXXXXXXXXX.XXXXXX CHhAvVGS1DHFjwGM9 127.0.0.1 56162 127.0.0.1 6379 - - - T [message, my_channel, hello :)] #close XXXX-XX-XX-XX-XX-XX diff --git a/testing/btest/Baseline/scripts.base.protocols.redis.stream/redis.log b/testing/btest/Baseline/scripts.base.protocols.redis.stream/redis.log index d7ae07655a..47195e73af 100644 --- a/testing/btest/Baseline/scripts.base.protocols.redis.stream/redis.log +++ b/testing/btest/Baseline/scripts.base.protocols.redis.stream/redis.log @@ -10,5 +10,5 @@ XXXXXXXXXX.XXXXXX CHhAvVGS1DHFjwGM9 127.0.0.1 49992 127.0.0.1 6379 XADD - - T 1729622832637-0 XXXXXXXXXX.XXXXXX CHhAvVGS1DHFjwGM9 127.0.0.1 49992 127.0.0.1 6379 XADD - - T 1729622836953-0 XXXXXXXXXX.XXXXXX CHhAvVGS1DHFjwGM9 127.0.0.1 49992 127.0.0.1 6379 XADD - - T 1729622840530-0 -XXXXXXXXXX.XXXXXX CHhAvVGS1DHFjwGM9 127.0.0.1 49992 127.0.0.1 6379 XRANGE - - T - +XXXXXXXXXX.XXXXXX CHhAvVGS1DHFjwGM9 127.0.0.1 49992 127.0.0.1 6379 XRANGE - - T [[1729622770972-0, [rider, Castilla, speed, 30.2, position, 1, location_id, 1]], [1729622778221-0, [rider, Norem, speed, 28.8, position, 3, location_id, 1]]] #close XXXX-XX-XX-XX-XX-XX