python http处理程序破坏管道异常

时间:2017-01-03 15:39:55

标签: python-3.5

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

当我没有收到任何遗体后返回。

我理解错误可能是因为处理程序试图将响应写入已关闭的套接字但我无法将手指放在可以捕获它的位置以防止服务器崩溃并且关闭服务器端的连接

1 个答案:

答案 0 :(得分:0)

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

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