Skip to content

Commit 64ddbe2

Browse files
committed
Use HTTP 421 for invalid Host headers in DNS rebinding protection
1 parent f349d6f commit 64ddbe2

File tree

3 files changed

+5
-5
lines changed

3 files changed

+5
-5
lines changed

src/mcp/server/transport_security.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ async def validate_request(self, request: Request, is_post: bool = False) -> Res
117117
# Validate Host header
118118
host = request.headers.get("host")
119119
if not self._validate_host(host):
120-
return Response("Invalid Host header", status_code=400)
120+
return Response("Invalid Host header", status_code=421)
121121

122122
# Validate Origin header
123123
origin = request.headers.get("origin")

tests/server/test_sse_security.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ async def test_sse_security_invalid_host_header(server_port: int):
104104

105105
async with httpx.AsyncClient() as client:
106106
response = await client.get(f"http://127.0.0.1:{server_port}/sse", headers=headers)
107-
assert response.status_code == 400
107+
assert response.status_code == 421
108108
assert response.text == "Invalid Host header"
109109

110110
finally:
@@ -214,7 +214,7 @@ async def test_sse_security_custom_allowed_hosts(server_port: int):
214214

215215
async with httpx.AsyncClient() as client:
216216
response = await client.get(f"http://127.0.0.1:{server_port}/sse", headers=headers)
217-
assert response.status_code == 400
217+
assert response.status_code == 421
218218
assert response.text == "Invalid Host header"
219219

220220
finally:

tests/server/test_streamable_http_security.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ async def test_streamable_http_security_invalid_host_header(server_port: int):
127127
json={"jsonrpc": "2.0", "method": "initialize", "id": 1, "params": {}},
128128
headers=headers,
129129
)
130-
assert response.status_code == 400
130+
assert response.status_code == 421
131131
assert response.text == "Invalid Host header"
132132

133133
finally:
@@ -270,7 +270,7 @@ async def test_streamable_http_security_get_request(server_port: int):
270270

271271
async with httpx.AsyncClient(timeout=5.0) as client:
272272
response = await client.get(f"http://127.0.0.1:{server_port}/", headers=headers)
273-
assert response.status_code == 400
273+
assert response.status_code == 421
274274
assert response.text == "Invalid Host header"
275275

276276
# Test GET request with valid host header

0 commit comments

Comments
 (0)