PROTON-2138: properly parse the remote terminus properties
The coordinator terminus only has a capabilities field. This is
different from the tranditional endpoint attach frame and must be
handled appropriately.
This closes #209
diff --git a/c/src/core/transport.c b/c/src/core/transport.c
index ee00ad2..682a635 100644
--- a/c/src/core/transport.c
+++ b/c/src/core/transport.c
@@ -1396,9 +1396,7 @@
pn_terminus_set_dynamic(rtgt, tgt_dynamic);
} else {
uint64_t code = 0;
- pn_data_clear(link->remote_target.capabilities);
- err = pn_data_scan(args, "D.[.....D..DL[C]...]", &code,
- link->remote_target.capabilities);
+ err = pn_data_scan(args, "D.[.....D..DL....]", &code);
if (err) return err;
if (code == COORDINATOR) {
pn_terminus_set_type(rtgt, PN_COORDINATOR);
@@ -1418,22 +1416,35 @@
pn_data_clear(link->remote_source.filter);
pn_data_clear(link->remote_source.outcomes);
pn_data_clear(link->remote_source.capabilities);
- pn_data_clear(link->remote_target.properties);
- pn_data_clear(link->remote_target.capabilities);
- err = pn_data_scan(args, "D.[.....D.[.....C.C.CC]D.[.....CC]",
+ err = pn_data_scan(args, "D.[.....D.[.....C.C.CC]",
link->remote_source.properties,
link->remote_source.filter,
link->remote_source.outcomes,
- link->remote_source.capabilities,
- link->remote_target.properties,
- link->remote_target.capabilities);
+ link->remote_source.capabilities);
+
if (err) return err;
pn_data_rewind(link->remote_source.properties);
pn_data_rewind(link->remote_source.filter);
pn_data_rewind(link->remote_source.outcomes);
pn_data_rewind(link->remote_source.capabilities);
+
+ pn_data_clear(link->remote_target.properties);
+ pn_data_clear(link->remote_target.capabilities);
+
+ if (pn_terminus_get_type(&link->remote_target) == PN_COORDINATOR) {
+ // coordinator target only has a capabilities field
+ err = pn_data_scan(args, "D.[.....D..D.[C]...]",
+ link->remote_target.capabilities);
+ if (err) return err;
+ } else {
+ err = pn_data_scan(args, "D.[.....D..D.[.....CC]",
+ link->remote_target.properties,
+ link->remote_target.capabilities);
+ if (err) return err;
+ }
+
pn_data_rewind(link->remote_target.properties);
pn_data_rewind(link->remote_target.capabilities);