Skip to content

Commit 471503a

Browse files
committed
issue #5: accept exchange arguments as Strings
Some legacy client library might send exchange arguments as string. Relaxed the constraints on the argument types still ensuring the provided values are integer numbers. Signed-off-by: Matteo Cafasso <[email protected]>
1 parent 57acae8 commit 471503a

File tree

1 file changed

+28
-8
lines changed

1 file changed

+28
-8
lines changed

lib/rabbit_message_deduplication_exchange.ex

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,22 +67,36 @@ defmodule RabbitMQ.MessageDeduplicationPlugin.Exchange do
6767
def validate(exchange(arguments: args)) do
6868
case List.keyfind(args, "x-cache-size", 0) do
6969
{"x-cache-size", :long, val} when val > 0 -> :ok
70+
{"x-cache-size", :longstr, val} ->
71+
case Integer.parse(val, 10) do
72+
:error -> RabbitMisc.protocol_error(
73+
:precondition_failed,
74+
"Missing or invalid argument, \
75+
'x-cache-size' must be an integer greater than 0", [])
76+
_ -> :ok
77+
end
7078
_ ->
7179
RabbitMisc.protocol_error(
7280
:precondition_failed,
7381
"Missing or invalid argument, \
74-
'x-cache-size' must be an integer greater than 0",
75-
[])
82+
'x-cache-size' must be an integer greater than 0", [])
7683
end
7784

7885
case List.keyfind(args, "x-cache-ttl", 0) do
7986
nil -> :ok
8087
{"x-cache-ttl", :long, val} when val > 0 -> :ok
88+
{"x-cache-ttl", :longstr, val} ->
89+
case Integer.parse(val, 10) do
90+
:error -> RabbitMisc.protocol_error(
91+
:precondition_failed,
92+
"Invalid argument, \
93+
'x-cache-ttl' must be an integer greater than 0", [])
94+
_ -> :ok
95+
end
8196
_ -> RabbitMisc.protocol_error(
8297
:precondition_failed,
8398
"Invalid argument, \
84-
'x-cache-ttl' must be an integer greater than 0",
85-
[])
99+
'x-cache-ttl' must be an integer greater than 0", [])
86100
end
87101

88102
case List.keyfind(args, "x-cache-persistence", 0) do
@@ -92,8 +106,7 @@ defmodule RabbitMQ.MessageDeduplicationPlugin.Exchange do
92106
_ -> RabbitMisc.protocol_error(
93107
:precondition_failed,
94108
"Invalid argument, \
95-
'x-cache-persistence' must be either 'disk' or 'memory'",
96-
[])
109+
'x-cache-persistence' must be either 'disk' or 'memory'", [])
97110
end
98111
end
99112

@@ -103,8 +116,15 @@ defmodule RabbitMQ.MessageDeduplicationPlugin.Exchange do
103116

104117
def create(:transaction, exchange(name: name, arguments: args)) do
105118
cache = cache_name(name)
106-
ttl = rabbitmq_keyfind(args, "x-cache-ttl")
107-
size = rabbitmq_keyfind(args, "x-cache-size")
119+
ttl = case rabbitmq_keyfind(args, "x-cache-ttl") do
120+
nil -> nil
121+
integer when is_integer(integer) -> integer
122+
number when is_bitstring(number) -> String.to_integer(number)
123+
end
124+
size = case rabbitmq_keyfind(args, "x-cache-size") do
125+
integer when is_integer(integer) -> integer
126+
number when is_bitstring(number) -> String.to_integer(number)
127+
end
108128
persistence =
109129
args
110130
|> rabbitmq_keyfind("x-cache-persistence", "memory")

0 commit comments

Comments
 (0)