Sinatra文件流的内容长度

时间:2013-01-18 14:59:42

标签: ruby apache sinatra passenger

我尝试在将文件流式传输到客户端之前设置Content-Length标头。我设置它:

response.headers['Content-Length'] = "12341234"

然后我做了类似的事情:

steam do |out|
   file_chunks.each do |chunk|
     out << chunk
   end
   out.close
end

但是,当我尝试在浏览器中关闭文件时,Content-Length标头为空。有谁知道这是Sinatra问题还是Passenger / Apache问题?

我假设发生的事情是这个代码块之间的某个层,当响应实际发送时,它看到它首先发送头并且数据块是空的,所以它假设内容长度为0,即使我设置它明确。

还有另一种方法可以告诉浏览器我发送的文件有多大吗?

修改

看起来是乘客问题而不是Sinatra问题。如果我使用thin运行服务器,则正确传递Content-Length。我想这个问题会改变,如果已经设置了Content-Length会不会改变它?

2 个答案:

答案 0 :(得分:0)

这是一个Sinatra问题。其流API仅支持基于EventMachine的服务器。换句话说,API仅支持Thin。使用Passenger时,您应该绕过Sinatra流API,并且应该使用Phusion Passenger支持的the Rack socket hijacking API直接传输HTTP响应。 Here is an example演示如何使用机架套接字劫持API在Phusion Passenger上流式传输服务器发送事件。

答案 1 :(得分:0)

这里的问题是当使用Transfer-Encoding:chunked时,省略Content-Length标头。

请参阅:http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.4.4