]> git.ipfire.org Git - thirdparty/httpx.git/commitdiff
Add Client(http_versions=...) support
authorTom Christie <tom@tomchristie.com>
Tue, 20 Aug 2019 12:30:54 +0000 (13:30 +0100)
committerTom Christie <tom@tomchristie.com>
Tue, 20 Aug 2019 12:30:54 +0000 (13:30 +0100)
18 files changed:
httpx/__init__.py
httpx/api.py
httpx/client.py
httpx/concurrency/asyncio.py
httpx/config.py
httpx/dispatch/asgi.py
httpx/dispatch/connection.py
httpx/dispatch/connection_pool.py
httpx/dispatch/threaded.py
httpx/dispatch/wsgi.py
httpx/interfaces.py
tests/client/test_auth.py
tests/client/test_cookies.py
tests/client/test_headers.py
tests/client/test_redirects.py
tests/dispatch/test_threaded.py
tests/dispatch/utils.py
tests/test_multipart.py

index 7be5bc25eb0606b212dcaeb07d5630ab59475f39..bc8917b3454e5eb7e176cbf824162d4ae74bc2bc 100644 (file)
@@ -5,9 +5,9 @@ from .concurrency.asyncio import AsyncioBackend
 from .config import (
     USER_AGENT,
     CertTypes,
-    PoolLimits,
     HTTPVersionConfig,
     HTTPVersionTypes,
+    PoolLimits,
     SSLConfig,
     TimeoutConfig,
     TimeoutTypes,
@@ -117,6 +117,8 @@ __all__ = [
     "StatusCode",
     "codes",
     "TimeoutTypes",
+    "HTTPVersionTypes",
+    "HTTPVersionConfig",
     "AsyncRequest",
     "AsyncRequestData",
     "AsyncResponse",
index 84892880cb27098f9f76ecfe9a0ab50998e63de2..fe52e14ed7f5678396397f1347c6913a9023e138 100644 (file)
@@ -24,7 +24,6 @@ def request(
     json: typing.Any = None,
     headers: HeaderTypes = None,
     cookies: CookieTypes = None,
-    # files
     auth: AuthTypes = None,
     timeout: TimeoutTypes = None,
     allow_redirects: bool = True,
index ae75f15da8b061512fec00985b6cc89c91351524..9db68f75de520486924d2899c0b1deb327ce9d3e 100644 (file)
@@ -11,6 +11,7 @@ from .config import (
     DEFAULT_POOL_LIMITS,
     DEFAULT_TIMEOUT_CONFIG,
     CertTypes,
+    HTTPVersionTypes,
     PoolLimits,
     TimeoutTypes,
     VerifyTypes,
@@ -57,6 +58,7 @@ class BaseClient:
         cookies: CookieTypes = None,
         verify: VerifyTypes = True,
         cert: CertTypes = None,
+        http_versions: HTTPVersionTypes = None,
         timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
         pool_limits: PoolLimits = DEFAULT_POOL_LIMITS,
         max_redirects: int = DEFAULT_MAX_REDIRECTS,
@@ -84,6 +86,7 @@ class BaseClient:
                 verify=verify,
                 cert=cert,
                 timeout=timeout,
+                http_versions=http_versions,
                 pool_limits=pool_limits,
                 backend=backend,
             )
index 613d48f9e28778ecf887fa628d9346ba6c73df55..6c5dc0c481284d8e80a57a3822620c19fca68129 100644 (file)
@@ -14,7 +14,7 @@ import ssl
 import typing
 from types import TracebackType
 
-from ..config import PoolLimits, HTTPVersionConfig, TimeoutConfig
+from ..config import PoolLimits, TimeoutConfig
 from ..exceptions import ConnectTimeout, PoolTimeout, ReadTimeout, WriteTimeout
 from ..interfaces import (
     BaseBackgroundManager,
index 2b5ee9e32d92e598de79b403396b67045f2e0922..08b99c0db90719ed4f8309ef963d61fd87fc956d 100644 (file)
@@ -246,11 +246,11 @@ class HTTPVersionConfig:
             http_versions = ["HTTP/1.1", "HTTP/2"]
 
         if isinstance(http_versions, str):
-            self.http_versions = set([http_versions.upper()])
+            self.http_versions = {http_versions.upper()}
         elif isinstance(http_versions, HTTPVersionConfig):
             self.http_versions = http_versions.http_versions
         else:
-            self.http_versions = set([version.upper() for version in http_versions])
+            self.http_versions = {version.upper() for version in http_versions}
 
         for version in self.http_versions:
             if version not in ("HTTP/1.1", "HTTP/2"):
index e3a38ad88257caaed3d4329103a93108a67e9324..e3b4b0a0dfb4f9973f35891ba881699fc3f2a93f 100644 (file)
@@ -1,7 +1,7 @@
 import asyncio
 import typing
 
-from ..config import CertTypes, HTTPVersionTypes, TimeoutTypes, VerifyTypes
+from ..config import CertTypes, TimeoutTypes, VerifyTypes
 from ..interfaces import AsyncDispatcher
 from ..models import AsyncRequest, AsyncResponse
 
@@ -59,7 +59,6 @@ class ASGIDispatch(AsyncDispatcher):
         verify: VerifyTypes = None,
         cert: CertTypes = None,
         timeout: TimeoutTypes = None,
-        http_versions: HTTPVersionTypes = None,
     ) -> AsyncResponse:
 
         scope = {
index a0d124fc94fd7cf945bf48e065d42f0ebbcf86f0..b40ae340b8f31289d34c983ceead5b5c4696ef1d 100644 (file)
@@ -1,13 +1,13 @@
 import functools
-import typing
 import ssl
+import typing
 
 from ..concurrency.asyncio import AsyncioBackend
 from ..config import (
     DEFAULT_TIMEOUT_CONFIG,
     CertTypes,
-    HTTPVersionTypes,
     HTTPVersionConfig,
+    HTTPVersionTypes,
     SSLConfig,
     TimeoutConfig,
     TimeoutTypes,
@@ -48,12 +48,9 @@ class HTTPConnection(AsyncDispatcher):
         verify: VerifyTypes = None,
         cert: CertTypes = None,
         timeout: TimeoutTypes = None,
-        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)
 
         if self.h2_connection is not None:
             response = await self.h2_connection.send(request, timeout=timeout)
@@ -68,19 +65,13 @@ class HTTPConnection(AsyncDispatcher):
         verify: VerifyTypes = None,
         cert: CertTypes = None,
         timeout: TimeoutTypes = None,
-        http_versions: HTTPVersionTypes = None,
     ) -> 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)
-        )
 
         host = self.origin.host
         port = self.origin.port
-        ssl_context = await self.get_ssl_context(ssl, http_versions)
+        ssl_context = await self.get_ssl_context(ssl)
 
         if self.release_func is None:
             on_release = None
@@ -99,14 +90,14 @@ class HTTPConnection(AsyncDispatcher):
                 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) -> typing.Optional[ssl.SSLContext]:
         if not self.origin.is_ssl:
             return None
 
         # Run the SSL loading in a threadpool, since it may makes disk accesses.
-        return await self.backend.run_in_threadpool(ssl.load_ssl_context, http_versions)
+        return await self.backend.run_in_threadpool(
+            ssl.load_ssl_context, self.http_versions
+        )
 
     async def close(self) -> None:
         if self.h2_connection is not None:
index 48a3433fe27bf687d56cf30f34631bd798af11e2..b88d142c4c7a0bf7e30d93933b20cbec892235da 100644 (file)
@@ -107,16 +107,11 @@ class ConnectionPool(AsyncDispatcher):
         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,
-                http_versions=http_versions,
+                request, verify=verify, cert=cert, timeout=timeout
             )
         except BaseException as exc:
             self.active_connections.remove(connection)
index 902e0652bdf8d57024793f8519f61aeb9c60f166..e4fdfd5ed152dcf1e2a98f6d4b75caff2f23733e 100644 (file)
@@ -1,4 +1,4 @@
-from ..config import CertTypes, HTTPVersionTypes, TimeoutTypes, VerifyTypes
+from ..config import CertTypes, TimeoutTypes, VerifyTypes
 from ..interfaces import AsyncDispatcher, ConcurrencyBackend, Dispatcher
 from ..models import (
     AsyncRequest,
@@ -29,7 +29,6 @@ class ThreadedDispatcher(AsyncDispatcher):
         verify: VerifyTypes = None,
         cert: CertTypes = None,
         timeout: TimeoutTypes = None,
-        http_versions: HTTPVersionTypes = None,
     ) -> AsyncResponse:
         concurrency_backend = self.backend
 
@@ -49,7 +48,6 @@ class ThreadedDispatcher(AsyncDispatcher):
             "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)
index d8f56d22c9cdaebd8bf29277f1640b29ae53f2ae..60e0a18c7942030a3dcaf19b690767c139450123 100644 (file)
@@ -1,7 +1,7 @@
 import io
 import typing
 
-from ..config import CertTypes, HTTPVersionTypes, TimeoutTypes, VerifyTypes
+from ..config import CertTypes, TimeoutTypes, VerifyTypes
 from ..interfaces import Dispatcher
 from ..models import Request, Response
 
@@ -60,7 +60,6 @@ class WSGIDispatch(Dispatcher):
         verify: VerifyTypes = None,
         cert: CertTypes = None,
         timeout: TimeoutTypes = None,
-        http_versions: HTTPVersionTypes = None,
     ) -> Response:
         environ = {
             "wsgi.version": (1, 0),
index db6edaf4cbf16e07ef577de64b927eca26170ac8..2b4edf4d3cbda1452ea42932e0a87efc44f3100e 100644 (file)
@@ -3,15 +3,7 @@ import ssl
 import typing
 from types import TracebackType
 
-from .config import (
-    CertTypes,
-    PoolLimits,
-    HTTPVersionConfig,
-    HTTPVersionTypes,
-    TimeoutConfig,
-    TimeoutTypes,
-    VerifyTypes,
-)
+from .config import CertTypes, PoolLimits, TimeoutConfig, TimeoutTypes, VerifyTypes
 from .models import (
     AsyncRequest,
     AsyncRequestData,
@@ -50,16 +42,9 @@ class AsyncDispatcher:
         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,
-            http_versions=http_versions,
-        )
+        return await self.send(request, verify=verify, cert=cert, timeout=timeout)
 
     async def send(
         self,
@@ -67,7 +52,6 @@ class AsyncDispatcher:
         verify: VerifyTypes = None,
         cert: CertTypes = None,
         timeout: TimeoutTypes = None,
-        http_versions: HTTPVersionTypes = None,
     ) -> AsyncResponse:
         raise NotImplementedError()  # pragma: nocover
 
@@ -106,16 +90,9 @@ class Dispatcher:
         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,
-            http_versions=http_versions,
-        )
+        return self.send(request, verify=verify, cert=cert, timeout=timeout)
 
     def send(
         self,
@@ -123,7 +100,6 @@ class Dispatcher:
         verify: VerifyTypes = None,
         cert: CertTypes = None,
         timeout: TimeoutTypes = None,
-        http_versions: HTTPVersionTypes = None,
     ) -> Response:
         raise NotImplementedError()  # pragma: nocover
 
index ff5b8e36060de33d3c366b56b00e6c0325c5dbfc..725ea56c00491aec0819ea66d17be5acabbb28ac 100644 (file)
@@ -8,7 +8,6 @@ from httpx import (
     AsyncResponse,
     CertTypes,
     Client,
-    HTTPVersionTypes,
     TimeoutTypes,
     VerifyTypes,
 )
@@ -21,7 +20,6 @@ class MockDispatch(AsyncDispatcher):
         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)
index 9585d21a727e7e02ff33bf76752bbed0226a0d00..280f44bc2b1176f3b6171f7e08ec38ebbb4de16b 100644 (file)
@@ -8,7 +8,6 @@ from httpx import (
     CertTypes,
     Client,
     Cookies,
-    HTTPVersionTypes,
     TimeoutTypes,
     VerifyTypes,
 )
@@ -21,7 +20,6 @@ class MockDispatch(AsyncDispatcher):
         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()
index 5410e397c8e194ce820c5310e2c2c064a88d0c89..2d17c1259e5aa270da010319037c75d84c64d576 100755 (executable)
@@ -8,7 +8,6 @@ from httpx import (
     AsyncResponse,
     CertTypes,
     Client,
-    HTTPVersionTypes,
     TimeoutTypes,
     VerifyTypes,
     __version__,
@@ -22,7 +21,6 @@ class MockDispatch(AsyncDispatcher):
         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())
index 3792ee85af76e71ecc152e811db859666b52b48a..3062733a73b2d7146f0a6eb7813100cea8652e24 100644 (file)
@@ -12,7 +12,6 @@ from httpx import (
     CertTypes,
     RedirectBodyUnavailable,
     RedirectLoop,
-    HTTPVersionTypes,
     TimeoutTypes,
     TooManyRedirects,
     VerifyTypes,
@@ -27,7 +26,6 @@ class MockDispatch(AsyncDispatcher):
         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
index 488e13d9a70e5e4a0e57da948146c3b9e2c38ddb..ac90bdd2d6ba861b6f0833a014e6267fd8443774 100644 (file)
@@ -4,7 +4,6 @@ from httpx import (
     CertTypes,
     Client,
     Dispatcher,
-    HTTPVersionTypes,
     Request,
     Response,
     TimeoutTypes,
@@ -24,7 +23,6 @@ class MockDispatch(Dispatcher):
         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)
index de44f71166e1c9b5c1f4cc4eb8404d893831fb01..c92fa7a310b32bdd3039364be03fdc07251f55d7 100644 (file)
@@ -13,7 +13,6 @@ from httpx import (
     Protocol,
     Request,
     TimeoutConfig,
-    HTTPVersionConfig,
 )
 
 
index ba346c8adb9e31547c0276e3ec1c0a00ad474760..052cb90d42298c216876cb8d2b1badc104821063 100644 (file)
@@ -10,9 +10,9 @@ from httpx import (
     CertTypes,
     Client,
     Dispatcher,
+    HTTPVersionTypes,
     Request,
     Response,
-    HTTPVersionTypes,
     TimeoutTypes,
     VerifyTypes,
     multipart,