forked from pool/python-uvicorn
		
	- update to 0.32.0:
* Officially support Python 3.13 * Warn when `max_request_limit` is exceeded * Support WebSockets 0.13.1 * Restore support for `[*]` in trusted hosts * Add `PathLike[str]` type hint for `ssl_keyfile` * Improve `ProxyHeadersMiddleware` (#2468) and (#2231): * Fix the host for requests from clients running on the proxy server itself. * Fallback to host that was already set for empty x-forwarded- for headers. * Also allow to specify IP Networks as trusted hosts. This greatly simplifies deployments * on docker swarm/kubernetes, where the reverse proxy might have a dynamic IP. * This includes support for IPv6 Address/Networks. * Don't warn when upgrade is not WebSocket and depedencies are installed * Don't close connection before receiving body on H11 * Close connection when `h11` sets client state to `MUST_CLOSE` * Suppress `KeyboardInterrupt` from CLI and programmatic usage * `ClientDisconnect` inherits from `OSError` instead of `IOError` * Add `reason` support to `websocket.disconnect` event * Iterate subprocesses in-place on the process manager * Allow horizontal tabs ` ` in response header values * New multiprocess manager * Allow `ConfigParser` or a `io.IO[Any]` on `log_config` * Suppress side-effects of signal propagation * Send `content-length` header on 5xx OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-uvicorn?expand=0&rev=38
This commit is contained in:
		@@ -1,133 +0,0 @@
 | 
			
		||||
From 62e52f30f75b42290e32adb85dd1319b9c5a0072 Mon Sep 17 00:00:00 2001
 | 
			
		||||
From: =?UTF-8?q?Dan=20=C4=8Cerm=C3=A1k?= <dcermak@suse.com>
 | 
			
		||||
Date: Mon, 25 Mar 2024 21:48:07 +0100
 | 
			
		||||
Subject: [PATCH] Stop using deprecated app shortcut in httpx.AsyncClient
 | 
			
		||||
 | 
			
		||||
This keyword parameter has been deprecated with httpx 0.27
 | 
			
		||||
---
 | 
			
		||||
 tests/middleware/test_message_logger.py |  8 ++++----
 | 
			
		||||
 tests/middleware/test_proxy_headers.py  |  6 +++---
 | 
			
		||||
 tests/middleware/test_wsgi.py           | 23 ++++++++---------------
 | 
			
		||||
 3 files changed, 15 insertions(+), 22 deletions(-)
 | 
			
		||||
 | 
			
		||||
diff --git a/tests/middleware/test_message_logger.py b/tests/middleware/test_message_logger.py
 | 
			
		||||
index 3f5c3af..d066e99 100644
 | 
			
		||||
--- a/tests/middleware/test_message_logger.py
 | 
			
		||||
+++ b/tests/middleware/test_message_logger.py
 | 
			
		||||
@@ -17,8 +17,8 @@ async def test_message_logger(caplog):
 | 
			
		||||
         caplog.set_level(TRACE_LOG_LEVEL, logger="uvicorn.asgi")
 | 
			
		||||
         caplog.set_level(TRACE_LOG_LEVEL)
 | 
			
		||||
 
 | 
			
		||||
-        app = MessageLoggerMiddleware(app)
 | 
			
		||||
-        async with httpx.AsyncClient(app=app, base_url="http://testserver") as client:
 | 
			
		||||
+        transport = httpx.ASGITransport(MessageLoggerMiddleware(app))
 | 
			
		||||
+        async with httpx.AsyncClient(transport=transport, base_url="http://testserver") as client:
 | 
			
		||||
             response = await client.get("/")
 | 
			
		||||
         assert response.status_code == 200
 | 
			
		||||
         messages = [record.msg % record.args for record in caplog.records]
 | 
			
		||||
@@ -37,8 +37,8 @@ async def test_message_logger_exc(caplog):
 | 
			
		||||
     with caplog_for_logger(caplog, "uvicorn.asgi"):
 | 
			
		||||
         caplog.set_level(TRACE_LOG_LEVEL, logger="uvicorn.asgi")
 | 
			
		||||
         caplog.set_level(TRACE_LOG_LEVEL)
 | 
			
		||||
-        app = MessageLoggerMiddleware(app)
 | 
			
		||||
-        async with httpx.AsyncClient(app=app, base_url="http://testserver") as client:
 | 
			
		||||
+        transport = httpx.ASGITransport(MessageLoggerMiddleware(app))
 | 
			
		||||
+        async with httpx.AsyncClient(transport=transport, base_url="http://testserver") as client:
 | 
			
		||||
             with pytest.raises(RuntimeError):
 | 
			
		||||
                 await client.get("/")
 | 
			
		||||
         messages = [record.msg % record.args for record in caplog.records]
 | 
			
		||||
diff --git a/tests/middleware/test_proxy_headers.py b/tests/middleware/test_proxy_headers.py
 | 
			
		||||
index 6d7fc8c..e50defa 100644
 | 
			
		||||
--- a/tests/middleware/test_proxy_headers.py
 | 
			
		||||
+++ b/tests/middleware/test_proxy_headers.py
 | 
			
		||||
@@ -49,7 +49,7 @@ async def app(
 | 
			
		||||
 )
 | 
			
		||||
 async def test_proxy_headers_trusted_hosts(trusted_hosts: list[str] | str, response_text: str) -> None:
 | 
			
		||||
     app_with_middleware = ProxyHeadersMiddleware(app, trusted_hosts=trusted_hosts)
 | 
			
		||||
-    async with httpx.AsyncClient(app=app_with_middleware, base_url="http://testserver") as client:
 | 
			
		||||
+    async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app_with_middleware), base_url="http://testserver") as client:
 | 
			
		||||
         headers = {"X-Forwarded-Proto": "https", "X-Forwarded-For": "1.2.3.4"}
 | 
			
		||||
         response = await client.get("/", headers=headers)
 | 
			
		||||
 
 | 
			
		||||
@@ -79,7 +79,7 @@ async def test_proxy_headers_trusted_hosts(trusted_hosts: list[str] | str, respo
 | 
			
		||||
 )
 | 
			
		||||
 async def test_proxy_headers_multiple_proxies(trusted_hosts: list[str] | str, response_text: str) -> None:
 | 
			
		||||
     app_with_middleware = ProxyHeadersMiddleware(app, trusted_hosts=trusted_hosts)
 | 
			
		||||
-    async with httpx.AsyncClient(app=app_with_middleware, base_url="http://testserver") as client:
 | 
			
		||||
+    async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app_with_middleware), base_url="http://testserver") as client:
 | 
			
		||||
         headers = {
 | 
			
		||||
             "X-Forwarded-Proto": "https",
 | 
			
		||||
             "X-Forwarded-For": "1.2.3.4, 10.0.2.1, 192.168.0.2",
 | 
			
		||||
@@ -93,7 +93,7 @@ async def test_proxy_headers_multiple_proxies(trusted_hosts: list[str] | str, re
 | 
			
		||||
 @pytest.mark.anyio
 | 
			
		||||
 async def test_proxy_headers_invalid_x_forwarded_for() -> None:
 | 
			
		||||
     app_with_middleware = ProxyHeadersMiddleware(app, trusted_hosts="*")
 | 
			
		||||
-    async with httpx.AsyncClient(app=app_with_middleware, base_url="http://testserver") as client:
 | 
			
		||||
+    async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app_with_middleware), base_url="http://testserver") as client:
 | 
			
		||||
         headers = httpx.Headers(
 | 
			
		||||
             {
 | 
			
		||||
                 "X-Forwarded-Proto": "https",
 | 
			
		||||
diff --git a/tests/middleware/test_wsgi.py b/tests/middleware/test_wsgi.py
 | 
			
		||||
index adc8e24..478dd84 100644
 | 
			
		||||
--- a/tests/middleware/test_wsgi.py
 | 
			
		||||
+++ b/tests/middleware/test_wsgi.py
 | 
			
		||||
@@ -59,8 +59,8 @@ def wsgi_middleware(request: pytest.FixtureRequest) -> Callable:
 | 
			
		||||
 
 | 
			
		||||
 @pytest.mark.anyio
 | 
			
		||||
 async def test_wsgi_get(wsgi_middleware: Callable) -> None:
 | 
			
		||||
-    app = wsgi_middleware(hello_world)
 | 
			
		||||
-    async with httpx.AsyncClient(app=app, base_url="http://testserver") as client:
 | 
			
		||||
+    transport = httpx.ASGITransport(wsgi_middleware(hello_world))
 | 
			
		||||
+    async with httpx.AsyncClient(transport=transport, base_url="http://testserver") as client:
 | 
			
		||||
         response = await client.get("/")
 | 
			
		||||
     assert response.status_code == 200
 | 
			
		||||
     assert response.text == "Hello World!\n"
 | 
			
		||||
@@ -68,8 +68,8 @@ async def test_wsgi_get(wsgi_middleware: Callable) -> None:
 | 
			
		||||
 
 | 
			
		||||
 @pytest.mark.anyio
 | 
			
		||||
 async def test_wsgi_post(wsgi_middleware: Callable) -> None:
 | 
			
		||||
-    app = wsgi_middleware(echo_body)
 | 
			
		||||
-    async with httpx.AsyncClient(app=app, base_url="http://testserver") as client:
 | 
			
		||||
+    transport = httpx.ASGITransport(wsgi_middleware(echo_body))
 | 
			
		||||
+    async with httpx.AsyncClient(transport=transport, base_url="http://testserver") as client:
 | 
			
		||||
         response = await client.post("/", json={"example": 123})
 | 
			
		||||
     assert response.status_code == 200
 | 
			
		||||
     assert response.text == '{"example": 123}'
 | 
			
		||||
@@ -81,8 +81,8 @@ async def test_wsgi_put_more_body(wsgi_middleware: Callable) -> None:
 | 
			
		||||
         for _ in range(1024):
 | 
			
		||||
             yield b"123456789abcdef\n" * 64
 | 
			
		||||
 
 | 
			
		||||
-    app = wsgi_middleware(echo_body)
 | 
			
		||||
-    async with httpx.AsyncClient(app=app, base_url="http://testserver") as client:
 | 
			
		||||
+    transport = httpx.ASGITransport(wsgi_middleware(echo_body))
 | 
			
		||||
+    async with httpx.AsyncClient(transport=transport, base_url="http://testserver") as client:
 | 
			
		||||
         response = await client.put("/", content=generate_body())
 | 
			
		||||
     assert response.status_code == 200
 | 
			
		||||
     assert response.text == "123456789abcdef\n" * 64 * 1024
 | 
			
		||||
@@ -92,21 +92,14 @@ async def test_wsgi_put_more_body(wsgi_middleware: Callable) -> None:
 | 
			
		||||
 async def test_wsgi_exception(wsgi_middleware: Callable) -> None:
 | 
			
		||||
     # Note that we're testing the WSGI app directly here.
 | 
			
		||||
     # The HTTP protocol implementations would catch this error and return 500.
 | 
			
		||||
-    app = wsgi_middleware(raise_exception)
 | 
			
		||||
-    async with httpx.AsyncClient(app=app, base_url="http://testserver") as client:
 | 
			
		||||
+    transport = httpx.ASGITransport(wsgi_middleware(raise_exception))
 | 
			
		||||
+    async with httpx.AsyncClient(transport=transport, base_url="http://testserver") as client:
 | 
			
		||||
         with pytest.raises(RuntimeError):
 | 
			
		||||
             await client.get("/")
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
 @pytest.mark.anyio
 | 
			
		||||
 async def test_wsgi_exc_info(wsgi_middleware: Callable) -> None:
 | 
			
		||||
-    # Note that we're testing the WSGI app directly here.
 | 
			
		||||
-    # The HTTP protocol implementations would catch this error and return 500.
 | 
			
		||||
-    app = wsgi_middleware(return_exc_info)
 | 
			
		||||
-    async with httpx.AsyncClient(app=app, base_url="http://testserver") as client:
 | 
			
		||||
-        with pytest.raises(RuntimeError):
 | 
			
		||||
-            response = await client.get("/")
 | 
			
		||||
-
 | 
			
		||||
     app = wsgi_middleware(return_exc_info)
 | 
			
		||||
     transport = httpx.ASGITransport(
 | 
			
		||||
         app=app,
 | 
			
		||||
-- 
 | 
			
		||||
2.44.0
 | 
			
		||||
 | 
			
		||||
@@ -1,13 +0,0 @@
 | 
			
		||||
Index: uvicorn-0.22.0/tests/protocols/test_websocket.py
 | 
			
		||||
===================================================================
 | 
			
		||||
--- uvicorn-0.22.0.orig/tests/protocols/test_websocket.py
 | 
			
		||||
+++ uvicorn-0.22.0/tests/protocols/test_websocket.py
 | 
			
		||||
@@ -584,7 +584,7 @@ async def test_asgi_return_value(
 | 
			
		||||
     async with run_server(config):
 | 
			
		||||
         with pytest.raises(websockets.exceptions.ConnectionClosed) as exc_info:
 | 
			
		||||
             await connect(f"ws://127.0.0.1:{unused_tcp_port}")
 | 
			
		||||
-        assert exc_info.value.code == 1006
 | 
			
		||||
+        assert exc_info.value.code in {1000, 1006}
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
 @pytest.mark.anyio
 | 
			
		||||
@@ -1,3 +1,41 @@
 | 
			
		||||
-------------------------------------------------------------------
 | 
			
		||||
Wed Oct 30 10:37:07 UTC 2024 - Dirk Müller <dmueller@suse.com>
 | 
			
		||||
 | 
			
		||||
- update to 0.32.0:
 | 
			
		||||
  * Officially support Python 3.13
 | 
			
		||||
  * Warn when `max_request_limit` is exceeded
 | 
			
		||||
  * Support WebSockets 0.13.1
 | 
			
		||||
  * Restore support for `[*]` in trusted hosts
 | 
			
		||||
  * Add `PathLike[str]` type hint for `ssl_keyfile`
 | 
			
		||||
  * Improve `ProxyHeadersMiddleware` (#2468) and (#2231):
 | 
			
		||||
  * Fix the host for requests from clients running on the proxy
 | 
			
		||||
    server itself.
 | 
			
		||||
  * Fallback to host that was already set for empty x-forwarded-
 | 
			
		||||
    for headers.
 | 
			
		||||
  * Also allow to specify IP Networks as trusted hosts. This
 | 
			
		||||
    greatly simplifies deployments
 | 
			
		||||
  * on docker swarm/kubernetes, where the reverse proxy might
 | 
			
		||||
    have a dynamic IP.
 | 
			
		||||
  * This includes support for IPv6 Address/Networks.
 | 
			
		||||
  * Don't warn when upgrade is not WebSocket and depedencies are
 | 
			
		||||
    installed
 | 
			
		||||
  * Don't close connection before receiving body on H11
 | 
			
		||||
  * Close connection when `h11` sets client state to `MUST_CLOSE`
 | 
			
		||||
  * Suppress `KeyboardInterrupt` from CLI and programmatic usage
 | 
			
		||||
  * `ClientDisconnect` inherits from `OSError` instead of
 | 
			
		||||
    `IOError`
 | 
			
		||||
  * Add `reason` support to `websocket.disconnect` event
 | 
			
		||||
  * Iterate subprocesses in-place on the process manager
 | 
			
		||||
  * Allow horizontal tabs `	` in response header values
 | 
			
		||||
  * New multiprocess manager
 | 
			
		||||
  * Allow `ConfigParser` or a `io.IO[Any]` on `log_config`
 | 
			
		||||
  * Suppress side-effects of signal propagation
 | 
			
		||||
  * Send `content-length` header on 5xx
 | 
			
		||||
  * Deprecate the `uvicorn.workers` module
 | 
			
		||||
- drop fix-websocket-tests.patch,
 | 
			
		||||
  0001-Stop-using-deprecated-app-shortcut-in-httpx.AsyncCli.patch:
 | 
			
		||||
  upstream
 | 
			
		||||
 | 
			
		||||
-------------------------------------------------------------------
 | 
			
		||||
Mon Mar 25 20:19:46 UTC 2024 - Dan Čermák <dcermak@suse.com>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -18,27 +18,23 @@
 | 
			
		||||
 | 
			
		||||
%{?sle15_python_module_pythons}
 | 
			
		||||
Name:           python-uvicorn
 | 
			
		||||
Version:        0.29.0
 | 
			
		||||
Version:        0.32.0
 | 
			
		||||
Release:        0
 | 
			
		||||
Summary:        An Asynchronous Server Gateway Interface server
 | 
			
		||||
License:        BSD-3-Clause
 | 
			
		||||
URL:            https://github.com/encode/uvicorn
 | 
			
		||||
Source:         https://github.com/encode/uvicorn/archive/%{version}.tar.gz#/uvicorn-%{version}.tar.gz
 | 
			
		||||
# PATCH-FIX-UPSTREAM fix-websocket-tests.patch -- gh#encode/uvicorn#1929
 | 
			
		||||
Patch0:         fix-websocket-tests.patch
 | 
			
		||||
# https://github.com/encode/uvicorn/pull/2288
 | 
			
		||||
Patch1:         0001-Stop-using-deprecated-app-shortcut-in-httpx.AsyncCli.patch
 | 
			
		||||
BuildRequires:  %{python_module base >= 3.8}
 | 
			
		||||
BuildRequires:  %{python_module hatchling}
 | 
			
		||||
BuildRequires:  %{python_module pip}
 | 
			
		||||
BuildRequires:  %{python_module setuptools}
 | 
			
		||||
BuildRequires:  %{python_module typing-extensions >= 4 if %python-base < 3.11}
 | 
			
		||||
BuildRequires:  %{python_module typing-extensions >= 4}
 | 
			
		||||
BuildRequires:  %{python_module wheel}
 | 
			
		||||
BuildRequires:  fdupes
 | 
			
		||||
BuildRequires:  python-rpm-macros
 | 
			
		||||
Requires:       python-click >= 7.0
 | 
			
		||||
Requires:       python-h11 >= 0.8.0
 | 
			
		||||
Requires:       (python-typing-extensions >= 4 if python-base < 3.11)
 | 
			
		||||
Requires:       python-typing-extensions >= 4
 | 
			
		||||
Recommends:     python-PyYAML >= 5.1
 | 
			
		||||
Recommends:     python-httptools >= 0.4.0
 | 
			
		||||
Recommends:     python-websockets >= 8.0
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								uvicorn-0.29.0.tar.gz
									 (Stored with Git LFS)
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								uvicorn-0.29.0.tar.gz
									 (Stored with Git LFS)
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										3
									
								
								uvicorn-0.32.0.tar.gz
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								uvicorn-0.32.0.tar.gz
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
version https://git-lfs.github.com/spec/v1
 | 
			
		||||
oid sha256:784d962b41b0bd9b6265cabf0054cf55d03fffb882c901e77840894f36ea8a23
 | 
			
		||||
size 728882
 | 
			
		||||
		Reference in New Issue
	
	Block a user