Class | Rainbows::Sendfile |
In: |
lib/rainbows/sendfile.rb
lib/rainbows/sendfile.rb |
Parent: | Struct.new(:app) |
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.
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' }, [] ] }