From 344f8cf1e000704d53d7841eb896d83b470d7a08 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 24 Oct 2009 22:13:23 -0700 Subject: rev/evma: move common code for event models into ev_core EventMachine and Rev models seem to be able to share a lot of common code, so lets share. We may support Packet in the future, too, and end up with a similar programming model there as well. --- lib/rainbows/event_machine.rb | 84 ++----------------------------------------- 1 file changed, 3 insertions(+), 81 deletions(-) (limited to 'lib/rainbows/event_machine.rb') diff --git a/lib/rainbows/event_machine.rb b/lib/rainbows/event_machine.rb index 3a7349c..2cc0f15 100644 --- a/lib/rainbows/event_machine.rb +++ b/lib/rainbows/event_machine.rb @@ -1,5 +1,6 @@ # -*- encoding: binary -*- require 'eventmachine' +require 'rainbows/ev_core' module Rainbows @@ -26,45 +27,15 @@ module Rainbows include Base class Client < EM::Connection - include Unicorn - include Rainbows::Const + include Rainbows::EvCore G = Rainbows::G def initialize(io) @_io = io end - def post_init - @remote_addr = ::TCPSocket === @_io ? @_io.peeraddr.last : LOCALHOST - @env = {} - @hp = HttpParser.new - @state = :headers # [ :body [ :trailers ] ] :app_call :close - @buf = "" - @deferred_bodies = [] # for (fast) regular files only - end - - # graceful exit, like SIGQUIT - def quit - @deferred_bodies.clear - @state = :close - end - alias write send_data - - def handle_error(e) - quit - msg = case e - when EOFError,Errno::ECONNRESET,Errno::EPIPE,Errno::EINVAL,Errno::EBADF - ERROR_500_RESPONSE - when HttpParserError # try to tell the client they're bad - ERROR_400_RESPONSE - else - G.logger.error "Read error: #{e.inspect}" - G.logger.error e.backtrace.join("\n") - ERROR_500_RESPONSE - end - write(msg) - end + alias receive_data on_read def app_call begin @@ -108,55 +79,6 @@ module Rainbows end end - def tmpio - io = Util.tmpio - def io.size - # already sync=true at creation, so no need to flush before stat - stat.size - end - io - end - - alias on_read receive_data - - # TeeInput doesn't map too well to this right now... - def receive_data(data) - case @state - when :headers - @hp.headers(@env, @buf << data) or return - @state = :body - len = @hp.content_length - if len == 0 - @input = HttpRequest::NULL_IO - app_call # common case - else # nil or len > 0 - # since we don't do streaming input, we have no choice but - # to take over 100-continue handling from the Rack application - if @env[HTTP_EXPECT] =~ /\A100-continue\z/i - write(EXPECT_100_RESPONSE) - @env.delete(HTTP_EXPECT) - end - @input = len && len <= MAX_BODY ? StringIO.new("") : tmpio - @hp.filter_body(@buf2 = @buf.dup, @buf) - @input << @buf2 - on_read("") - end - when :body - if @hp.body_eof? - @state = :trailers - on_read(data) - elsif data.size > 0 - @hp.filter_body(@buf2, @buf << data) - @input << @buf2 - on_read("") - end - when :trailers - @hp.trailers(@env, @buf << data) and app_call - end - rescue Object => e - handle_error(e) - end - end module Server -- cgit v1.2.3-24-ge0c7