Каков процесс отправки sendat-файла в sinatra, какой тип контента использовать? - PullRequest
0 голосов
/ 11 апреля 2019

Каков процесс отправки sendat-файла в sinatra, какой тип контента использовать?

Например, кажется, что он работает по расширению файла, переданного в send_file, так что если это send_file blah.txt. затем, когда я http для маршрута, я получу / заголовок ответа будет 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, и браузер не будет отображать отправленный html и будет отображать его в виде простого текста. Возможно, я ошибаюсь, но, похоже, именно это показывают мои быстрые тесты. Где я пробовал разные маршруты, разные расширения имени файла (.txt и .html), иногда файлы с html в них, иногда нет, видя, отображает ли браузер html или нет, и просматривая заголовок типа контента, с помощью wget - д.

Итак, мой вопрос, связанный с этим: есть ли список, который использует функция send_file в sinatra, который связывает расширение файла с типом контента? Я хотел бы увидеть этот список. А если нет, то каков процесс, который он использует.

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

1 Ответ

1 голос
/ 11 апреля 2019

Это 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, который является делегатом Rack's mime_type метода (в настоящее время v2.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.

...