From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS201848 85.143.208.0/20 X-Spam-Status: No, score=-3.1 required=3.0 tests=AWL,BAYES_00, RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_ZBI,RCVD_IN_XBL,SPF_FAIL,SPF_HELO_FAIL shortcircuit=no autolearn=no autolearn_force=no version=3.4.0 Received: from 80x24.org (tor-exit.demfloro.ru [85.143.219.211]) by dcvr.yhbt.net (Postfix) with ESMTP id 9BA7F2022C for ; Tue, 8 Nov 2016 23:21:57 +0000 (UTC) From: Eric Wong To: yahns-public@yhbt.net Subject: [PATCH] stream_file: remove #to_io support from responses Date: Tue, 8 Nov 2016 23:21:54 +0000 Message-Id: <20161108232154.21793-1-e@80x24.org> List-Id: 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(-) 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 -- EW