Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 1 addition & 53 deletions conformance/test/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -445,51 +445,6 @@ async def _consume_log(stream: AsyncIterator[bytes]) -> None:
pass


async def serve_daphne(
request: ServerCompatRequest,
certfile: str | None,
keyfile: str | None,
cafile: str | None,
port_future: asyncio.Future[int],
):
args = []
ssl_endpoint_parts = []
if certfile:
ssl_endpoint_parts.append(f"certKey={certfile}")
if keyfile:
ssl_endpoint_parts.append(f"privateKey={keyfile}")
if cafile:
ssl_endpoint_parts.append(f"extraCertChain={cafile}")
if ssl_endpoint_parts:
args.append("-e")
args.append(f"ssl:port=0:{':'.join(ssl_endpoint_parts)}")
else:
args.append("-p=0")

args.append("server:asgi_app")

proc = await asyncio.create_subprocess_exec(
"daphne",
*args,
stderr=asyncio.subprocess.STDOUT,
stdout=asyncio.subprocess.PIPE,
env=_server_env(request),
)
stdout = proc.stdout
assert stdout is not None
stdout = _tee_to_stderr(stdout)
try:
async for line in stdout:
if b"Listening on TCP address" in line:
port = line.decode("utf-8").strip().rsplit(":", 1)[1]
port_future.set_result(int(port))
break
await _consume_log(stdout)
except asyncio.CancelledError:
proc.terminate()
await proc.wait()


async def serve_granian(
request: ServerCompatRequest,
mode: Literal["sync", "async"],
Expand Down Expand Up @@ -730,7 +685,7 @@ def _find_free_port():


Mode = Literal["sync", "async"]
Server = Literal["daphne", "granian", "gunicorn", "hypercorn", "pyvoy", "uvicorn"]
Server = Literal["granian", "gunicorn", "hypercorn", "pyvoy", "uvicorn"]


class Args(argparse.Namespace):
Expand Down Expand Up @@ -777,13 +732,6 @@ async def main() -> None:
with cleanup:
port_future: asyncio.Future[int] = asyncio.get_event_loop().create_future()
match args.server:
case "daphne":
if args.mode == "sync":
msg = "daphne does not support sync mode"
raise ValueError(msg)
serve_task = asyncio.create_task(
serve_daphne(request, certfile, keyfile, cafile, port_future)
)
case "granian":
serve_task = asyncio.create_task(
serve_granian(
Expand Down
22 changes: 1 addition & 21 deletions conformance/test/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,33 +77,13 @@ def test_server_sync(server: str, cov: Coverage) -> None:
pytest.fail(f"\n{result.stdout}\n{result.stderr}")


@pytest.mark.parametrize("server", ["daphne", "pyvoy", "uvicorn"])
@pytest.mark.parametrize("server", ["pyvoy", "uvicorn"])
def test_server_async(server: str, cov: Coverage) -> None:
args = maybe_patch_args_with_debug(
[sys.executable, _server_py_path, "--mode", "async", "--server", server]
)
opts = []
match server:
case "daphne":
opts = [
# daphne doesn't support h2c
"--skip",
"**/HTTPVersion:2/**/TLS:false/**",
# daphne doesn't support HTTP/3
"--skip",
"**/HTTPVersion:3/**",
# daphne seems to block on the request body so can't do full duplex even with h2,
# it only works with websockets
"--skip",
"**/full-duplex/**",
# daphne doesn't support trailers
"--skip",
"**/Protocol:PROTOCOL_GRPC/**",
"--skip",
"gRPC Proto Sub-Format Requests/**",
"--skip",
"gRPC Unexpected Requests/**",
]
case "uvicorn":
# uvicorn doesn't support HTTP/2 or 3
opts = ["--skip", "**/HTTPVersion:2/**", "--skip", "**/HTTPVersion:3/**"]
Expand Down
3 changes: 0 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,10 @@ Repository = "https://github.com/connectrpc/connect-python"

[dependency-groups]
dev = [
# Needed to enable HTTP/2 in daphne
"Twisted[tls,http2]==25.5.0",
"asgiref==3.11.1",
"brotli==1.2.0",
"buf-bin==1.69.0",
"connect-python-example",
"daphne==4.2.1",
"granian==2.7.4",
"grpcio-tools==1.80.0",
"gunicorn==25.3.0",
Expand Down
Loading
Loading