添加了对 errno 88 (Socket operation on non-socket)的处理

This commit is contained in:
CakeCN
2026-01-07 18:52:17 +08:00
parent 9231c14013
commit f818d84208

View File

@@ -48,17 +48,47 @@ try:
# 同样处理 greenio 模块的错误 # 同样处理 greenio 模块的错误
from eventlet import greenio from eventlet import greenio
original_recv_loop = greenio.base.GreenSocket._recv_loop original_recv_loop = greenio.base.GreenSocket._recv_loop
original_recv_into = greenio.base.GreenSocket.recv_into
def custom_recv_loop(self, recv_func, recv_args, *args, **kwargs): def custom_recv_loop(self, recv_func, recv_args, *args, **kwargs):
try: try:
return original_recv_loop(self, recv_func, recv_args, *args, **kwargs) return original_recv_loop(self, recv_func, recv_args, *args, **kwargs)
except (hubs.IOClosed, EOFError, OSError) as e: except (hubs.IOClosed, EOFError, OSError) as e:
# 优雅处理 IO 错误 # 优雅处理 IO 错误
if hasattr(e, 'errno') and e.errno in (9, 107): # Bad file descriptor or Operation on closed file if hasattr(e, 'errno') and e.errno in (9, 88, 107): # Bad file descriptor, Socket operation on non-socket, Operation on closed file
return b'' return b''
raise raise
def custom_recv_into(self, buffer, nbytes=0, flags=0):
try:
return original_recv_into(self, buffer, nbytes, flags)
except OSError as e:
if hasattr(e, 'errno') and e.errno in (9, 88, 107): # Bad file descriptor, Socket operation on non-socket, Operation on closed file
return 0
raise
greenio.base.GreenSocket._recv_loop = custom_recv_loop greenio.base.GreenSocket._recv_loop = custom_recv_loop
greenio.base.GreenSocket.recv_into = custom_recv_into
# 处理 WSGI 中的 readline 错误
try:
import eventlet.wsgi
original_wsgi_handle_one_request = eventlet.wsgi.HttpProtocol.handle_one_request
def custom_wsgi_handle_one_request(self):
try:
return original_wsgi_handle_one_request(self)
except OSError as e:
if hasattr(e, 'errno') and e.errno in (9, 88, 107): # Bad file descriptor, Socket operation on non-socket, Operation on closed file
# 清理连接状态
self.finish()
return
raise
eventlet.wsgi.HttpProtocol.handle_one_request = custom_wsgi_handle_one_request
except Exception as e:
# 如果修改失败,忽略错误
pass
except Exception as e: except Exception as e:
# 如果修改失败,忽略错误 # 如果修改失败,忽略错误
pass pass