class Rack::App::FileServer

Attributes

relative_file_paths[RW]

Public Class Methods

new(root_folder, opts = {}) click to toggle source
# File lib/rack/app/file_server.rb, line 14
def initialize(root_folder, opts = {})
  @root_folder = root_folder
  @relative_file_paths = []
  @rack_file_server = ::Rack::File.new(@root_folder, {})

  if map_relative_file_paths?(opts)
    map_relative_paths!
  end
end
serve_file(env, file_path) click to toggle source
# File lib/rack/app/file_server.rb, line 4
def self.serve_file(env, file_path)
  dir_path = File.dirname(file_path)
  basename = File.basename(file_path)
  file_server = new(dir_path, map_relative_file_paths: false)
  env = env.dup
  env[::Rack::App::Constants::ENV::REQUEST_METHOD] = 'GET'
  env[::Rack::App::Constants::ENV::PATH_INFO] = basename
  file_server.call(env)
end

Public Instance Methods

call(env) click to toggle source
# File lib/rack/app/file_server.rb, line 24
def call(env)
  path_info = clean_path_info(env)

  @relative_file_paths.each do |relative_file_path|
    if path_info =~ /#{Regexp.escape(relative_file_path)}$/
      env[::Rack::App::Constants::ENV::PATH_INFO] = relative_file_path
      break
    end
  end

  @rack_file_server.call(env)
end

Protected Instance Methods

clean_path_info(env) click to toggle source
# File lib/rack/app/file_server.rb, line 60
def clean_path_info(env)
  path_info = ::Rack::Utils.unescape(env[::Rack::App::Constants::ENV::PATH_INFO])
  ::Rack::Utils.clean_path_info(path_info)
end
map_relative_file_paths?(opts = {}) click to toggle source
# File lib/rack/app/file_server.rb, line 39
def map_relative_file_paths?(opts = {})
  unless opts.key?(:map_relative_file_paths)
    return true
  end

  opts[:map_relative_file_paths]
end
map_relative_paths!() click to toggle source
# File lib/rack/app/file_server.rb, line 53
def map_relative_paths!
  @relative_file_paths = Dir.glob(File.join(@root_folder, '**', '*'))
                             .map { |file_path| file_path.sub(@root_folder, '') }
                             .sort_by { |str| str.length }
                             .reverse
end
opts_set_defaults(opts) click to toggle source
# File lib/rack/app/file_server.rb, line 47
def opts_set_defaults(opts)
  unless opts.key?(:map_relative_file_paths)
    opts[:map_relative_file_paths] = true
  end
end