CertTypes = typing.Union[str, typing.Tuple[str, str], typing.Tuple[str, str, str]]
VerifyTypes = typing.Union[str, bool, ssl.SSLContext]
TimeoutTypes = typing.Union[float, typing.Tuple[float, float, float], "TimeoutConfig"]
-HTTPVersionTypes = typing.Union[str, typing.List[str], typing.Tuple[str], "HTTPVersionConfig"]
+HTTPVersionTypes = typing.Union[
+ str, typing.List[str], typing.Tuple[str], "HTTPVersionConfig"
+]
USER_AGENT = f"python-httpx/{__version__}"
return self
return SSLConfig(cert=cert, verify=verify)
- def load_ssl_context(self, http_versions: 'HTTPVersionConfig'=None) -> ssl.SSLContext:
+ def load_ssl_context(
+ self, http_versions: "HTTPVersionConfig" = None
+ ) -> ssl.SSLContext:
http_versions = HTTPVersionConfig() if http_versions is None else http_versions
if self.ssl_context is None:
assert self.ssl_context is not None
return self.ssl_context
- def load_ssl_context_no_verify(self, http_versions: 'HTTPVersionConfig') -> ssl.SSLContext:
+ def load_ssl_context_no_verify(
+ self, http_versions: "HTTPVersionConfig"
+ ) -> ssl.SSLContext:
"""
Return an SSL context for unverified connections.
"""
context.check_hostname = False
return context
- def load_ssl_context_verify(self, http_versions: 'HTTPVersionConfig') -> ssl.SSLContext:
+ def load_ssl_context_verify(
+ self, http_versions: "HTTPVersionConfig"
+ ) -> ssl.SSLContext:
"""
Return an SSL context for verified connections.
"""
return context
- def _create_default_ssl_context(self, http_versions: 'HTTPVersionConfig') -> ssl.SSLContext:
+ def _create_default_ssl_context(
+ self, http_versions: "HTTPVersionConfig"
+ ) -> ssl.SSLContext:
"""
Creates the default SSLContext object that's used for both verified
and unverified connections.
def __init__(self, http_versions: HTTPVersionTypes = None):
if http_versions is None:
- http_versions = ['HTTP/1.1', 'HTTP/2']
+ http_versions = ["HTTP/1.1", "HTTP/2"]
if isinstance(http_versions, str):
self.http_versions = set([http_versions.upper()])
elif isinstance(http_versions, HTTPVersionConfig):
self.http_versions = http_versions.http_versions
else:
- self.http_versions = set(sorted([version.upper() for version in http_versions]))
+ self.http_versions = set(
+ sorted([version.upper() for version in http_versions])
+ )
for version in self.http_versions:
- if version not in ('HTTP/1.1', 'HTTP/2'):
+ if version not in ("HTTP/1.1", "HTTP/2"):
raise ValueError(f"Unsupported HTTP version {version!r}.")
if not self.http_versions:
import asyncio
import typing
-from ..config import CertTypes, TimeoutTypes, VerifyTypes
+from ..config import CertTypes, HTTPVersionTypes, TimeoutTypes, VerifyTypes
from ..interfaces import AsyncDispatcher
from ..models import AsyncRequest, AsyncResponse
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> AsyncResponse:
scope = {
verify: VerifyTypes = True,
cert: CertTypes = None,
timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
+ http_versions: HTTPVersionTypes = None,
backend: ConcurrencyBackend = None,
release_func: typing.Optional[ReleaseCallback] = None,
- http_versions: HTTPVersionTypes = None,
):
self.origin = Origin(origin) if isinstance(origin, str) else origin
self.ssl = SSLConfig(cert=cert, verify=verify)
http_versions: HTTPVersionTypes = None,
) -> AsyncResponse:
if self.h11_connection is None and self.h2_connection is None:
- await self.connect(verify=verify, cert=cert, timeout=timeout, http_versions=http_versions)
+ await self.connect(
+ verify=verify, cert=cert, timeout=timeout, http_versions=http_versions
+ )
if self.h2_connection is not None:
response = await self.h2_connection.send(request, timeout=timeout)
) -> None:
ssl = self.ssl.with_overrides(verify=verify, cert=cert)
timeout = self.timeout if timeout is None else TimeoutConfig(timeout)
- http_versions = self.http_versions if http_versions is None else HTTPVersionConfig(http_versions)
+ http_versions = (
+ self.http_versions
+ if http_versions is None
+ else HTTPVersionConfig(http_versions)
+ )
host = self.origin.host
port = self.origin.port
reader, writer, self.backend, on_release=on_release
)
- async def get_ssl_context(self, ssl: SSLConfig, http_versions: HTTPVersionConfig) -> typing.Optional[ssl.SSLContext]:
+ async def get_ssl_context(
+ self, ssl: SSLConfig, http_versions: HTTPVersionConfig
+ ) -> typing.Optional[ssl.SSLContext]:
if not self.origin.is_ssl:
return None
DEFAULT_POOL_LIMITS,
DEFAULT_TIMEOUT_CONFIG,
CertTypes,
+ HTTPVersionTypes,
PoolLimits,
TimeoutTypes,
VerifyTypes,
cert: CertTypes = None,
timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
pool_limits: PoolLimits = DEFAULT_POOL_LIMITS,
+ http_versions: HTTPVersionTypes = None,
backend: ConcurrencyBackend = None,
):
self.verify = verify
self.cert = cert
self.timeout = timeout
self.pool_limits = pool_limits
+ self.http_versions = http_versions
self.is_closed = False
self.keepalive_connections = ConnectionStore()
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> AsyncResponse:
connection = await self.acquire_connection(origin=request.url.origin)
try:
response = await connection.send(
- request, verify=verify, cert=cert, timeout=timeout
+ request,
+ verify=verify,
+ cert=cert,
+ timeout=timeout,
+ http_versions=http_versions,
)
except BaseException as exc:
self.active_connections.remove(connection)
verify=self.verify,
cert=self.cert,
timeout=self.timeout,
+ http_versions=self.http_versions,
backend=self.backend,
release_func=self.release_connection,
)
-from ..config import CertTypes, TimeoutTypes, VerifyTypes
+from ..config import CertTypes, HTTPVersionTypes, TimeoutTypes, VerifyTypes
from ..interfaces import AsyncDispatcher, ConcurrencyBackend, Dispatcher
from ..models import (
AsyncRequest,
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> AsyncResponse:
concurrency_backend = self.backend
"verify": verify,
"cert": cert,
"timeout": timeout,
+ "http_versions": http_versions,
}
sync_response = await self.backend.run_in_threadpool(func, **kwargs)
assert isinstance(sync_response, Response)
import io
import typing
-from ..config import CertTypes, TimeoutTypes, VerifyTypes
+from ..config import CertTypes, HTTPVersionTypes, TimeoutTypes, VerifyTypes
from ..interfaces import Dispatcher
from ..models import Request, Response
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> Response:
environ = {
"wsgi.version": (1, 0),
import typing
from types import TracebackType
-from .config import CertTypes, PoolLimits, HTTPVersionConfig, TimeoutConfig, TimeoutTypes, VerifyTypes
+from .config import (
+ CertTypes,
+ PoolLimits,
+ HTTPVersionConfig,
+ HTTPVersionTypes,
+ TimeoutConfig,
+ TimeoutTypes,
+ VerifyTypes,
+)
from .models import (
AsyncRequest,
AsyncRequestData,
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> AsyncResponse:
request = AsyncRequest(method, url, data=data, params=params, headers=headers)
- return await self.send(request, verify=verify, cert=cert, timeout=timeout)
+ return await self.send(
+ request,
+ verify=verify,
+ cert=cert,
+ timeout=timeout,
+ http_versions=http_versions,
+ )
async def send(
self,
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> AsyncResponse:
raise NotImplementedError() # pragma: nocover
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> Response:
request = Request(method, url, data=data, params=params, headers=headers)
- return self.send(request, verify=verify, cert=cert, timeout=timeout)
+ return self.send(
+ request,
+ verify=verify,
+ cert=cert,
+ timeout=timeout,
+ http_versions=http_versions,
+ )
def send(
self,
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> Response:
raise NotImplementedError() # pragma: nocover
hostname: str,
port: int,
ssl_context: typing.Optional[ssl.SSLContext],
- timeout: TimeoutConfig
+ timeout: TimeoutConfig,
) -> typing.Tuple[BaseReader, BaseWriter, Protocol]:
raise NotImplementedError() # pragma: no cover
AsyncResponse,
CertTypes,
Client,
+ HTTPVersionTypes,
TimeoutTypes,
VerifyTypes,
)
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> AsyncResponse:
body = json.dumps({"auth": request.headers.get("Authorization")}).encode()
return AsyncResponse(200, content=body, request=request)
CertTypes,
Client,
Cookies,
+ HTTPVersionTypes,
TimeoutTypes,
VerifyTypes,
)
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> AsyncResponse:
if request.url.path.startswith("/echo_cookies"):
body = json.dumps({"cookies": request.headers.get("Cookie")}).encode()
AsyncResponse,
CertTypes,
Client,
+ HTTPVersionTypes,
TimeoutTypes,
VerifyTypes,
__version__,
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> AsyncResponse:
if request.url.path.startswith("/echo_headers"):
request_headers = dict(request.headers.items())
CertTypes,
RedirectBodyUnavailable,
RedirectLoop,
+ HTTPVersionTypes,
TimeoutTypes,
TooManyRedirects,
VerifyTypes,
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> AsyncResponse:
if request.url.path == "/redirect_301":
status_code = codes.MOVED_PERMANENTLY
CertTypes,
Client,
Dispatcher,
+ HTTPVersionTypes,
Request,
Response,
TimeoutTypes,
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> Response:
if request.url.path == "/streaming_response":
return Response(200, content=streaming_body(), request=request)
Protocol,
Request,
TimeoutConfig,
- HTTPVersionConfig
+ HTTPVersionConfig,
)
hostname: str,
port: int,
ssl_context: typing.Optional[ssl.SSLContext],
- timeout: TimeoutConfig
+ timeout: TimeoutConfig,
) -> typing.Tuple[BaseReader, BaseWriter, Protocol]:
self.server = MockHTTP2Server(self.app)
return self.server, self.server, Protocol.HTTP_2
Dispatcher,
Request,
Response,
+ HTTPVersionTypes,
TimeoutTypes,
VerifyTypes,
multipart,
verify: VerifyTypes = None,
cert: CertTypes = None,
timeout: TimeoutTypes = None,
+ http_versions: HTTPVersionTypes = None,
) -> Response:
return Response(200, content=request.read())