Skip to content
This repository
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

file 36 lines (32 sloc) 0.999 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
module Rack

  # The Rack::TryStatic middleware delegates requests to Rack::Static middleware
  # trying to match a static file
  #
  # Examples
  #
  # use Rack::TryStatic,
  # :root => "public", # static files root dir
  # :urls => %w[/], # match all requests
  # :try => ['.html', 'index.html', '/index.html'] # try these postfixes sequentially
  #
  # uses same options as Rack::Static with extra :try option which is an array
  # of postfixes to find desired file

  class TryStatic

    def initialize(app, options)
      @app = app
      @try = ['', *options[:try]]
      @static = ::Rack::Static.new(
        lambda { |_| [404, {}, []] },
        options)
    end

    def call(env)
      orig_path = env['PATH_INFO']
      found = nil
      @try.each do |path|
        resp = @static.call(env.merge!({'PATH_INFO' => orig_path + path}))
        break if 404 != resp[0] && found = resp
      end
      found or @app.call(env.merge!('PATH_INFO' => orig_path))
    end
  end
end
Something went wrong with that request. Please try again.