Commit a0f1066c authored by Dominik Charousset's avatar Dominik Charousset

Merge pull request #440 from ufownl/topic/fix_basp_issue

Fix BASP handshake issue
parents 8cd93e91 bbd1e3a7
...@@ -342,14 +342,14 @@ connection_state instance::handle(execution_unit* ctx, ...@@ -342,14 +342,14 @@ connection_state instance::handle(execution_unit* ctx,
} else { } else {
binary_deserializer bd{ctx, dm.buf.data(), dm.buf.size()}; binary_deserializer bd{ctx, dm.buf.data(), dm.buf.size()};
bd >> hdr; bd >> hdr;
CAF_LOG_DEBUG(CAF_ARG(hdr));
if (! valid(hdr)) {
CAF_LOG_WARNING("received invalid header:" << CAF_ARG(hdr.operation));
return err();
}
if (hdr.payload_len > 0) if (hdr.payload_len > 0)
return await_payload; return await_payload;
} }
CAF_LOG_DEBUG(CAF_ARG(hdr));
if (! valid(hdr)) {
CAF_LOG_WARNING("received invalid header:" << CAF_ARG(hdr.operation));
return err();
}
// needs forwarding? // needs forwarding?
if (! is_handshake(hdr) if (! is_handshake(hdr)
&& ! is_heartbeat(hdr) && ! is_heartbeat(hdr)
......
...@@ -457,6 +457,14 @@ behavior basp_broker::make_behavior() { ...@@ -457,6 +457,14 @@ behavior basp_broker::make_behavior() {
auto next = state.instance.handle(context(), msg, ctx.hdr, auto next = state.instance.handle(context(), msg, ctx.hdr,
ctx.cstate == basp::await_payload); ctx.cstate == basp::await_payload);
if (next == basp::close_connection) { if (next == basp::close_connection) {
if (ctx.callback) {
CAF_LOG_WARNING("failed to handshake with remote node"
<< CAF_ARG(msg.handle));
ctx.callback->deliver(make_message(ok_atom::value,
node_id{invalid_node_id},
actor_addr{invalid_actor_addr},
std::set<std::string>{}));
}
close(msg.handle); close(msg.handle);
state.ctx.erase(msg.handle); state.ctx.erase(msg.handle);
} else if (next != ctx.cstate) { } else if (next != ctx.cstate) {
......
...@@ -118,7 +118,8 @@ public: ...@@ -118,7 +118,8 @@ public:
if (i == pending_.end()) if (i == pending_.end())
return; return;
monitor(addr); monitor(addr);
cached_.emplace(key, std::make_tuple(nid, addr, sigs)); if (nid && addr)
cached_.emplace(key, std::make_tuple(nid, addr, sigs));
auto res = make_message(ok_atom::value, std::move(nid), auto res = make_message(ok_atom::value, std::move(nid),
std::move(addr), std::move(sigs)); std::move(addr), std::move(sigs));
for (auto& x : i->second) for (auto& x : i->second)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment