From 38304d7b542e3c592d2234391062b4e74c42f4b5 Mon Sep 17 00:00:00 2001
From: Anders Svensson
Date: Fri, 5 Apr 2013 18:53:52 +0200
Subject: Fix handling of unknown options to diameter:start_service/2
{error, Reason} is now returned, instead of the options being ignored.
Note that diameter:add_transport/2 purposely ignores unknown options and
that the behaviour is documented. This is historic: some users depend on
it in order to store their own options for identifying transport config,
instead of using the reference returned by add_transport.
---
lib/diameter/src/base/diameter_config.erl | 40 +++++++++++++++++------------
lib/diameter/test/diameter_config_SUITE.erl | 15 +++++++++--
2 files changed, 36 insertions(+), 19 deletions(-)
diff --git a/lib/diameter/src/base/diameter_config.erl b/lib/diameter/src/base/diameter_config.erl
index 1282930145..2a145c874b 100644
--- a/lib/diameter/src/base/diameter_config.erl
+++ b/lib/diameter/src/base/diameter_config.erl
@@ -614,30 +614,38 @@ stop_transport(SvcName, Refs) ->
%% make_config/2
make_config(SvcName, Opts) ->
- Apps = init_apps(Opts),
+ AppOpts = [T || {application, _} = T <- Opts],
+ Apps = init_apps(AppOpts),
+
[] == Apps andalso ?THROW(no_apps),
%% Use the fact that diameter_caps has the same field names as CER.
Fields = ?BASE:'#info-'(diameter_base_CER) -- ['AVP'],
- COpts = [T || {K,_} = T <- Opts, lists:member(K, Fields)],
- Caps = make_caps(#diameter_caps{}, COpts),
+ CapOpts = [T || {K,_} = T <- Opts, lists:member(K, Fields)],
+ Caps = make_caps(#diameter_caps{}, CapOpts),
- ok = encode_CER(COpts),
+ ok = encode_CER(CapOpts),
- Os = split(Opts, fun opt/2, [{false, share_peers},
- {false, use_shared_peers},
- {false, monitor},
- {?NOMASK, sequence},
- {nodes, restrict_connections}]),
+ SvcOpts = make_opts((Opts -- AppOpts) -- CapOpts,
+ [{false, share_peers},
+ {false, use_shared_peers},
+ {false, monitor},
+ {?NOMASK, sequence},
+ {nodes, restrict_connections}]),
#service{name = SvcName,
rec = #diameter_service{applications = Apps,
capabilities = Caps},
- options = Os}.
+ options = SvcOpts}.
+
+make_opts(Opts, Defs) ->
+ Known = [{K, get_opt(K, Opts, D)} || {D,K} <- Defs],
+ Unknown = Opts -- Known,
+
+ [] == Unknown orelse ?THROW({invalid, hd(Unknown)}),
-split(Opts, F, Defs) ->
- [{K, F(K, get_opt(K, Opts, D))} || {D,K} <- Defs].
+ [{K, opt(K,V)} || {K,V} <- Known].
opt(K, false = B)
when K /= sequence ->
@@ -728,8 +736,8 @@ encode_CER(Opts) ->
init_apps(Opts) ->
lists:foldl(fun app_acc/2, [], lists:reverse(Opts)).
-app_acc({application, Opts}, Acc) ->
- is_list(Opts) orelse ?THROW({application, Opts}),
+app_acc({application, Opts} = T, Acc) ->
+ is_list(Opts) orelse ?THROW(T),
[Dict, Mod] = get_opt([dictionary, module], Opts),
Alias = get_opt(alias, Opts, Dict),
@@ -745,9 +753,7 @@ app_acc({application, Opts}, Acc) ->
mutable = M,
options = [{answer_errors, A},
{request_errors, P}]}
- | Acc];
-app_acc(_, Acc) ->
- Acc.
+ | Acc].
init_mod(#diameter_callback{} = R) ->
init_mod([diameter_callback, R]);
diff --git a/lib/diameter/test/diameter_config_SUITE.erl b/lib/diameter/test/diameter_config_SUITE.erl
index 47def9c8c9..46ff63756d 100644
--- a/lib/diameter/test/diameter_config_SUITE.erl
+++ b/lib/diameter/test/diameter_config_SUITE.erl
@@ -82,7 +82,11 @@
[[true],
[false],
[[node(), node()]]],
- [[x]]}]).
+ [[x]]},
+ {invalid_option, %% invalid service options are rejected
+ [],
+ [[x],
+ [x,x]]}]).
-define(TRANSPORT_CONFIG,
[{transport_module,
@@ -167,7 +171,14 @@
[[{okay, 1}]],
[[{suspect, 2}]]],
[[x],
- [[{open, 0}]]]}]).
+ [[{open, 0}]]]},
+ {private,
+ [[x]],
+ []},
+ {invalid_option, %% invalid transport options are silently ignored
+ [[x],
+ [x,x]],
+ []}]).
%% ===========================================================================
--
cgit v1.2.3
From 57ee9c5ac814aa3a56a2a1dbafddf78b979123c6 Mon Sep 17 00:00:00 2001
From: Anders Svensson
Date: Sat, 6 Apr 2013 02:47:07 +0200
Subject: Fix faulty capitalization in generated release notes
Diameter = the protocol
diameter = the Erlang application
---
lib/diameter/doc/src/notes.xml | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/lib/diameter/doc/src/notes.xml b/lib/diameter/doc/src/notes.xml
index 2daf84b0d4..ad61f12b5b 100644
--- a/lib/diameter/doc/src/notes.xml
+++ b/lib/diameter/doc/src/notes.xml
@@ -42,7 +42,7 @@ first.
-Diameter 1.4.1.1
+diameter 1.4.1.1
Fixed Bugs and Malfunctions
@@ -79,7 +79,7 @@ first.
-Diameter 1.4.1
+diameter 1.4.1
Fixed Bugs and Malfunctions
@@ -166,7 +166,7 @@ first.
-Diameter 1.4
+diameter 1.4
Fixed Bugs and Malfunctions
@@ -245,7 +245,7 @@ first.
-Diameter 1.3.1
+diameter 1.3.1
Known Bugs and Problems
@@ -261,7 +261,7 @@ first.
-Diameter 1.3
+diameter 1.3
Fixed Bugs and Malfunctions
@@ -418,7 +418,7 @@ first.
-Diameter 1.2
+diameter 1.2
Fixed Bugs and Malfunctions
@@ -518,7 +518,7 @@ first.
-Diameter 1.1
+diameter 1.1
Fixed Bugs and Malfunctions
@@ -545,7 +545,7 @@ first.
-Diameter 1.0
+diameter 1.0
Fixed Bugs and Malfunctions
@@ -659,7 +659,7 @@ first.
-Diameter 0.10
+diameter 0.10
Fixed Bugs and Malfunctions
--
cgit v1.2.3