from ._urls import URL
from ._utils import get_ca_bundle_from_env
+
+SOCKET_OPTION = typing.Union[
+ typing.Tuple[int, int, int],
+ typing.Tuple[int, int, typing.Union[bytes, bytearray]],
+ typing.Tuple[int, int, None, int],
+]
+
DEFAULT_CIPHERS = ":".join(
[
"ECDHE+AESGCM",
return f"Proxy({url_str}{auth_str}{headers_str})"
+class NetworkOptions:
+ def __init__(
+ self,
+ connection_retries: int = 0,
+ local_address: typing.Optional[str] = None,
+ socket_options: typing.Optional[typing.Iterable[SOCKET_OPTION]] = None,
+ uds: typing.Optional[str] = None,
+ ) -> None:
+ self.connection_retries = connection_retries
+ self.local_address = local_address
+ self.socket_options = socket_options
+ self.uds = uds
+
+ def __repr__(self) -> str:
+ defaults = {
+ "connection_retries": 0,
+ "local_address": None,
+ "socket_options": None,
+ "uds": None,
+ }
+ params = ", ".join(
+ [
+ f"{attr}={getattr(self, attr)!r}"
+ for attr, default in defaults.items()
+ if getattr(self, attr) != default
+ ]
+ )
+ return f"NetworkOptions({params})"
+
+
DEFAULT_TIMEOUT_CONFIG = Timeout(timeout=5.0)
DEFAULT_LIMITS = Limits(max_connections=100, max_keepalive_connections=20)
+DEFAULT_NETWORK_OPTIONS = NetworkOptions(connection_retries=0)
DEFAULT_MAX_REDIRECTS = 20
import httpcore
-from .._config import DEFAULT_LIMITS, Limits, Proxy, create_ssl_context
+from .._config import (
+ DEFAULT_LIMITS,
+ DEFAULT_NETWORK_OPTIONS,
+ Proxy,
+ Limits,
+ NetworkOptions,
+ create_ssl_context,
+)
from .._exceptions import (
ConnectError,
ConnectTimeout,
T = typing.TypeVar("T", bound="HTTPTransport")
A = typing.TypeVar("A", bound="AsyncHTTPTransport")
-SOCKET_OPTION = typing.Union[
- typing.Tuple[int, int, int],
- typing.Tuple[int, int, typing.Union[bytes, bytearray]],
- typing.Tuple[int, int, None, int],
-]
-
@contextlib.contextmanager
def map_httpcore_exceptions() -> typing.Iterator[None]:
limits: Limits = DEFAULT_LIMITS,
trust_env: bool = True,
proxy: typing.Optional[ProxyTypes] = None,
- uds: typing.Optional[str] = None,
- local_address: typing.Optional[str] = None,
- retries: int = 0,
- socket_options: typing.Optional[typing.Iterable[SOCKET_OPTION]] = None,
+ network_options: NetworkOptions = DEFAULT_NETWORK_OPTIONS,
) -> None:
ssl_context = create_ssl_context(verify=verify, cert=cert, trust_env=trust_env)
proxy = Proxy(url=proxy) if isinstance(proxy, (str, URL)) else proxy
keepalive_expiry=limits.keepalive_expiry,
http1=http1,
http2=http2,
- uds=uds,
- local_address=local_address,
- retries=retries,
- socket_options=socket_options,
+ uds=network_options.uds,
+ local_address=network_options.local_address,
+ retries=network_options.connection_retries,
+ socket_options=network_options.socket_options,
)
elif proxy.url.scheme in ("http", "https"):
self._pool = httpcore.HTTPProxy(
keepalive_expiry=limits.keepalive_expiry,
http1=http1,
http2=http2,
- socket_options=socket_options,
+ uds=network_options.uds,
+ local_address=network_options.local_address,
+ retries=network_options.connection_retries,
+ socket_options=network_options.socket_options,
)
elif proxy.url.scheme == "socks5":
try:
limits: Limits = DEFAULT_LIMITS,
trust_env: bool = True,
proxy: typing.Optional[ProxyTypes] = None,
- uds: typing.Optional[str] = None,
- local_address: typing.Optional[str] = None,
- retries: int = 0,
- socket_options: typing.Optional[typing.Iterable[SOCKET_OPTION]] = None,
+ network_options: NetworkOptions = DEFAULT_NETWORK_OPTIONS,
) -> None:
ssl_context = create_ssl_context(verify=verify, cert=cert, trust_env=trust_env)
proxy = Proxy(url=proxy) if isinstance(proxy, (str, URL)) else proxy
keepalive_expiry=limits.keepalive_expiry,
http1=http1,
http2=http2,
- uds=uds,
- local_address=local_address,
- retries=retries,
- socket_options=socket_options,
+ uds=network_options.uds,
+ local_address=network_options.local_address,
+ retries=network_options.connection_retries,
+ socket_options=network_options.socket_options,
)
elif proxy.url.scheme in ("http", "https"):
self._pool = httpcore.AsyncHTTPProxy(
keepalive_expiry=limits.keepalive_expiry,
http1=http1,
http2=http2,
- socket_options=socket_options,
+ uds=network_options.uds,
+ local_address=network_options.local_address,
+ retries=network_options.connection_retries,
+ socket_options=network_options.socket_options,
)
elif proxy.url.scheme == "socks5":
try: