9aa214077e
This commit adds human readable error messages when mbedtls or axtls raise an exception. Currently often just an EIO error is raised so the user is lost and can't tell whether it's a cert error, buffer overrun, connecting to a non-ssl port, etc. The axtls and mbedtls error raising in the ussl module is modified to raise: OSError(-err_num, "error string") For axtls a small error table of strings is added and used for the second argument of the OSErrer. For mbedtls the code uses mbedtls' built-in strerror function, and if there is an out of memory condition it just produces OSError(-err_num). Producing the error string for mbedtls is conditional on them being included in the mbedtls build, via MBEDTLS_ERROR_C.
45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
# test that modtls produces a numerical error message when out of heap
|
|
|
|
try:
|
|
import usocket as socket, ussl as ssl, sys
|
|
except:
|
|
import socket, ssl, sys
|
|
try:
|
|
from micropython import alloc_emergency_exception_buf, heap_lock, heap_unlock
|
|
except:
|
|
print("SKIP")
|
|
raise SystemExit
|
|
|
|
|
|
# test with heap locked to see it switch to number-only error message
|
|
def test(addr):
|
|
alloc_emergency_exception_buf(256)
|
|
s = socket.socket()
|
|
s.connect(addr)
|
|
try:
|
|
s.setblocking(False)
|
|
s = ssl.wrap_socket(s, do_handshake=False)
|
|
heap_lock()
|
|
print("heap is locked")
|
|
while True:
|
|
ret = s.write("foo")
|
|
if ret:
|
|
break
|
|
heap_unlock()
|
|
print("wrap: no exception")
|
|
except OSError as e:
|
|
heap_unlock()
|
|
# mbedtls produces "-29184"
|
|
# axtls produces "RECORD_OVERFLOW"
|
|
ok = "-29184" in str(e) or "RECORD_OVERFLOW" in str(e)
|
|
print("wrap:", ok)
|
|
if not ok:
|
|
print("got exception:", e)
|
|
s.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# connect to plain HTTP port, oops!
|
|
addr = socket.getaddrinfo("micropython.org", 80)[0][-1]
|
|
test(addr)
|