From 69366d8bd5d625f1b821fa213999d7c075926aeb Mon Sep 17 00:00:00 2001 From: Izzy Turtle Date: Sun, 26 Apr 2026 15:38:34 +0800 Subject: [PATCH] fix(proxy): handle BrokenPipeError on client disconnect gracefully (#11) --- pyproject.toml | 2 +- src/deepseek_cursor_proxy/server.py | 34 +++++++++++++++++------------ 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d9ea31e..c48b793 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "deepseek-cursor-proxy" -version = "0.1.0" +version = "0.1.1" description = "Local OpenAI-compatible proxy for Cursor and DeepSeek thinking models" readme = "README.md" requires-python = ">=3.10" diff --git a/src/deepseek_cursor_proxy/server.py b/src/deepseek_cursor_proxy/server.py index f77c9df..d7e8f86 100644 --- a/src/deepseek_cursor_proxy/server.py +++ b/src/deepseek_cursor_proxy/server.py @@ -297,12 +297,15 @@ class DeepSeekProxyHandler(BaseHTTPRequestHandler): body = json.dumps(payload, ensure_ascii=False, separators=(",", ":")).encode( "utf-8" ) - self.send_response(status) - self._send_cors_headers() - self.send_header("Content-Type", "application/json") - self.send_header("Content-Length", str(len(body))) - self.end_headers() - self.wfile.write(body) + try: + self.send_response(status) + self._send_cors_headers() + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + except (BrokenPipeError, ConnectionError) as exc: + LOG.warning("client disconnected before response could be sent: %s", exc) def _send_models(self) -> None: created = int(time.time()) @@ -365,14 +368,17 @@ class DeepSeekProxyHandler(BaseHTTPRequestHandler): body = read_response_body(exc) if self.config.verbose: log_bytes("upstream error body", body) - self.send_response(exc.code) - self._send_cors_headers() - self.send_header( - "Content-Type", exc.headers.get("Content-Type", "application/json") - ) - self.send_header("Content-Length", str(len(body))) - self.end_headers() - self.wfile.write(body) + try: + self.send_response(exc.code) + self._send_cors_headers() + self.send_header( + "Content-Type", exc.headers.get("Content-Type", "application/json") + ) + self.send_header("Content-Length", str(len(body))) + self.end_headers() + self.wfile.write(body) + except (BrokenPipeError, ConnectionError) as write_err: + LOG.warning("client disconnected before upstream error could be sent: %s", write_err) def _proxy_regular_response( self,