Skip to content

_wait_for_msg() on CPython with TLS connection raises ssl.SSLWantReadError on timeout #154

Open
@vladak

Description

@vladak

When connected via TLS, i.e. the socket is wrapped using the ssl_context and if there is nothing to be read in the loop, it results in:

Traceback (most recent call last):
  File "c.py", line 132, in <module>
    mqtt_client.loop()
  File "/Users/vladimirkotal/Pi/Adafruit_CircuitPython_MiniMQTT/adafruit_minimqtt/adafruit_minimqtt.py", line 955, in loop
    rc = self._wait_for_msg(timeout)
  File "/Users/vladimirkotal/Pi/Adafruit_CircuitPython_MiniMQTT/adafruit_minimqtt/adafruit_minimqtt.py", line 976, in _wait_for_msg
    res = self._sock_exact_recv(1)
  File "/Users/vladimirkotal/Pi/Adafruit_CircuitPython_MiniMQTT/adafruit_minimqtt/adafruit_minimqtt.py", line 1077, in _sock_exact_recv
    recv_len = self._sock.recv_into(rc, bufsize)
  File "/usr/local/Cellar/python@3.9/3.9.13_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py", line 1242, in recv_into
    return self.read(nbytes, buffer)
  File "/usr/local/Cellar/python@3.9/3.9.13_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py", line 1100, in read
    return self._sslobj.read(len, buffer)
ssl.SSLWantReadError: The operation did not complete (read) (_ssl.c:2633)

In such case, _wait_for_msg() should return None, however the ssl exception fires through:

# CPython socket module contains a timeout attribute
if hasattr(self._socket_pool, "timeout"):
try:
res = self._sock_exact_recv(1)
except self._socket_pool.timeout:
return None

Note that the line numbers do not match because I am using minimqtt code for one of my PRs, however that should not matter.

Trouble is that the ssl.SSLWantReadError does not seem to be reachable from the ssl context passed to MQTT() init function. The exception class is based on OSError, however catching that would be too generic, I think.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions