From 2e44467648f612012b1f195e4e99d94bcab22174 Mon Sep 17 00:00:00 2001 From: "tianqian.zyf" Date: Fri, 30 Aug 2019 01:16:57 -0700 Subject: [PATCH] Fix heartbeat packet parsing error Signed-off-by: tianqian.zyf --- .../extensions/filters/network/dubbo_proxy/decoder.cc | 8 ++++++-- .../filters/network/dubbo_proxy/conn_manager_test.cc | 11 +++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/source/extensions/filters/network/dubbo_proxy/decoder.cc b/source/extensions/filters/network/dubbo_proxy/decoder.cc index f7e9cfc84a24..3715acf865d5 100644 --- a/source/extensions/filters/network/dubbo_proxy/decoder.cc +++ b/source/extensions/filters/network/dubbo_proxy/decoder.cc @@ -18,12 +18,16 @@ DecoderStateMachine::onDecodeStreamHeader(Buffer::Instance& buffer) { return {ProtocolState::WaitForData}; } - // The heartbeat message has no body. auto context = ret.first; if (metadata->message_type() == MessageType::HeartbeatRequest || metadata->message_type() == MessageType::HeartbeatResponse) { + if (buffer.length() < (context->header_size() + context->body_size())) { + ENVOY_LOG(debug, "dubbo decoder: need more data for {} protocol heartbeat", protocol_.name()); + return {ProtocolState::WaitForData}; + } + ENVOY_LOG(debug, "dubbo decoder: this is the {} heartbeat message", protocol_.name()); - buffer.drain(context->header_size()); + buffer.drain(context->header_size() + context->body_size()); delegate_.onHeartbeat(metadata); return {ProtocolState::Done}; } diff --git a/test/extensions/filters/network/dubbo_proxy/conn_manager_test.cc b/test/extensions/filters/network/dubbo_proxy/conn_manager_test.cc index f93f40b47f5d..008fb1b9fc5a 100644 --- a/test/extensions/filters/network/dubbo_proxy/conn_manager_test.cc +++ b/test/extensions/filters/network/dubbo_proxy/conn_manager_test.cc @@ -306,7 +306,8 @@ class ConnectionManagerTest : public testing::Test { buffer.add(static_cast(&msg_type), 1); buffer.add(std::string{0x14}); addInt64(buffer, request_id); // Request Id - buffer.add(std::string{0x00, 0x00, 0x00, 0x00}); // Body Length + buffer.add(std::string{0x00, 0x00, 0x00, 0x01}); // Body Length + buffer.add(std::string{0x01}); // Body } NiceMock factory_context_; @@ -377,6 +378,7 @@ TEST_F(ConnectionManagerTest, OnDataHandlesHeartbeatEvent) { })); EXPECT_EQ(conn_manager_->onData(buffer_, false), Network::FilterStatus::StopIteration); + EXPECT_EQ(0U, buffer_.length()); filter_callbacks_.connection_.dispatcher_.clearDeferredDeleteList(); EXPECT_EQ(0U, store_.counter("test.request").value()); @@ -1156,8 +1158,7 @@ TEST_F(ConnectionManagerTest, PendingMessageEnd) { EXPECT_EQ(1U, store_.gauge("test.request_active", Stats::Gauge::ImportMode::Accumulate).value()); } -// TODO(alyssawilk) update. -TEST_F(ConnectionManagerTest, DEPRECATED_FEATURE_TEST(Routing)) { +TEST_F(ConnectionManagerTest, Routing) { const std::string yaml = R"EOF( stat_prefix: test protocol_type: Dubbo @@ -1169,7 +1170,9 @@ serialization_type: Hessian2 - match: method: name: - regex: "(.*?)" + safe_regex: + google_re2: {} + regex: "(.*?)" route: cluster: user_service_dubbo_server )EOF";