bump httpx dependency version to 0.11.1 (#1794)

This commit is contained in:
Subham Roy 2020-03-02 01:12:11 +05:30 committed by GitHub
parent 7833d70d9e
commit ce71514d71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 47 additions and 32 deletions

View File

@ -13,7 +13,7 @@ dependencies:
- sphinx==1.8.3 - sphinx==1.8.3
- sphinx_rtd_theme==0.4.2 - sphinx_rtd_theme==0.4.2
- recommonmark==0.5.0 - recommonmark==0.5.0
- httpx==0.9.3 - httpx==0.11.1
- sphinxcontrib-asyncio>=0.2.0 - sphinxcontrib-asyncio>=0.2.0
- docutils==0.14 - docutils==0.14
- pygments==2.3.1 - pygments==2.3.1

View File

@ -23,7 +23,7 @@ class SanicTestClient:
self.host = host self.host = host
def get_new_session(self): def get_new_session(self):
return httpx.Client() return httpx.AsyncClient(verify=False)
async def _local_request(self, method, url, *args, **kwargs): async def _local_request(self, method, url, *args, **kwargs):
logger.info(url) logger.info(url)
@ -38,20 +38,22 @@ class SanicTestClient:
try: try:
response = await getattr(session, method.lower())( response = await getattr(session, method.lower())(
url, verify=False, *args, **kwargs url, *args, **kwargs
) )
except NameError: except NameError:
raise Exception(response.status_code) raise Exception(response.status_code)
response.body = await response.aread()
response.status = response.status_code
response.content_type = response.headers.get("content-type")
# response can be decoded as json after response._content
# is set by response.aread()
try: try:
response.json = response.json() response.json = response.json()
except (JSONDecodeError, UnicodeDecodeError): except (JSONDecodeError, UnicodeDecodeError):
response.json = None response.json = None
response.body = await response.read()
response.status = response.status_code
response.content_type = response.headers.get("content-type")
if raw_cookies: if raw_cookies:
response.raw_cookies = {} response.raw_cookies = {}
@ -185,11 +187,11 @@ async def app_call_with_return(self, scope, receive, send):
return await asgi_app() return await asgi_app()
class SanicASGIDispatch(httpx.dispatch.ASGIDispatch): class SanicASGIDispatch(httpx.dispatch.asgi.ASGIDispatch):
pass pass
class SanicASGITestClient(httpx.Client): class SanicASGITestClient(httpx.AsyncClient):
def __init__( def __init__(
self, self,
app, app,

View File

@ -85,7 +85,7 @@ requirements = [
"aiofiles>=0.3.0", "aiofiles>=0.3.0",
"websockets>=7.0,<9.0", "websockets>=7.0,<9.0",
"multidict>=4.0,<5.0", "multidict>=4.0,<5.0",
"httpx==0.9.3", "httpx==0.11.1",
] ]
tests_require = [ tests_require = [

View File

@ -18,6 +18,22 @@ old_conn = None
class ReusableSanicConnectionPool( class ReusableSanicConnectionPool(
httpx.dispatch.connection_pool.ConnectionPool httpx.dispatch.connection_pool.ConnectionPool
): ):
@property
def cert(self):
return self.ssl.cert
@property
def verify(self):
return self.ssl.verify
@property
def trust_env(self):
return self.ssl.trust_env
@property
def http2(self):
return self.ssl.http2
async def acquire_connection(self, origin, timeout): async def acquire_connection(self, origin, timeout):
global old_conn global old_conn
connection = self.pop_connection(origin) connection = self.pop_connection(origin)
@ -26,14 +42,17 @@ class ReusableSanicConnectionPool(
pool_timeout = None if timeout is None else timeout.pool_timeout pool_timeout = None if timeout is None else timeout.pool_timeout
await self.max_connections.acquire(timeout=pool_timeout) await self.max_connections.acquire(timeout=pool_timeout)
ssl_config = httpx.config.SSLConfig(
cert=self.cert,
verify=self.verify,
trust_env=self.trust_env,
http2=self.http2
)
connection = httpx.dispatch.connection.HTTPConnection( connection = httpx.dispatch.connection.HTTPConnection(
origin, origin,
verify=self.verify, ssl=ssl_config,
cert=self.cert,
http2=self.http2,
backend=self.backend, backend=self.backend,
release_func=self.release_connection, release_func=self.release_connection,
trust_env=self.trust_env,
uds=self.uds, uds=self.uds,
) )
@ -49,7 +68,7 @@ class ReusableSanicConnectionPool(
return connection return connection
class ResusableSanicSession(httpx.Client): class ResusableSanicSession(httpx.AsyncClient):
def __init__(self, *args, **kwargs) -> None: def __init__(self, *args, **kwargs) -> None:
dispatch = ReusableSanicConnectionPool() dispatch = ReusableSanicConnectionPool()
super().__init__(dispatch=dispatch, *args, **kwargs) super().__init__(dispatch=dispatch, *args, **kwargs)
@ -159,7 +178,7 @@ class ReuseableSanicTestClient(SanicTestClient):
self._server = None self._server = None
if self._session: if self._session:
self._loop.run_until_complete(self._session.close()) self._loop.run_until_complete(self._session.aclose())
self._session = None self._session = None
except Exception as e3: except Exception as e3:
@ -178,7 +197,7 @@ class ReuseableSanicTestClient(SanicTestClient):
self._session = self.get_new_session() self._session = self.get_new_session()
try: try:
response = await getattr(self._session, method.lower())( response = await getattr(self._session, method.lower())(
url, verify=False, timeout=request_keepalive, *args, **kwargs url, timeout=request_keepalive, *args, **kwargs
) )
except NameError: except NameError:
raise Exception(response.status_code) raise Exception(response.status_code)
@ -188,7 +207,7 @@ class ReuseableSanicTestClient(SanicTestClient):
except (JSONDecodeError, UnicodeDecodeError): except (JSONDecodeError, UnicodeDecodeError):
response.json = None response.json = None
response.body = await response.read() response.body = await response.aread()
response.status = response.status_code response.status = response.status_code
response.content_type = response.headers.get("content-type") response.content_type = response.headers.get("content-type")

View File

@ -14,18 +14,15 @@ class DelayableHTTPConnection(httpx.dispatch.connection.HTTPConnection):
self._request_delay = kwargs.pop("request_delay") self._request_delay = kwargs.pop("request_delay")
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
async def send(self, request, verify=None, cert=None, timeout=None): async def send(self, request, timeout=None):
if self.h11_connection is None and self.h2_connection is None:
await self.connect(verify=verify, cert=cert, timeout=timeout) if self.connection is None:
self.connection = (await self.connect(timeout=timeout))
if self._request_delay: if self._request_delay:
await asyncio.sleep(self._request_delay) await asyncio.sleep(self._request_delay)
if self.h2_connection is not None: response = await self.connection.send(request, timeout=timeout)
response = await self.h2_connection.send(request, timeout=timeout)
else:
assert self.h11_connection is not None
response = await self.h11_connection.send(request, timeout=timeout)
return response return response
@ -46,12 +43,9 @@ class DelayableSanicConnectionPool(
await self.max_connections.acquire(timeout=pool_timeout) await self.max_connections.acquire(timeout=pool_timeout)
connection = DelayableHTTPConnection( connection = DelayableHTTPConnection(
origin, origin,
verify=self.verify, ssl=self.ssl,
cert=self.cert,
http2=self.http2,
backend=self.backend, backend=self.backend,
release_func=self.release_connection, release_func=self.release_connection,
trust_env=self.trust_env,
uds=self.uds, uds=self.uds,
request_delay=self._request_delay, request_delay=self._request_delay,
) )
@ -61,7 +55,7 @@ class DelayableSanicConnectionPool(
return connection return connection
class DelayableSanicSession(httpx.Client): class DelayableSanicSession(httpx.AsyncClient):
def __init__(self, request_delay=None, *args, **kwargs) -> None: def __init__(self, request_delay=None, *args, **kwargs) -> None:
dispatch = DelayableSanicConnectionPool(request_delay=request_delay) dispatch = DelayableSanicConnectionPool(request_delay=request_delay)
super().__init__(dispatch=dispatch, *args, **kwargs) super().__init__(dispatch=dispatch, *args, **kwargs)

View File

@ -13,7 +13,7 @@ deps =
pytest-sanic pytest-sanic
pytest-sugar pytest-sugar
httpcore==0.3.0 httpcore==0.3.0
httpx==0.9.3 httpx==0.11.1
chardet<=2.3.0 chardet<=2.3.0
beautifulsoup4 beautifulsoup4
gunicorn gunicorn