Skip to content Skip to sidebar Skip to footer

Python Basehttpserver, How Do I Catch/trap "broken Pipe" Errors?

I build a short url translator engine in Python, and I'm seeing a TON of 'broken pipe' errors, and I'm curious how to trap it best when using the BaseHTTPServer classes. This isn't

Solution 1:

This appears to be a bug in SocketServer, see this link Python Bug: 14574

A fix (works for me in Python 2.7) is to override the SocketServer.StreamRequestHandler finish() method, something like this:

...
deffinish(self,*args,**kw):
  try:
    ifnot self.wfile.closed:
      self.wfile.flush()
      self.wfile.close()
  except socket.error:
    pass
  self.rfile.close()

  #Don't call the base class finish() method as it does the above#return SocketServer.StreamRequestHandler.finish(self)

Solution 2:

The "broken pipe" exception means that your code tried to write to a socket/pipe which the other end has closed. If the other end is a web browser, the user could have stopped the request. You can ignore the traceback; it does not indicate a serious problem. If you want to suppress the message, you can put a try ... except block around all of the code in your http_output function, and log the exception if you like.

Additionally, if you want your HTTP server to process more than one request at a time, you need your server class to use one of the SocketServer.ForkingMixIn and SocketServer.ThreadingMixIn classes. Check the documentation of the SocketServer module for details.

Add: The "connection reset by peer" exception means that your code tried to read from a dead socket. If you want to suppress the traceback, you will need to extend the BaseHTTPServer class and override the handle_one_request method to add a try ... except block. You will need a new server class anyway, to implement the earlier suggestion about processing more than one request at a time.

Solution 3:

In my application, the error didn't occur in finish(), it occurred in handle(). This fix catches the broken pipe errors:

classMyHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

    ...

    defhandle(self):
        try:
            BaseHTTPServer.BaseHTTPRequestHandler.handle(self)
        except socket.error:
            pass

Post a Comment for "Python Basehttpserver, How Do I Catch/trap "broken Pipe" Errors?"