diff options
author | Michael Bridgen <mikeb@lshift.net> | 2010-02-23 07:18:16 +0000 |
---|---|---|
committer | Michael Bridgen <mikeb@lshift.net> | 2010-02-23 07:18:16 +0000 |
commit | a9fe65dfaa4cd391f3c7d69f86603547f1ff8ecd (patch) | |
tree | 14cbe8ecfbcea5c6ccc868399a7c1cc2b3b93323 | |
parent | 241c4ae0c7f9df05af403f867a86387f73b62cab (diff) | |
download | rabbitmq-server-a9fe65dfaa4cd391f3c7d69f86603547f1ff8ecd.tar.gz |
Check exchange types for conformance when they are registered, rather than when they are declared. We have to be a bit careful, because the attribute can be 'behaviour' or 'behavior'.
-rw-r--r-- | src/rabbit_exchange.erl | 13 | ||||
-rw-r--r-- | src/rabbit_exchange_type_registry.erl | 13 |
2 files changed, 14 insertions, 12 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index 19a5d132..716ff87a 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -178,18 +178,7 @@ check_type(TypeBin) -> rabbit_misc:protocol_error( command_invalid, "unknown exchange type '~s'", [TypeBin]); T -> - Module = type_to_module(T), - %% sanity check - case catch Module:description() of - {'EXIT', {undef, [{_, description, []} | _]}} -> - rabbit_misc:protocol_error( - command_invalid, "invalid exchange type '~s'", [T]); - {'EXIT', _} -> - rabbit_misc:protocol_error( - command_invalid, "problem loading exchange type '~s'", [T]); - _ -> - T - end + type_to_module(T) end. assert_type(#exchange{ type = ActualType }, RequiredType) diff --git a/src/rabbit_exchange_type_registry.erl b/src/rabbit_exchange_type_registry.erl index 6cb138fc..6517b5e9 100644 --- a/src/rabbit_exchange_type_registry.erl +++ b/src/rabbit_exchange_type_registry.erl @@ -89,10 +89,23 @@ internal_binary_to_type(TypeBin) when is_binary(TypeBin) -> internal_register(TypeName, ModuleName) when is_binary(TypeName), is_atom(ModuleName) -> + ok = sanity_check_module(ModuleName), true = ets:insert(?ETS_NAME, {internal_binary_to_type(TypeName), ModuleName}), ok. +sanity_check_module(Module) -> + case catch lists:member(rabbit_exchange_type, + lists:flatten( + [Bs || {Attr, Bs} <- + Module:module_info(attributes), + Attr =:= behavior orelse + Attr =:= behaviour])) of + {'EXIT', {undef, _}} -> {error, not_module}; + false -> {error, not_exchange_type}; + true -> ok + end. + %%--------------------------------------------------------------------------- init([]) -> |