diff options
| -rw-r--r-- | src/rabbit_channel.erl | 19 | ||||
| -rw-r--r-- | src/rabbit_misc.erl | 9 |
2 files changed, 17 insertions, 11 deletions
diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 3f2f7afae6..f09041637f 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -986,12 +986,19 @@ handle_method(#'queue.declare'{queue = QueueNameBin, return_queue_declare_ok(QueueName, NoWait, MessageCount, ConsumerCount, State); {error, not_found} -> - case rabbit_misc:r_arg(VHostPath, exchange, Args, - <<"x-dead-letter-exchange">>) of - undefined -> ok; - DLX -> check_read_permitted(QueueName, State), - check_write_permitted(DLX, State), - ok + DlxKey = <<"x-dead-letter-exchange">>, + case rabbit_misc:r_arg(VHostPath, exchange, Args, DlxKey) of + undefined -> + ok; + {error, {invalid_type, Type}} -> + rabbit_misc:protocol_error( + precondition_failed, + "invalid type '~s' for arg '~s' in ~s", + [Type, DlxKey, rabbit_misc:rs(QueueName)]); + DLX -> + check_read_permitted(QueueName, State), + check_write_permitted(DLX, State), + ok end, case rabbit_amqqueue:declare(QueueName, Durable, AutoDelete, Args, Owner) of diff --git a/src/rabbit_misc.erl b/src/rabbit_misc.erl index be9d2712db..e4016e839c 100644 --- a/src/rabbit_misc.erl +++ b/src/rabbit_misc.erl @@ -142,9 +142,9 @@ when is_subtype(K, atom())). -spec(r_arg/4 :: (rabbit_types:vhost() | rabbit_types:r(atom()), K, - rabbit_framing:amqp_table(), binary()) - -> undefined | rabbit_types:r(K) - when is_subtype(K, atom())). + rabbit_framing:amqp_table(), binary()) -> undefined | + {error, {invalid_type, rabbit_framing:amqp_field_type()}} | + rabbit_types:r(K) when is_subtype(K, atom())). -spec(rs/1 :: (rabbit_types:r(atom())) -> string()). -spec(enable_cover/0 :: () -> ok_or_error()). -spec(start_cover/1 :: ([{string(), string()} | string()]) -> 'ok'). @@ -371,8 +371,7 @@ r_arg(VHostPath, Kind, Table, Key) -> case table_lookup(Table, Key) of {longstr, NameBin} -> r(VHostPath, Kind, NameBin); undefined -> undefined; - Other -> protocol_error(precondition_failed, - "invalid arg: ~p", [Other]) + {Type, _} -> {error, {invalid_type, Type}} end. rs(#resource{virtual_host = VHostPath, kind = Kind, name = Name}) -> |
