Skip to content

Commit 79fa1da

Browse files
Theodor N. EngøyTheodor N. Engøy
authored andcommitted
tests: satisfy coverage/pyright for max_body_bytes guards
1 parent b13960a commit 79fa1da

File tree

4 files changed

+83
-3
lines changed

4 files changed

+83
-3
lines changed

src/mcp/server/http_body.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,3 @@ async def read_request_body(request: Request, *, max_body_bytes: int | None = DE
5555
body.extend(chunk)
5656

5757
return bytes(body)
58-

tests/server/mcpserver/test_server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ async def test_sse_app_passes_max_body_bytes(self):
8484
mount_routes = [r for r in app.routes if isinstance(r, Mount)]
8585
assert len(mount_routes) == 1
8686

87-
message_app = mount_routes[0].app
87+
message_app: Any = mount_routes[0].app
8888
assert hasattr(message_app, "__self__"), "Expected a bound method for message handler"
89-
sse_transport = message_app.__self__
89+
sse_transport: Any = message_app.__self__
9090
assert getattr(sse_transport, "_max_body_bytes") == 123
9191

9292
async def test_streamable_http_app_passes_max_body_bytes(self):

tests/server/test_http_body.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from __future__ import annotations
2+
3+
import pytest
4+
from starlette.requests import Request
5+
from starlette.types import Message
6+
7+
from mcp.server.http_body import BodyTooLargeError, read_request_body
8+
9+
10+
def make_request(*, body_chunks: list[bytes], headers: dict[str, str] | None = None) -> Request:
11+
scope = {
12+
"type": "http",
13+
"method": "POST",
14+
"path": "/",
15+
"query_string": b"",
16+
"headers": [(k.lower().encode(), v.encode()) for k, v in (headers or {}).items()],
17+
}
18+
19+
messages: list[Message] = [
20+
{
21+
"type": "http.request",
22+
"body": chunk,
23+
"more_body": i < len(body_chunks) - 1,
24+
}
25+
for i, chunk in enumerate(body_chunks)
26+
]
27+
28+
async def receive() -> Message:
29+
if messages:
30+
return messages.pop(0)
31+
return {"type": "http.request", "body": b"", "more_body": False}
32+
33+
return Request(scope, receive)
34+
35+
36+
pytestmark = pytest.mark.anyio
37+
38+
39+
async def test_read_request_body_allows_disabling_limit_with_none():
40+
request = make_request(body_chunks=[b"x" * 20])
41+
body = await read_request_body(request, max_body_bytes=None)
42+
assert body == b"x" * 20
43+
44+
45+
async def test_read_request_body_rejects_non_positive_limit():
46+
request = make_request(body_chunks=[b"{}"])
47+
with pytest.raises(ValueError, match="max_body_bytes must be positive or None"):
48+
await read_request_body(request, max_body_bytes=0)
49+
50+
51+
async def test_read_request_body_ignores_invalid_content_length_header():
52+
request = make_request(body_chunks=[b"{}"], headers={"content-length": "not-a-number"})
53+
body = await read_request_body(request, max_body_bytes=10)
54+
assert body == b"{}"
55+
56+
57+
async def test_read_request_body_errors_if_more_chunks_arrive_after_limit_is_reached():
58+
# First chunk reaches the limit exactly; the next non-empty chunk should error.
59+
request = make_request(body_chunks=[b"12345", b"6"])
60+
with pytest.raises(BodyTooLargeError):
61+
await read_request_body(request, max_body_bytes=5)
62+
63+
64+
async def test_read_request_body_handles_empty_request_body():
65+
request = make_request(body_chunks=[])
66+
body = await read_request_body(request, max_body_bytes=10)
67+
assert body == b""
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import pytest
2+
3+
from mcp.server.sse import SseServerTransport
4+
from mcp.server.streamable_http import StreamableHTTPServerTransport
5+
6+
7+
def test_sse_transport_rejects_non_positive_max_body_bytes():
8+
with pytest.raises(ValueError, match="max_body_bytes must be positive or None"):
9+
SseServerTransport("/messages/", max_body_bytes=0)
10+
11+
12+
def test_streamable_http_transport_rejects_non_positive_max_body_bytes():
13+
with pytest.raises(ValueError, match="max_body_bytes must be positive or None"):
14+
StreamableHTTPServerTransport(mcp_session_id=None, max_body_bytes=0)

0 commit comments

Comments
 (0)