|
14 | 14 | # limitations under the License. |
15 | 15 |
|
16 | 16 |
|
| 17 | +from __future__ import annotations |
| 18 | + |
17 | 19 | import asyncio |
18 | 20 | import contextlib |
19 | 21 | import logging |
@@ -88,14 +90,17 @@ async def _dns_resolver(address, family=0): |
88 | 90 | type=socket.SOCK_STREAM, |
89 | 91 | ) |
90 | 92 | except OSError as e: |
91 | | - if e.errno in _RETRYABLE_DNS_ERRNOS or ( |
92 | | - e.errno in _EAI_NONAME |
93 | | - and (address.host is not None or address.port is not None) |
| 93 | + # note: on some systems like Windows, EAI_NONAME and EAI_NODATA |
| 94 | + # have the same error-code. |
| 95 | + if e.errno in _EAI_NONAME and ( |
| 96 | + address.host is None and address.port is None |
94 | 97 | ): |
95 | | - raise ServiceUnavailable( |
96 | | - f"Failed to DNS resolve address {address}: {e}" |
97 | | - ) from e |
98 | | - raise ValueError( |
| 98 | + err_cls = ValueError |
| 99 | + elif e.errno in _RETRYABLE_DNS_ERRNOS or e.errno in _EAI_NONAME: |
| 100 | + err_cls = ServiceUnavailable |
| 101 | + else: |
| 102 | + err_cls = ValueError |
| 103 | + raise err_cls( |
99 | 104 | f"Failed to DNS resolve address {address}: {e}" |
100 | 105 | ) from e |
101 | 106 | return list(_resolved_addresses_from_info(info, address._host_name)) |
@@ -179,14 +184,17 @@ def _dns_resolver(address, family=0): |
179 | 184 | type=socket.SOCK_STREAM, |
180 | 185 | ) |
181 | 186 | except OSError as e: |
182 | | - if e.errno in _RETRYABLE_DNS_ERRNOS or ( |
183 | | - e.errno in _EAI_NONAME |
184 | | - and (address.host is not None or address.port is not None) |
| 187 | + # note: on some systems like Windows, EAI_NONAME and EAI_NODATA |
| 188 | + # have the same error-code. |
| 189 | + if e.errno in _EAI_NONAME and ( |
| 190 | + address.host is None and address.port is None |
185 | 191 | ): |
186 | | - raise ServiceUnavailable( |
187 | | - f"Failed to DNS resolve address {address}: {e}" |
188 | | - ) from e |
189 | | - raise ValueError( |
| 192 | + err_cls = ValueError |
| 193 | + elif e.errno in _RETRYABLE_DNS_ERRNOS or e.errno in _EAI_NONAME: |
| 194 | + err_cls = ServiceUnavailable |
| 195 | + else: |
| 196 | + err_cls = ValueError |
| 197 | + raise err_cls( |
190 | 198 | f"Failed to DNS resolve address {address}: {e}" |
191 | 199 | ) from e |
192 | 200 | return _resolved_addresses_from_info(info, address._host_name) |
|
0 commit comments