diff --git a/code-server-like/app/__init__.py b/code-server-like/app/__init__.py index 0fda794..4abdae6 100644 --- a/code-server-like/app/__init__.py +++ b/code-server-like/app/__init__.py @@ -14,123 +14,142 @@ try: import eventlet import traceback - # 获取当前的 hub 实例 - current_hub = hubs.get_hub() - - # 保存原始的方法 - original_handle_error = hubs.handle_error - original_trampoline = hubs.trampoline - - def custom_handle_error(context, type, value, tb): - # 捕获并打印所有 eventlet.hubs 相关错误,不再往外raise - print(f"[Eventlet Hub Error] Type: {type.__name__}, Value: {value}") - print(f"[Context] {context}") - print("[Traceback]") - traceback.print_tb(tb) - # 不再调用原始方法,直接返回,不往外传播错误 - - def custom_trampoline(fd, read=False, write=False, timeout=None, timeout_exc=None): - try: - return original_trampoline(fd, read, write, timeout, timeout_exc) - except Exception as e: - # 捕获 trampoline 方法中所有异常 - print(f"[Eventlet Trampoline Error] {type(e).__name__}: {e}") - print(f"[Params] fd: {fd}, read: {read}, write: {write}, timeout: {timeout}") - print("[Traceback]") - traceback.print_exc() - # 返回 None 继续运行,不往外传播错误 - return None - - # 替换原始方法 - hubs.handle_error = custom_handle_error - hubs.trampoline = custom_trampoline + # 只修改存在的属性,避免引用错误 + if hasattr(hubs, 'trampoline'): + # 保存原始的trampoline方法 + original_trampoline = hubs.trampoline + + def custom_trampoline(fd, read=False, write=False, timeout=None, timeout_exc=None): + try: + return original_trampoline(fd, read, write, timeout, timeout_exc) + except Exception as e: + # 捕获 trampoline 方法中所有异常 + print(f"[Eventlet Trampoline Error] {type(e).__name__}: {e}") + print(f"[Params] fd: {fd}, read: {read}, write: {write}, timeout: {timeout}") + print("[Traceback]") + traceback.print_exc() + # 返回 None 继续运行,不往外传播错误 + return None + + # 替换原始方法 + hubs.trampoline = custom_trampoline # 同样处理 greenio 模块的所有相关方法,捕获所有异常 from eventlet import greenio - # 保存原始的 greenio 方法 - original_recv_loop = greenio.base.GreenSocket._recv_loop - original_recv_into = greenio.base.GreenSocket.recv_into - original_send_loop = greenio.base.GreenSocket._send_loop - original_send = greenio.base.GreenSocket.send + # 保存并替换原始的 greenio 方法(只修改存在的方法) + if hasattr(greenio.base.GreenSocket, '_recv_loop'): + original_recv_loop = greenio.base.GreenSocket._recv_loop + + def custom_recv_loop(self, recv_func, recv_args, *args, **kwargs): + try: + return original_recv_loop(self, recv_func, recv_args, *args, **kwargs) + except Exception as e: + # 捕获所有 IO 操作异常 + print(f"[Eventlet IO Error] _recv_loop: {type(e).__name__}: {e}") + print("[Traceback]") + traceback.print_exc() + # 返回空字节串继续运行 + return b'' + + greenio.base.GreenSocket._recv_loop = custom_recv_loop - def safe_io_operation(io_func, *args, **kwargs): - """安全执行 IO 操作,捕获所有异常""" - try: - return io_func(*args, **kwargs) - except Exception as e: - # 捕获所有 IO 操作异常 - print(f"[Eventlet IO Error] {io_func.__name__}: {type(e).__name__}: {e}") - print("[Traceback]") - traceback.print_exc() - # 根据操作类型返回适当的默认值 - if 'recv' in io_func.__name__ or 'read' in io_func.__name__: - return b'' if 'recv' in io_func.__name__ else '' - elif 'send' in io_func.__name__ or 'write' in io_func.__name__: + if hasattr(greenio.base.GreenSocket, 'recv_into'): + original_recv_into = greenio.base.GreenSocket.recv_into + + def custom_recv_into(self, buffer, nbytes=0, flags=0): + try: + return original_recv_into(self, buffer, nbytes, flags) + except Exception as e: + # 捕获所有 IO 操作异常 + print(f"[Eventlet IO Error] recv_into: {type(e).__name__}: {e}") + print("[Traceback]") + traceback.print_exc() + # 返回 0 继续运行 return 0 - return None + + greenio.base.GreenSocket.recv_into = custom_recv_into - def custom_recv_loop(self, recv_func, recv_args, *args, **kwargs): - return safe_io_operation(original_recv_loop, self, recv_func, recv_args, *args, **kwargs) + if hasattr(greenio.base.GreenSocket, '_send_loop'): + original_send_loop = greenio.base.GreenSocket._send_loop + + def custom_send_loop(self, send_func, data, *args, **kwargs): + try: + return original_send_loop(self, send_func, data, *args, **kwargs) + except Exception as e: + # 捕获所有 IO 操作异常 + print(f"[Eventlet IO Error] _send_loop: {type(e).__name__}: {e}") + print("[Traceback]") + traceback.print_exc() + # 返回 0 继续运行 + return 0 + + greenio.base.GreenSocket._send_loop = custom_send_loop - def custom_recv_into(self, buffer, nbytes=0, flags=0): - return safe_io_operation(original_recv_into, self, buffer, nbytes, flags) - - def custom_send_loop(self, send_func, data, *args, **kwargs): - return safe_io_operation(original_send_loop, self, send_func, data, *args, **kwargs) - - def custom_send(self, data, flags=0): - return safe_io_operation(original_send, self, data, flags) - - # 替换 greenio 方法 - greenio.base.GreenSocket._recv_loop = custom_recv_loop - greenio.base.GreenSocket.recv_into = custom_recv_into - greenio.base.GreenSocket._send_loop = custom_send_loop - greenio.base.GreenSocket.send = custom_send + if hasattr(greenio.base.GreenSocket, 'send'): + original_send = greenio.base.GreenSocket.send + + def custom_send(self, data, flags=0): + try: + return original_send(self, data, flags) + except Exception as e: + # 捕获所有 IO 操作异常 + print(f"[Eventlet IO Error] send: {type(e).__name__}: {e}") + print("[Traceback]") + traceback.print_exc() + # 返回 0 继续运行 + return 0 + + greenio.base.GreenSocket.send = custom_send # 处理 WSGI 中的所有错误 try: import eventlet.wsgi - original_wsgi_handle_one_request = eventlet.wsgi.HttpProtocol.handle_one_request - original_wsgi_handle_one_response = eventlet.wsgi.HttpProtocol.handle_one_response - def custom_wsgi_handle_one_request(self): - try: - return original_wsgi_handle_one_request(self) - except Exception as e: - # 捕获 WSGI 请求处理中的所有异常 - print(f"[Eventlet WSGI Request Error] {type(e).__name__}: {e}") - print("[Traceback]") - traceback.print_exc() - # 清理连接状态并返回,不往外传播错误 + if hasattr(eventlet.wsgi.HttpProtocol, 'handle_one_request'): + original_wsgi_handle_one_request = eventlet.wsgi.HttpProtocol.handle_one_request + + def custom_wsgi_handle_one_request(self): try: - self.finish() - except Exception: - pass - return + return original_wsgi_handle_one_request(self) + except Exception as e: + # 捕获 WSGI 请求处理中的所有异常 + print(f"[Eventlet WSGI Request Error] {type(e).__name__}: {e}") + print("[Traceback]") + traceback.print_exc() + # 清理连接状态并返回,不往外传播错误 + try: + self.finish() + except Exception: + pass + return + + eventlet.wsgi.HttpProtocol.handle_one_request = custom_wsgi_handle_one_request - def custom_wsgi_handle_one_response(self): - try: - return original_wsgi_handle_one_response(self) - except Exception as e: - # 捕获 WSGI 响应处理中的所有异常 - print(f"[Eventlet WSGI Response Error] {type(e).__name__}: {e}") - print("[Traceback]") - traceback.print_exc() - # 清理连接状态并返回,不往外传播错误 + if hasattr(eventlet.wsgi.HttpProtocol, 'handle_one_response'): + original_wsgi_handle_one_response = eventlet.wsgi.HttpProtocol.handle_one_response + + def custom_wsgi_handle_one_response(self): try: - self.finish() - except Exception: - pass - return - - eventlet.wsgi.HttpProtocol.handle_one_request = custom_wsgi_handle_one_request - eventlet.wsgi.HttpProtocol.handle_one_response = custom_wsgi_handle_one_response + return original_wsgi_handle_one_response(self) + except Exception as e: + # 捕获 WSGI 响应处理中的所有异常 + print(f"[Eventlet WSGI Response Error] {type(e).__name__}: {e}") + print("[Traceback]") + traceback.print_exc() + # 清理连接状态并返回,不往外传播错误 + try: + self.finish() + except Exception: + pass + return + + eventlet.wsgi.HttpProtocol.handle_one_response = custom_wsgi_handle_one_response except Exception as e: # 如果修改失败,忽略错误 print(f"[WSGI Patch Error] {e}") - print("[Eventlet Error Handling] All eventlet.hubs errors will be caught and printed, not raised") + print("[Eventlet Error Handling] Eventlet errors will be caught and printed, not raised") except Exception as e: # 如果修改失败,打印错误但继续运行 print(f"[Eventlet Patch Initialization Error] {e}")