fix: route uploads through a request handler

This commit is contained in:
nac
2026-08-14 14:22:12 +00:00
parent 43b63cc5ec
commit 56b289b53f
2 changed files with 22 additions and 1 deletions
+5 -1
View File
@@ -641,10 +641,14 @@ def _read_token_from_env(env_name: str) -> str:
def create_http_app(server: Any, token: str, upload_endpoint: UploadEndpoint | None = None) -> Any: def create_http_app(server: Any, token: str, upload_endpoint: UploadEndpoint | None = None) -> Any:
if upload_endpoint is None: if upload_endpoint is None:
return BearerTokenAuthMiddleware(server.streamable_http_app(), token) return BearerTokenAuthMiddleware(server.streamable_http_app(), token)
async def upload_route(request: Any) -> Any:
return await upload_endpoint(request)
mcp_app = server.streamable_http_app() mcp_app = server.streamable_http_app()
app = Starlette( app = Starlette(
routes=[ routes=[
Route("/uploads", endpoint=upload_endpoint, methods=["POST"]), Route("/uploads", endpoint=upload_route, methods=["POST"]),
Mount("/", app=mcp_app), Mount("/", app=mcp_app),
], ],
lifespan=mcp_app.router.lifespan_context, lifespan=mcp_app.router.lifespan_context,
+17
View File
@@ -292,6 +292,23 @@ class ServerTests(unittest.TestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.json(), {"uploaded": True}) self.assertEqual(response.json(), {"uploaded": True})
def test_upload_route_dispatches_callable_endpoint_objects_as_request_handlers(self) -> None:
if FastMCP is None:
self.skipTest("MCP SDK is not installed")
server = create_server(crm_service=FakeCrmService(), readonly=True)
app = create_http_app(server, "secret", upload_endpoint=FakeUploadEndpoint())
async def request_upload() -> httpx.Response:
async with httpx.AsyncClient(
transport=httpx.ASGITransport(app=app), base_url="http://testserver"
) as client:
return await client.post("/uploads", headers={"Authorization": "Bearer secret"})
response = asyncio.run(request_upload())
self.assertEqual(response.status_code, 200)
self.assertEqual(response.json(), {"uploaded": True})
def test_upload_route_preserves_mcp_application_lifespan(self) -> None: def test_upload_route_preserves_mcp_application_lifespan(self) -> None:
lifecycle = {"started": False, "stopped": False} lifecycle = {"started": False, "stopped": False}