класс ActionDispatch::FileHandler
Этот мидлвар возвращает содержимое файла из каталога в ответ. При инициализации он может принимать необязательные HTTP-заголовки, которые будут установлены при передаче ответа, содержащего содержимое файла.
Этот мидлвар будет отображать файл, указанный в `env`, где базовый путь находится в каталоге root. Например, если root установлен на `public/`, то запрос с `env` `assets/application.js` вернёт ответ с содержимым файла, расположенного по адресу `public/assets/application.js`, если файл существует. Если файла не существует, будет возвращён ответ 404 «Файл не найден».
Публичные методы класса
# File actionpack/lib/action_dispatch/middleware/static.rb, line 16
def initialize(root, index: "index", headers: {})
@root = root.chomp("/")
@file_server = ::Rack::File.new(@root, headers)
@index = index
end Публичные методы экземпляра
# File actionpack/lib/action_dispatch/middleware/static.rb, line 48 def call(env) serve(Rack::Request.new(env)) end
# File actionpack/lib/action_dispatch/middleware/static.rb, line 28
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.force_encoding(Encoding::UTF_8))
begin
File.file?(path) && File.readable?(path)
rescue SystemCallError
false
end
}
return ::Rack::Utils.escape_path(match)
end
end Принимает путь к файлу. Если файл найден, имеет допустимое кодирование и имеет правильные права доступа для чтения, возвращаемое значение — URI-закодированная строка, представляющая имя файла. В противном случае возвращается false.
Используется классом `Static` для проверки наличия валидного файла в каталоге `public/` сервера (см. ActionDispatch::Static#call).
# File actionpack/lib/action_dispatch/middleware/static.rb, line 52
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.