about summary refs log tree commit homepage
path: root/lib/rainbows/event_machine/response.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rainbows/event_machine/response.rb')
-rw-r--r--lib/rainbows/event_machine/response.rb44
1 files changed, 31 insertions, 13 deletions
diff --git a/lib/rainbows/event_machine/response.rb b/lib/rainbows/event_machine/response.rb
index 49bcbd5..7b88261 100644
--- a/lib/rainbows/event_machine/response.rb
+++ b/lib/rainbows/event_machine/response.rb
@@ -1,27 +1,35 @@
 # -*- encoding: binary -*-
 # :enddoc:
 module Rainbows::EventMachine::Response
+  def deferred_errback(orig_body)
+    @body.errback do
+      orig_body.close if orig_body.respond_to?(:close)
+      quit
+    end
+  end
+
+  def deferred_callback(orig_body, alive)
+    @body.callback do
+      orig_body.close if orig_body.respond_to?(:close)
+      @body = nil
+      alive ? receive_data(nil) : quit
+    end
+  end
+
   def write_response(status, headers, body, alive)
+    @state = :headers if alive
     if body.respond_to?(:errback) && body.respond_to?(:callback)
       @body = body
-      body.callback { quit }
-      body.errback { quit }
-      alive = true
+      deferred_errback(body)
+      deferred_callback(body, alive)
     elsif body.respond_to?(:to_path)
       st = File.stat(path = body.to_path)
 
       if st.file?
         write_headers(status, headers, alive)
         @body = stream_file_data(path)
-        @body.errback do
-          body.close if body.respond_to?(:close)
-          quit
-        end
-        @body.callback do
-          body.close if body.respond_to?(:close)
-          @body = nil
-          alive ? receive_data(nil) : quit
-        end
+        deferred_errback(body)
+        deferred_callback(body, alive)
         return
       elsif st.socket? || st.pipe?
         io = body_to_io(@body = body)
@@ -33,6 +41,16 @@ module Rainbows::EventMachine::Response
       # char or block device... WTF? fall through to body.each
     end
     super(status, headers, body, alive)
-    quit unless alive
+    if alive
+      if @body.nil?
+        if @buf.empty?
+          set_comm_inactivity_timeout(Rainbows.keepalive_timeout)
+        else
+          EM.next_tick { receive_data(nil) }
+        end
+      end
+    else
+      quit unless @body
+    end
   end
 end