sendfile.rb

Path: lib/rainbows/sendfile.rb
Last Update: Sat Feb 23 07:12:54 +0000 2019

This middleware handles X-\Sendfile headers generated by applications or middlewares down the stack. It should be placed at the top (outermost layer) of the middleware stack to avoid having its to_path method clobbered by another middleware.

This converts X-\Sendfile responses to bodies which respond to the to_path method which allows certain concurrency models to serve efficiently using sendfile() or similar. With multithreaded models under Ruby 1.9, IO.copy_stream will be used.

This middleware is the opposite of Rack::Sendfile as it reverses the effect of Rack:::Sendfile. Unlike many Ruby web servers, some configurations of \Rainbows! are capable of serving static files efficiently.

Compatibility (via IO.copy_stream in Ruby 1.9):

  • ThreadSpawn
  • ThreadPool
  • WriterThreadPool
  • WriterThreadSpawn

Compatibility (Ruby 1.8 and 1.9)

  • EventMachine
  • NeverBlock (using EventMachine)

DO NOT use this middleware if you‘re proxying to \Rainbows! with a server that understands X-\Sendfile (e.g. Apache, Lighttpd) natively.

This does NOT understand X-Accel-Redirect headers intended for nginx. X-Accel-Redirect requires the application to be highly coupled with the corresponding nginx configuration, and is thus too complicated to be worth supporting.

Example config.ru:

   use Rainbows::Sendfile
   run lambda { |env|
     path = "#{Dir.pwd}/random_blob"
     [ 200,
       {
         'X-Sendfile' => path,
         'Content-Type' => 'application/octet-stream'
       },
       []
     ]
   }

[Validate]