diff options
author | Eric Wong <e@80x24.org> | 2016-11-08 23:21:54 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2016-11-08 23:23:33 +0000 |
commit | e281b22cb2aef85b717dfe43da904a0bb4098956 (patch) | |
tree | 6bfc4e262c25ff09bd841387eea4866283f91804 | |
parent | 932fedb229889a82023ff4f3cad9e8e482ee4041 (diff) | |
download | yahns-e281b22cb2aef85b717dfe43da904a0bb4098956.tar.gz |
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.
-rw-r--r-- | lib/yahns/stream_file.rb | 30 |
1 files changed, 13 insertions, 17 deletions
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 |