From 9c8372c3a4972cacf0eb15ad85d34cb33293672e Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 19 Jul 2010 10:10:08 +0000 Subject: ensure client aborted file/stream response bodies are closed We need to remember to close response bodies even if a client aborts the connection, since body.close can trigger interesting things like logging and such... --- lib/rainbows/event_machine.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'lib/rainbows/event_machine.rb') diff --git a/lib/rainbows/event_machine.rb b/lib/rainbows/event_machine.rb index 3094284..8de02ea 100644 --- a/lib/rainbows/event_machine.rb +++ b/lib/rainbows/event_machine.rb @@ -119,14 +119,15 @@ module Rainbows st = io.stat if st.file? - write(response_header(status, headers)) if headers - io.close - @body = stream = stream_file_data(body.to_path) - stream.callback do + cb = lambda do body.close if body.respond_to?(:close) quit unless alive end - return + write(response_header(status, headers)) if headers + io.close + @body = stream = stream_file_data(body.to_path) + stream.errback(&cb) + return stream.callback(&cb) elsif st.socket? || st.pipe? chunk = stream_response_headers(status, headers) if headers m = chunk ? ResponseChunkPipe : ResponsePipe -- cgit v1.2.3-24-ge0c7