summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Bridgen <mikeb@lshift.net>2010-02-23 07:18:16 +0000
committerMichael Bridgen <mikeb@lshift.net>2010-02-23 07:18:16 +0000
commita9fe65dfaa4cd391f3c7d69f86603547f1ff8ecd (patch)
tree14cbe8ecfbcea5c6ccc868399a7c1cc2b3b93323
parent241c4ae0c7f9df05af403f867a86387f73b62cab (diff)
downloadrabbitmq-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.erl13
-rw-r--r--src/rabbit_exchange_type_registry.erl13
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([]) ->