diff --git a/electrumx/lib/util.py b/electrumx/lib/util.py index c41dc4c..e678626 100644 --- a/electrumx/lib/util.py +++ b/electrumx/lib/util.py @@ -305,6 +305,15 @@ def version_string(ptuple): def protocol_version(client_req, server_min, server_max): + '''Given a client's protocol version string, return a pair of + protocol tuples: + + (negotiated version, client min request) + + If the request is unsupported, the negotiated protocol tuple is + None. + + ''' '''Given a client protocol request, return the protocol version to use as a tuple. @@ -326,7 +335,7 @@ def protocol_version(client_req, server_min, server_max): if result < max(client_min, server_min) or result == (0, ): result = None - return result + return result, client_min unpack_int32_from = Struct(' util.protocol_tuple(self.PROTOCOL_MIN): + version = version_string(client_min) + self.logger.info(f'client requested future protocol version ' + f'{version} - is your software out of date?') + return ptuple async def start_servers(self): '''Start the RPC server and schedule the external servers to be diff --git a/electrumx/server/session.py b/electrumx/server/session.py index 4743eca..74fa3fb 100644 --- a/electrumx/server/session.py +++ b/electrumx/server/session.py @@ -440,8 +440,6 @@ class ElectrumX(SessionBase): ptuple = self.controller.protocol_tuple(protocol_version) if ptuple is None: - self.logger.info('unsupported protocol version request {}' - .format(protocol_version)) self.close_after_send = True raise RPCError(BAD_REQUEST, f'unsupported protocol version: {protocol_version}') diff --git a/tests/lib/test_util.py b/tests/lib/test_util.py index 8414287..891b648 100644 --- a/tests/lib/test_util.py +++ b/tests/lib/test_util.py @@ -183,21 +183,27 @@ def test_version_string(): assert util.version_string((1, 3, 2)) == "1.3.2" def test_protocol_version(): - assert util.protocol_version(None, "1.0", "1.0") == (1, 0) - assert util.protocol_version("0.10", "0.10", "1.1") == (0, 10) - - assert util.protocol_version("1.0", "1.0", "1.0") == (1, 0) - assert util.protocol_version("1.0", "1.0", "1.1") == (1, 0) - assert util.protocol_version("1.1", "1.0", "1.1") == (1, 1) - assert util.protocol_version("1.2", "1.0", "1.1") is None - assert util.protocol_version("0.9", "1.0", "1.1") is None - - assert util.protocol_version(["0.9", "1.0"], "1.0", "1.1") == (1, 0) - assert util.protocol_version(["0.9", "1.1"], "1.0", "1.1") == (1, 1) - assert util.protocol_version(["1.1", "0.9"], "1.0", "1.1") is None - assert util.protocol_version(["0.8", "0.9"], "1.0", "1.1") is None - assert util.protocol_version(["1.1", "1.2"], "1.0", "1.1") == (1, 1) - assert util.protocol_version(["1.2", "1.3"], "1.0", "1.1") is None + assert util.protocol_version(None, "1.0", "1.0") == ((1, 0), (1, 0)) + assert util.protocol_version("0.10", "0.10", "1.1") == ((0, 10), (0, 10)) + + assert util.protocol_version("1.0", "1.0", "1.0") == ((1, 0), (1, 0)) + assert util.protocol_version("1.0", "1.0", "1.1") == ((1, 0), (1, 0)) + assert util.protocol_version("1.1", "1.0", "1.1") == ((1, 1), (1, 1)) + assert util.protocol_version("1.2", "1.0", "1.1") == (None, (1, 2)) + assert util.protocol_version("0.9", "1.0", "1.1") == (None, (0, 9)) + + assert util.protocol_version(["0.9", "1.0"], "1.0", "1.1") \ + == ((1, 0), (0, 9)) + assert util.protocol_version(["0.9", "1.1"], "1.0", "1.1") \ + == ((1, 1), (0,9)) + assert util.protocol_version(["1.1", "0.9"], "1.0", "1.1") \ + == (None, (1, 1)) + assert util.protocol_version(["0.8", "0.9"], "1.0", "1.1") \ + == (None, (0, 8)) + assert util.protocol_version(["1.1", "1.2"], "1.0", "1.1") \ + == ((1, 1), (1, 1)) + assert util.protocol_version(["1.2", "1.3"], "1.0", "1.1") \ + == (None, (1, 2)) def test_unpackers():