epoll/client: factor out on_close method
[rainbows.git] / lib / rainbows / error.rb
blob98de6baaae6c1621068e93fd4ffdf8fdb559190b
1 # -*- encoding: binary -*-
2 # :enddoc:
3 module Rainbows::Error
5   # if we get any error, try to write something back to the client
6   # assuming we haven't closed the socket, but don't get hung up
7   # if the socket is already closed or broken.  We'll always ensure
8   # the socket is closed at the end of this function
9   def self.write(io, e)
10     if msg = response(e)
11       if io.respond_to?(:kgio_trywrite)
12         io.kgio_trywrite(msg)
13       else
14         io.write_nonblock(msg)
15       end
16     end
17     rescue
18   end
20   def self.app(e)
21     Rainbows.server.logger.error "app error: #{e.inspect}"
22     Rainbows.server.logger.error e.backtrace.join("\n")
23     rescue
24   end
26   def self.listen_loop(e)
27     Rainbows.alive or return
28     Rainbows.server.logger.error "listen loop error: #{e.inspect}."
29     Rainbows.server.logger.error e.backtrace.join("\n")
30     rescue
31   end
33   def self.response(e)
34     case e
35     when EOFError, Errno::ECONNRESET, Errno::EPIPE, Errno::EINVAL,
36          Errno::EBADF, Errno::ENOTCONN
37       # swallow error if client shuts down one end or disconnects
38     when Unicorn::HttpParserError
39       Rainbows::Const::ERROR_400_RESPONSE # try to tell the client they're bad
40     when IOError # HttpParserError is an IOError
41     else
42       app(e)
43       Rainbows::Const::ERROR_500_RESPONSE
44     end
45   end
46 end