Каков процесс, с помощью которого send_file Sinatra решает, какой тип контента использовать?

Каков процесс, с помощью которого send_file Sinatra решает, какой тип контента использовать?

Например, кажется, что это работает по расширению файла, переданного в send_file, поэтому, если это send_file blah.txt. затем, когда я перейду по маршруту, я получу / заголовок ответа будет content-type: text/plain, поэтому любой html в текстовом файле будет интерпретироваться веб-браузером как обычный текст. Принимая во внимание, что если это файл blah.html, то сервер ответит content-type: text/html (и любой html в файле будет отображаться как таковой)

И, конечно же, имя маршрута не имеет значения, поэтому вы можете перейти к http://127.0.0.1:4567/zzz.html, и это может привести к send_file. a.txt и a.txt могут содержать теги html, но, поскольку это файл .txt, send_file заставит Sinatra ответить content-type: text/plain, и браузер не будет t отображать любой отправленный html и отображать его как обычный текст. Я могу ошибаться, но мои быстрые тесты показывают именно это. Где я пробовал разные маршруты, разные расширения имен файлов (.txt и .html), иногда файлы с html в них, иногда нет, смотря, отображает ли браузер html или нет, и видя заголовок типа содержимого, с помощью wget - д.

Итак, мой вопрос, связанный с этим, заключается в том, существует ли список, который использует функция send_file Sinatra, который связывает расширение файла с типом содержимого? Я хотел бы увидеть этот список. И если нет, то какой процесс он использует.

Примечание. Я понимаю, что есть способ передать тип содержимого Sinatra: Как ответить изображением с заголовками content-type =› image/jpeg, но я спрашиваю, как/каким методом send_file определяет тип содержимого при отсутствии содержимого -type передается.


person barlop    schedule 11.04.2019    source источник


Ответы (1)


Это send_file метод в фреймворк Sinatra (в настоящее время v2.0.5), обратите внимание, что он сразу же отключает определение типа контента, если он не был установлен:

if opts[:type] or not response['Content-Type']
  content_type opts[:type] || File.extname(path), :default => 'application/octet-stream'
end

Метод content_type либо возвращает немедленно или передать mime_type, который является делегатом Метод mime_type Rack (сейчас версия 2.0.7). При этом используется хорошо известный список расширений для проверки.

def mime_type(ext, fallback='application/octet-stream')
  MIME_TYPES.fetch(ext.to_s.downcase, fallback)
end

Список начинается с строки 49. :

MIME_TYPES = {
  ".123"       => "application/vnd.lotus-1-2-3",
  ".3dml"      => "text/vnd.in3d.3dml",
  ".3g2"       => "video/3gpp2",
  ".3gp" => "video/3gpp",
  # <snip>

Как видно из фрагмента content_type, по умолчанию он возвращается к application/octet-stream.

person iain    schedule 11.04.2019