lib/reel/server.rb in reel-0.5.0 vs lib/reel/server.rb in reel-0.6.0.pre1

- old
+ new

@@ -1,17 +1,17 @@ module Reel # Base class for Reel servers. # # This class is a Celluloid::IO actor which provides a barebones server - # which does not open a socket itself, it just begin handling connections once - # initialized with a specific kind of protocol-based server. + # which does not open a socket itself, it just begin handling connections + # once initialized with a specific kind of protocol-based server. # For specific protocol support, use: # Reel::Server::HTTP # Reel::Server::HTTPS - # Coming soon: Reel::Server::UNIX + # Reel::Server::UNIX ( not on jRuby yet ) class Server include Celluloid::IO # How many connections to backlog in the TCP accept queue DEFAULT_BACKLOG = 100 @@ -23,26 +23,37 @@ @spy = STDOUT if options[:spy] @options = options @callback = callback @server = server + @options[:rescue] ||= [] + @options[:rescue] += [ + Errno::ECONNRESET, + Errno::EPIPE, + Errno::EINPROGRESS, + Errno::ETIMEDOUT, + Errno::EHOSTUNREACH + ] + @server.listen(options.fetch(:backlog, DEFAULT_BACKLOG)) async.run end def shutdown @server.close if @server end def run - loop { async.handle_connection @server.accept } - end - - def optimize(socket) - if socket.is_a? TCPSocket - socket.setsockopt(Socket::IPPROTO_TCP, :TCP_NODELAY, 1) - end + loop { + begin + socket = @server.accept + rescue *@options[:rescue] => ex + Logger.warn "Error accepting socket: #{ex.class}: #{ex.to_s}" + next + end + async.handle_connection socket + } end def handle_connection(socket) if @spy require 'reel/spy'