about summary refs log tree commit homepage
path: root/lib/rainbows.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rainbows.rb')
-rw-r--r--lib/rainbows.rb15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/rainbows.rb b/lib/rainbows.rb
index e186549..5aae746 100644
--- a/lib/rainbows.rb
+++ b/lib/rainbows.rb
@@ -156,6 +156,21 @@ module Rainbows
   # :startdoc:
   autoload :Fiber, 'rainbows/fiber' # core class
 
+  # to_io is not part of the Rack spec, but make an exception here
+  # since we can conserve path lookups and file descriptors
+  # \Rainbows! will never get here without checking for the existence
+  # of body.to_path first.
+  def self.body_to_io(body)
+    if body.respond_to?(:to_io)
+      body.to_io
+    else
+      # try to take advantage of Rainbows::DevFdResponse, calling File.open
+      # is a last resort
+      path = body.to_path
+      path =~ %r{\A/dev/fd/(\d+)\z} ? IO.new($1.to_i) : File.open(path, 'rb')
+    end
+  end
+
 end
 
 # inject the Rainbows! method into Unicorn::Configurator