Fixes Situations Where TCP Connections Might be Refused

This commit is contained in:
马一丁
2025-11-22 02:06:53 +08:00
parent 56b6bdd1b4
commit a22be6d7dd
3 changed files with 98 additions and 7 deletions
+34 -1
View File
@@ -36,6 +36,39 @@ app = Flask(__name__)
app.config['SECRET_KEY'] = 'Dedicated-to-creating-a-concise-and-versatile-public-opinion-analysis-platform'
socketio = SocketIO(app, cors_allowed_origins="*")
# eventlet 在客户端主动断开时偶尔会抛出 ConnectionAbortedError,这里做一次防御性包裹,
# 避免无意义的堆栈污染日志(仅在 eventlet 可用时启用)。
def _patch_eventlet_disconnect_logging():
try:
import eventlet.wsgi # type: ignore
except Exception as exc: # pragma: no cover - 仅在生产环境有效
logger.debug(f"eventlet 不可用,跳过断开补丁: {exc}")
return
try:
original_finish = eventlet.wsgi.HttpProtocol.finish # type: ignore[attr-defined]
except Exception as exc: # pragma: no cover
logger.debug(f"eventlet 缺少 HttpProtocol.finish,跳过断开补丁: {exc}")
return
def _safe_finish(self, *args, **kwargs): # pragma: no cover - 运行时才会触发
try:
return original_finish(self, *args, **kwargs)
except (BrokenPipeError, ConnectionResetError, ConnectionAbortedError) as exc:
try:
environ = getattr(self, 'environ', {}) or {}
method = environ.get('REQUEST_METHOD', '')
path = environ.get('PATH_INFO', '')
logger.warning(f"客户端已主动断开,忽略异常: {method} {path} ({exc})")
except Exception:
logger.warning(f"客户端已主动断开,忽略异常: {exc}")
return
eventlet.wsgi.HttpProtocol.finish = _safe_finish # type: ignore[attr-defined]
logger.info("已对 eventlet 连接中断进行安全防护")
_patch_eventlet_disconnect_logging()
# 注册ReportEngine Blueprint
if REPORT_ENGINE_AVAILABLE:
app.register_blueprint(report_bp, url_prefix='/api/report')
@@ -1113,4 +1146,4 @@ if __name__ == '__main__':
logger.info("\n正在关闭应用...")
cleanup_processes()