【问题标题】:Content-Length for Sinatra file steamingSinatra 文件流的内容长度
【发布时间】:2013-01-02 07:42:38
【问题描述】:

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

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

然后我会做类似的事情:

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

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

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

还有其他方法可以告诉浏览器我发送的文件有多大?

编辑

看起来是乘客问题而不是 Sinatra 问题。如果我以薄的方式运行服务器,则 Content-Length 将正确传递。如果已经设置,我猜问题会更改为不更改 Content-Length?

【问题讨论】:

  • 你不应该用request['content-length']来设置它。响应是您从请求中得到的结果。

标签: ruby apache sinatra passenger


【解决方案1】:

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

见:http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.4.4

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-09-19
      • 1970-01-01
      • 2012-01-26
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多