我有一个http服务器,它使用一个与此类似逻辑的句柄:
MyHTTPHandler(http.server.BaseHTTPRequestHandler):
def do_PUT(self):
content_length = int(self.headers.get('Content-Length', 0))
if content_length:
body = self.rfile.read(content_length)
if not body:
# socket is closed
return
# save body
但是当服务器运行时,它总是崩溃:
File "/usr/local/lib/python3.5/http/server.py", line 524, in end_headers
self.flush_headers()
File "/usr/local/lib/python3.5/http/server.py", line 528, in flush_headers
self.wfile.write(b"".join(self._headers_buffer))
File "/usr/local/lib/python3.5/socket.py", line 593, in write
return self._sock.send(b)
BrokenPipeError: [Errno 32] Broken pipe
当我没有收到任何遗体后返回。
我理解错误可能是因为处理程序试图将响应写入已关闭的套接字但我无法将手指放在可以捕获它的位置以防止服务器崩溃并且关闭服务器端的连接
答案 0 :(得分:0)
堆栈跟踪指向end_headers()
方法,而不是您自己的代码。所以你可以尝试的是这样的:
def end_headers(self):
try:
super().end_headers()
except BrokenPipeError as e:
pass # insert cleanup here