sinatra的send_file决定使用哪种内容类型的过程是什么?

时间:2019-04-11 00:22:01

标签: http sinatra content-type sendfile

sinatra的send_file决定使用哪种内容类型的过程是什么?

例如,似乎它通过传递给send_file的文件扩展名起作用,因此,如果它是send_file blah.txt。然后,当我http://路由时,我将获得/响应头将为content-type: text/plain,因此txt文件中的所有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查看内容类型标头是什么- d。

那么,与此相关的我的问题是,是否存在sinatra的send_file函数使用的列表,该列表将文件扩展名与内容类型相关联?我希望看到那个清单。如果没有,那么它正在使用什么过程。

注意-我知道有一种方法可以传递内容类型Sinatra: How to respond with an image with headers "content-type" => "image/jpeg"   但是我在问如何/通过什么方法,当没有传入任何内容类型时,send_file确定内容类型。

1 个答案:

答案 0 :(得分:1)

This is the send_file method在Sinatra框架(当前为v2.0.5)中,请注意,如果没有设置内容类型,它将立即找出内容类型:

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

The content_type method将立即返回或移交给Rack's mime_type method的委托人mime_type(当前为v2.0.7)。这使用一个众所周知的扩展列表进行检查。

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

列表以on line 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