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