event_machine: properly defer body.close for async
authorEric Wong <normalperson@yhbt.net>
Wed, 5 Dec 2012 03:08:19 +0000 (5 03:08 +0000)
committerEric Wong <normalperson@yhbt.net>
Wed, 5 Dec 2012 03:10:38 +0000 (5 03:10 +0000)
Calling body.close in the normal write_response() code path
is incorrect, and only worked out of sheer luck with
Cramp and async_sinata.

This change allows stream(:keep_open) in Sinatra to work
properly.

Thanks to W. Andrew Loe III for the informative bug report
and reproducible test case.

ref: http://mid.gmane.org/CA+-9oNd1EFqsniPkkPTwu5opTCinbM7-2KHoXov7+y3LE4s4Tg@mail.gmail.com

lib/rainbows/event_machine/client.rb

index e56931f..fc0dfe3 100644 (file)
@@ -64,8 +64,11 @@ class Rainbows::EventMachine::Client < EM::Connection
     @state = :headers if alive
     if body.respond_to?(:errback) && body.respond_to?(:callback)
       @deferred = body
+      write_headers(status, headers, alive)
+      write_body_each(body)
       deferred_errback(body)
       deferred_callback(body, alive)
+      return
     elsif body.respond_to?(:to_path)
       st = File.stat(path = body.to_path)