класс ActionDispatch::FileHandler
Этот мидлварь возвращает содержимое файла с диска в теле ответа. При инициализации он может принимать необязательные HTTP-заголовки, которые будут установлены при доставке ответа, содержащего содержимое файла.
Этот мидлварь отобразит файл, указанный в env["PATH_INFO"], где базовый путь находится в каталоге root. Например, если root установлено в public/, то запрос с env["PATH_INFO"] равным assets/application.js вернёт ответ с содержимым файла, расположенного по адресу public/assets/application.js, если файл существует. Если файл не существует, будет возвращён ответ 404 «Файл не найден».
Публичные Классовые Методы
# File actionpack/lib/action_dispatch/middleware/static.rb, line 18
def initialize(root, index: "index", headers: {})
@root = root.chomp("/").b
@file_server = ::Rack::File.new(@root, headers)
@index = index
end Публичные Методы Экземпляров
# File actionpack/lib/action_dispatch/middleware/static.rb, line 50 def call(env) serve(Rack::Request.new(env)) end
# File actionpack/lib/action_dispatch/middleware/static.rb, line 30
def match?(path)
path = ::Rack::Utils.unescape_path path
return false unless ::Rack::Utils.valid_path? path
path = ::Rack::Utils.clean_path_info path
paths = [path, "#{path}#{ext}", "#{path}/#{@index}#{ext}"]
if match = paths.detect { |p|
path = File.join(@root, p.b)
begin
File.file?(path) && File.readable?(path)
rescue SystemCallError
false
end
}
return ::Rack::Utils.escape_path(match).b
end
end Принимает путь к файлу. Если файл найден, имеет допустимое кодирование и имеет правильные разрешения на чтение, возвращаемое значение — URI-закодированная строка, представляющая имя файла. В противном случае возвращается false.
Используется классом Static для проверки наличия допустимого файла в каталоге сервера public/ (см. ActionDispatch::Static#call).
# File actionpack/lib/action_dispatch/middleware/static.rb, line 54
def serve(request)
path = request.path_info
gzip_path = gzip_file_path(path)
if gzip_path && gzip_encoding_accepted?(request)
request.path_info = gzip_path
status, headers, body = @file_server.call(request.env)
if status == 304
return [status, headers, body]
end
headers["Content-Encoding"] = "gzip"
headers["Content-Type"] = content_type(path)
else
status, headers, body = @file_server.call(request.env)
end
headers["Vary"] = "Accept-Encoding" if gzip_path
return [status, headers, body]
ensure
request.path_info = path
end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.