使用Rack / Sinatra覆盖Content-Length标头

时间:2014-06-05 11:59:30

标签: sinatra rack

在Sinatra中,我如何覆盖响应中的Content-Length标题以设置我自己的值?

my方法的最后一行返回以下内容:

[200, {'Content-Type' => component.content_type,
'Content-Length' => component.content_length.to_s}, component.content.data]

这样我希望覆盖内容值,但会导致异常:

Unexpected error while processing request: Content-Length header was 2, but should be 0

我想为内容长度返回不同的值。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

Rack::Lint middleware引发了此错误,因此快速解决方法是不使用该中间件。根据您启动应用程序的方式可能会很棘手 - 如果您使用rackup,Rack会在某些情况下添加它。

更好的解决方案是将您的客户更改为使用HTTP HEAD request而不是GET。在Sinatra defining a GET route automatically defines a matching HEAD route。使用HEAD将导致服务器发送标题但不发送正文,您应该能够将Content-Length设置为您想要的任何内容。它还可以避免Rack::Lint错误。

以下是解释如何禁用Rack::Lint

的要点
module Rack
  class Lint
    def call(env = nil)
      @app.call(env)
    end
  end
end

(取自https://gist.github.com/shtirlic/2146256)。