Restart xmpp channel if read returned zero bytes Zero means closed connection by remote size. BUG=b:23970360 Change-Id: I87432ba3eeca0a78c48ac3ebe6106a9ea845ec6a
diff --git a/libweave/src/notification/xmpp_channel.cc b/libweave/src/notification/xmpp_channel.cc index ad4e233..04c398d 100644 --- a/libweave/src/notification/xmpp_channel.cc +++ b/libweave/src/notification/xmpp_channel.cc
@@ -108,8 +108,12 @@ void XmppChannel::OnMessageRead(size_t size) { std::string msg(read_socket_data_.data(), size); - VLOG(2) << "Received XMPP packet: " << msg; + VLOG(2) << "Received XMPP packet: '" << msg << "'"; read_pending_ = false; + + if (!size) + return Restart(); + stream_parser_.ParseData(msg); WaitForMessage(); }
diff --git a/libweave/src/notification/xmpp_channel_unittest.cc b/libweave/src/notification/xmpp_channel_unittest.cc index d7c8174..aaa0f28 100644 --- a/libweave/src/notification/xmpp_channel_unittest.cc +++ b/libweave/src/notification/xmpp_channel_unittest.cc
@@ -98,6 +98,14 @@ const base::Callback<void(size_t)>& success_callback, const base::Callback<void(const Error*)>& error_callback, ErrorPtr* error) override { + if (read_data_.empty()) { + task_runner_->PostDelayedTask( + FROM_HERE, base::Bind(base::IgnoreResult(&FakeStream::ReadAsync), + base::Unretained(this), buffer, size_to_read, + success_callback, error_callback, nullptr), + base::TimeDelta::FromSeconds(0)); + return true; + } size_t size = std::min(size_to_read, read_data_.size()); memcpy(buffer, read_data_.data(), size); read_data_ = read_data_.substr(size);