From e281b22cb2aef85b717dfe43da904a0bb4098956 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 8 Nov 2016 23:21:54 +0000 Subject: stream_file: remove #to_io support from responses This is not a part of any Rack specification, and can lead to interesting bugs with wrapped classes for gzip and TLS. AFAIK, .to_io was meant to support IO#wait_*able and IO.select methods, not to actually perform read/writes on the return value. --- lib/yahns/stream_file.rb | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) (limited to 'lib') diff --git a/lib/yahns/stream_file.rb b/lib/yahns/stream_file.rb index 19d1692..fdba5bf 100644 --- a/lib/yahns/stream_file.rb +++ b/lib/yahns/stream_file.rb @@ -11,24 +11,20 @@ class Yahns::StreamFile # :nodoc: NeedClose = Class.new(File) # :nodoc: def initialize(body, persist, offset, count) - if body.respond_to?(:to_io) - @tmpio = body.to_io + path = body.to_path + if path =~ %r{\A/dev/fd/(\d+)\z} + @tmpio = IO.for_fd($1.to_i) + @tmpio.autoclose = false else - path = body.to_path - if path =~ %r{\A/dev/fd/(\d+)\z} - @tmpio = IO.for_fd($1.to_i) - @tmpio.autoclose = false - else - retried = false - begin - @tmpio = NeedClose.open(path) - rescue Errno::EMFILE, Errno::ENFILE - raise if retried - retried = true - Thread.current[:yahns_fdmap].desperate_expire(5) - sleep(1) - retry - end + retried = false + begin + @tmpio = NeedClose.open(path) + rescue Errno::EMFILE, Errno::ENFILE + raise if retried + retried = true + Thread.current[:yahns_fdmap].desperate_expire(5) + sleep(1) + retry end end @sf_offset = offset -- cgit v1.2.3-24-ge0c7