Skip to content

Commit d370b52

Browse files
Merge pull request #14118 from lukebakken/rabbitmq-server-14101
Fix JSON output for `rabbitmqctl environment`
2 parents 03d87b5 + 75cd74a commit d370b52

File tree

1 file changed

+62
-1
lines changed
  • deps/rabbitmq_cli/lib/rabbitmq/cli/formatters

1 file changed

+62
-1
lines changed

deps/rabbitmq_cli/lib/rabbitmq/cli/formatters/json.ex

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ defmodule RabbitMQ.CLI.Formatters.Json do
1818
end
1919

2020
def format_output(output, _opts) do
21-
{:ok, json} = JSON.encode(keys_to_atoms(output))
21+
{:ok, json} = JSON.encode(keys_to_atoms(convert_erlang_strings(output)))
2222
json
2323
end
2424

@@ -72,4 +72,65 @@ defmodule RabbitMQ.CLI.Formatters.Json do
7272
end
7373

7474
def machine_readable?, do: true
75+
76+
# Convert Erlang strings (lists of integers) to binaries for proper JSON encoding
77+
# Also convert other Erlang-specific terms to readable strings
78+
defp convert_erlang_strings(data) when is_function(data) do
79+
"Fun()"
80+
end
81+
82+
defp convert_erlang_strings(data) when is_pid(data) do
83+
"Pid(#{inspect(data)})"
84+
end
85+
86+
defp convert_erlang_strings(data) when is_port(data) do
87+
"Port(#{inspect(data)})"
88+
end
89+
90+
defp convert_erlang_strings(data) when is_reference(data) do
91+
"Ref(#{inspect(data)})"
92+
end
93+
94+
defp convert_erlang_strings(data) when is_list(data) do
95+
# Only attempt Unicode conversion on proper lists of integers
96+
if is_proper_list_of_integers?(data) do
97+
case :unicode.characters_to_binary(data, :utf8) do
98+
binary when is_binary(binary) ->
99+
# Successfully converted - it was a valid Unicode string
100+
binary
101+
_ ->
102+
# Conversion failed - not a Unicode string, process as regular list
103+
Enum.map(data, &convert_erlang_strings/1)
104+
end
105+
else
106+
# Not a proper list of integers, process as regular list
107+
Enum.map(data, &convert_erlang_strings/1)
108+
end
109+
end
110+
111+
defp convert_erlang_strings(data) when is_tuple(data) do
112+
data
113+
|> Tuple.to_list()
114+
|> Enum.map(&convert_erlang_strings/1)
115+
|> List.to_tuple()
116+
end
117+
118+
defp convert_erlang_strings(data) when is_map(data) do
119+
Enum.into(data, %{}, fn {k, v} ->
120+
{convert_erlang_strings(k), convert_erlang_strings(v)}
121+
end)
122+
end
123+
124+
defp convert_erlang_strings(data), do: data
125+
126+
# Check if data is a proper list containing only integers
127+
defp is_proper_list_of_integers?([]), do: false # Empty lists are not strings
128+
defp is_proper_list_of_integers?(data) when is_list(data) do
129+
try do
130+
Enum.all?(data, &is_integer/1)
131+
rescue
132+
_ -> false # Not a proper list or contains non-integers
133+
end
134+
end
135+
defp is_proper_list_of_integers?(_), do: false
75136
end

0 commit comments

Comments
 (0)