Skip to content
Merged
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
4 changes: 2 additions & 2 deletions src/connectrpc/_compression.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ def name(self) -> str:

def compress(self, data: bytes | bytearray | memoryview) -> bytes:
"""Return data as-is without compression."""
return bytes(data)
return data if isinstance(data, bytes) else bytes(data)

def decompress(self, data: bytes | bytearray | memoryview) -> bytes:
"""Return data as-is without decompression."""
return bytes(data)
return data if isinstance(data, bytes) else bytes(data)


_identity = IdentityCompression()
Expand Down
11 changes: 8 additions & 3 deletions src/connectrpc/_protocol_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,18 @@
from ._protocol import ServerProtocol


_CONNECT_PROTOCOL = ConnectServerProtocol()
_GRPC_PROTOCOL = GRPCServerProtocol()
_GRPC_WEB_PROTOCOL = GRPCWebServerProtocol()


def negotiate_server_protocol(content_type: str) -> ServerProtocol:
if content_type == GRPC_CONTENT_TYPE_DEFAULT or content_type.startswith(
GRPC_CONTENT_TYPE_PREFIX
):
return GRPCServerProtocol()
return _GRPC_PROTOCOL
if content_type == GRPC_WEB_CONTENT_TYPE_DEFAULT or content_type.startswith(
GRPC_WEB_CONTENT_TYPE_PREFIX
):
return GRPCWebServerProtocol()
return ConnectServerProtocol()
return _GRPC_WEB_PROTOCOL
return _CONNECT_PROTOCOL
25 changes: 25 additions & 0 deletions test/test_compression.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from pyqwest import Client, SyncClient
from pyqwest.testing import ASGITransport, WSGITransport

from connectrpc._compression import IdentityCompression
from connectrpc.client import ResponseMetadata
from connectrpc.compression.brotli import BrotliCompression
from connectrpc.compression.gzip import GzipCompression
Expand Down Expand Up @@ -88,3 +89,27 @@ def make_hat(self, request, ctx):
assert res.size == 10
assert res.color == "blue"
assert meta.headers.get("content-encoding") == encoding


class TestIdentityCompression:
def test_name(self):
assert IdentityCompression().name() == "identity"

def test_bytes(self):
data = b"hello"
compression = IdentityCompression()
compressed = compression.compress(data)
assert compressed is data
decompressed = compression.decompress(compressed)
assert decompressed is data

@pytest.mark.parametrize("ctor", [bytearray, memoryview])
def test_not_bytes(self, ctor: type[bytearray | memoryview]) -> None:
data = ctor(b"hello")
compression = IdentityCompression()
compressed = compression.compress(data)
assert compressed == b"hello"
assert isinstance(compressed, bytes)
decompressed = compression.decompress(compressed)
assert decompressed == b"hello"
assert isinstance(decompressed, bytes)
Loading