Describe the bug
aiohttp passes timeout.total to start_tls(), causing an exception if the value of total is zero.
|
# ssl_shutdown_timeout is only available in Python 3.11+ |
|
if sys.version_info >= (3, 11) and self._ssl_shutdown_timeout: |
|
tls_transport = await self._loop.start_tls( |
|
underlying_transport, |
|
tls_proto, |
|
sslcontext, |
|
server_hostname=req.server_hostname or req.url.raw_host, |
|
ssl_handshake_timeout=timeout.total, |
|
ssl_shutdown_timeout=self._ssl_shutdown_timeout, |
|
) |
|
else: |
|
tls_transport = await self._loop.start_tls( |
|
underlying_transport, |
|
tls_proto, |
|
sslcontext, |
|
server_hostname=req.server_hostname or req.url.raw_host, |
|
ssl_handshake_timeout=timeout.total, |
|
) |
Due to the contradictory meaning for zero (no timeout / invalid value), I think this special case should get handled inside aiohttp, for example by passing timeout.total or None, causing asyncio to use the default value of 60 seconds instead of throwing an exception.
To Reproduce
Create client connection to TLS service with ClientTimeout(total=0), like Music Assistant does for Deezer.
Expected behavior
No unhandled exception.
Logs/tracebacks
music-assistant[813603]: File "/usr/local/lib/python3.13/asyncio/sslproto.py", line 284, in __init__
music-assistant[813603]: raise ValueError(
music-assistant[813603]: f"ssl_handshake_timeout should be a positive number, "
music-assistant[813603]: f"got {ssl_handshake_timeout}")
music-assistant[813603]: ValueError: ssl_handshake_timeout should be a positive number, got 0
Python Version
aiohttp Version
multidict Version
$ python -m pip show multidict
propcache Version
$ python -m pip show propcache
yarl Version
$ python -m pip show yarl
OS
Music Assistant Docker image
Related component
Client
Additional context
No response
Code of Conduct
Describe the bug
aiohttp passes timeout.total to
start_tls(), causing an exception if the value oftotalis zero.aiohttp/aiohttp/connector.py
Lines 1320 to 1337 in 8b919d3
Due to the contradictory meaning for zero (no timeout / invalid value), I think this special case should get handled inside aiohttp, for example by passing
timeout.total or None, causing asyncio to use the default value of 60 seconds instead of throwing an exception.To Reproduce
Create client connection to TLS service with
ClientTimeout(total=0), like Music Assistant does for Deezer.Expected behavior
No unhandled exception.
Logs/tracebacks
Python Version
3.13.6aiohttp Version
3.12.15multidict Version
$ python -m pip show multidictpropcache Version
$ python -m pip show propcacheyarl Version
$ python -m pip show yarlOS
Music Assistant Docker image
Related component
Client
Additional context
No response
Code of Conduct