Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unix connect errors use host/port which is not useful #4984

Closed
zealws opened this issue Sep 30, 2020 · 1 comment
Closed

Unix connect errors use host/port which is not useful #4984

zealws opened this issue Sep 30, 2020 · 1 comment

Comments

@zealws
Copy link
Contributor

zealws commented Sep 30, 2020

🐞 Describe the bug
A ConnectionRefusedError using UnixConnector results in an error message such as this:

aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host host:80 ssl:default [Connection refused]

The error message specifies the host/port of the connection. However, for Unix sockets, the host/port are not useful. They're still provided as part of the HTTP request, but they do not define the connection from client to server.

For unix sockets, ideally the error message would include the socket path on disk instead.

💡 To Reproduce

Run this code:
Note: don't create /tmp/server.sock to get a Connection Refused.

import aiohttp
import asyncio


async def main():
    async with aiohttp.ClientSession(
        connector=aiohttp.UnixConnector(path='/tmp/server.sock'),
    ) as session:
        r = await session.get('http://host/')
        print("Status:", r.status)
        print("Text:")
        print((await r.text()).strip())


asyncio.get_event_loop().run_until_complete(main())

💡 Expected behavior

Ideally, the exception would include the socket path on disk, which (for Unix sockets) is the primary way of identifying the connection, not host/port.

📋 Logs/tracebacks

Output of the sample script I pasted above:

Traceback (most recent call last):
  File "/home/zeal/dev/aiohttp/venv/lib/python3.8/site-packages/aiohttp-4.0.0a1-py3.8-linux-x86_64.egg/aiohttp/connector.py", line 1112, in _create_connection
    _, proto = await self._loop.create_unix_connection(
  File "/usr/lib/python3.8/asyncio/unix_events.py", line 244, in create_unix_connection
    await self.sock_connect(sock, path)
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 494, in sock_connect
    return await fut
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 499, in _sock_connect
    sock.connect(address)
ConnectionRefusedError: [Errno 111] Connection refused

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "client.py", line 15, in <module>
    asyncio.get_event_loop().run_until_complete(main())
  File "/usr/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
    return future.result()
  File "client.py", line 9, in main
    r = await session.get('http://host/')
  File "/home/zeal/dev/aiohttp/venv/lib/python3.8/site-packages/aiohttp-4.0.0a1-py3.8-linux-x86_64.egg/aiohttp/client.py", line 446, in _request
    conn = await self._connector.connect(
  File "/home/zeal/dev/aiohttp/venv/lib/python3.8/site-packages/aiohttp-4.0.0a1-py3.8-linux-x86_64.egg/aiohttp/connector.py", line 506, in connect
    proto = await self._create_connection(req, traces, timeout)
  File "/home/zeal/dev/aiohttp/venv/lib/python3.8/site-packages/aiohttp-4.0.0a1-py3.8-linux-x86_64.egg/aiohttp/connector.py", line 1115, in _create_connection
    raise ClientConnectorError(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host host:80 ssl:default [Connection refused]

📋 Your version of the Python

$ python --version
Python 3.8.5

📋 Your version of the aiohttp/yarl/multidict distributions

Installed from source at commit 90acab1, so the versions below are not correct, but attaching them anyway.

$ python -m pip show aiohttp
Name: aiohttp
Version: 4.0.0a1
Summary: Async http client/server framework (asyncio)
Home-page: https://github.com/aio-libs/aiohttp
Author: Nikolay Kim
Author-email: fafhrd91@gmail.com
License: Apache 2
Location: /home/zeal/dev/aiohttp
Requires: attrs, chardet, multidict, async-timeout, yarl, typing-extensions
Required-by: 
$ python -m pip show multidict
Name: multidict
Version: 4.7.6
Summary: multidict implementation
Home-page: https://github.com/aio-libs/multidict
Author: Andrew Svetlov
Author-email: andrew.svetlov@gmail.com
License: Apache 2
Location: /home/zeal/dev/aiohttp/venv/lib/python3.8/site-packages/multidict-4.7.6-py3.8-linux-x86_64.egg
Requires: 
Required-by: yarl, aiohttp

$ python -m pip show yarl
Name: yarl
Version: 1.4.2
Summary: Yet another URL library
Home-page: https://github.com/aio-libs/yarl/
Author: Andrew Svetlov
Author-email: andrew.svetlov@gmail.com
License: Apache 2
Location: /home/zeal/dev/aiohttp/venv/lib/python3.8/site-packages
Requires: idna, multidict
Required-by: aiohttp

📋 Additional context

None

@WisdomPill
Copy link
Member

Closing this, since the linked pull request was merged

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants