From d5c8cc8b51619f0d33f75036c53e3936ad2749b2 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 5 Dec 2012 03:08:19 +0000 Subject: event_machine: properly defer body.close for async 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 | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib/rainbows') diff --git a/lib/rainbows/event_machine/client.rb b/lib/rainbows/event_machine/client.rb index e56931f..fc0dfe3 100644 --- a/lib/rainbows/event_machine/client.rb +++ b/lib/rainbows/event_machine/client.rb @@ -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) -- cgit v1.2.3-24-ge0c7