Python HTTP 处理程序损坏管道异常



我有一个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

当我收到任何尸体后返回时。

我知道错误可能是因为处理程序尝试对已关闭的套接字写入响应,但我无法将手指放在可以捕获此问题的位置以防止服务器崩溃并关闭服务器端的连接

堆栈跟踪指向 end_headers() 方法,而不是您自己的代码。所以你可以尝试这样的东西:

def end_headers(self):
    try:
        super().end_headers()
    except BrokenPipeError as e:
        pass # insert cleanup here

最新更新