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