You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuweni.apache.org by to...@apache.org on 2021/07/22 21:53:31 UTC
[incubator-tuweni] branch main updated: Handle disconnects without
fail. Fixes #292
This is an automated email from the ASF dual-hosted git repository.
toulmean pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-tuweni.git
The following commit(s) were added to refs/heads/main by this push:
new c8b2486 Handle disconnects without fail. Fixes #292
new 73e01df Merge pull request #311 from atoulme/handle_bad_disconnects
c8b2486 is described below
commit c8b24863a018b73d124250f8f9d0348ed1f3404f
Author: Antoine Toulme <an...@lunar-ocean.com>
AuthorDate: Fri Jul 16 17:51:43 2021 +0200
Handle disconnects without fail. Fixes #292
---
.../apache/tuweni/rlpx/wire/DisconnectMessage.java | 24 ++++++++++++++++++----
.../apache/tuweni/rlpx/wire/DisconnectReason.java | 6 +++++-
.../tuweni/rlpx/wire/DisconnectMessageTest.java | 21 +++++++++++++++++++
3 files changed, 46 insertions(+), 5 deletions(-)
diff --git a/rlpx/src/main/java/org/apache/tuweni/rlpx/wire/DisconnectMessage.java b/rlpx/src/main/java/org/apache/tuweni/rlpx/wire/DisconnectMessage.java
index c3b0664..ec5b65c 100644
--- a/rlpx/src/main/java/org/apache/tuweni/rlpx/wire/DisconnectMessage.java
+++ b/rlpx/src/main/java/org/apache/tuweni/rlpx/wire/DisconnectMessage.java
@@ -14,9 +14,29 @@ package org.apache.tuweni.rlpx.wire;
import org.apache.tuweni.bytes.Bytes;
import org.apache.tuweni.rlp.RLP;
+import org.apache.tuweni.rlp.RLPException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
final class DisconnectMessage implements WireProtocolMessage {
+ private final static Logger logger = LoggerFactory.getLogger(DisconnectMessage.class);
+
+ static DisconnectMessage read(Bytes data) {
+ try {
+ return RLP.decode(data, (reader) -> {
+ if (reader.nextIsList()) {
+ return reader.readList((source) -> new DisconnectMessage(source.readInt()));
+ }
+ return new DisconnectMessage(DisconnectReason.NOT_PROVIDED);
+ });
+ } catch (RLPException e) {
+ logger.warn("Error reading disconnect message " + data.toHexString(), e);
+ return new DisconnectMessage(DisconnectReason.NOT_PROVIDED);
+ }
+ }
+
private final int reason;
DisconnectMessage(DisconnectReason reason) {
@@ -27,10 +47,6 @@ final class DisconnectMessage implements WireProtocolMessage {
this.reason = reason;
}
- static DisconnectMessage read(Bytes data) {
- return RLP.decodeList(data, source -> new DisconnectMessage(source.readInt()));
- }
-
@Override
public Bytes toBytes() {
return RLP.encodeList(writer -> writer.writeInt(reason));
diff --git a/rlpx/src/main/java/org/apache/tuweni/rlpx/wire/DisconnectReason.java b/rlpx/src/main/java/org/apache/tuweni/rlpx/wire/DisconnectReason.java
index ea6c167..531cf6f 100644
--- a/rlpx/src/main/java/org/apache/tuweni/rlpx/wire/DisconnectReason.java
+++ b/rlpx/src/main/java/org/apache/tuweni/rlpx/wire/DisconnectReason.java
@@ -68,7 +68,11 @@ public enum DisconnectReason {
/**
* A subprotocol has reason to request a disconnection
*/
- SUBPROTOCOL_REASON(16, "Subprotocol reason");
+ SUBPROTOCOL_REASON(16, "Subprotocol reason"),
+ /**
+ * No reason was provided for the disconnection
+ */
+ NOT_PROVIDED(99, "No reason provided");
/**
* Get a disconnect reason for a number code
diff --git a/rlpx/src/test/java/org/apache/tuweni/rlpx/wire/DisconnectMessageTest.java b/rlpx/src/test/java/org/apache/tuweni/rlpx/wire/DisconnectMessageTest.java
index 762bb8f..317e1fa 100644
--- a/rlpx/src/test/java/org/apache/tuweni/rlpx/wire/DisconnectMessageTest.java
+++ b/rlpx/src/test/java/org/apache/tuweni/rlpx/wire/DisconnectMessageTest.java
@@ -28,4 +28,25 @@ class DisconnectMessageTest {
assertEquals(msg.messageType(), read.messageType());
assertEquals(msg.reason(), read.reason());
}
+
+ @Test
+ void testEmptyDisconnect() {
+ DisconnectMessage read = DisconnectMessage.read(Bytes.EMPTY);
+ assertEquals(1, read.messageType());
+ assertEquals(DisconnectReason.NOT_PROVIDED.code, read.reason());
+ }
+
+ @Test
+ void testWeirdValue() {
+ DisconnectMessage read = DisconnectMessage.read(Bytes.fromHexString("0x01adbeef"));
+ assertEquals(1, read.messageType());
+ assertEquals(DisconnectReason.NOT_PROVIDED.code, read.reason());
+ }
+
+ @Test
+ void testEmptyList() {
+ DisconnectMessage read = DisconnectMessage.read(Bytes.fromHexString("0xc0"));
+ assertEquals(1, read.messageType());
+ assertEquals(DisconnectReason.NOT_PROVIDED.code, read.reason());
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@tuweni.apache.org
For additional commands, e-mail: commits-help@tuweni.apache.org