提问



自从升级到Rails 3.1后,我在开发日志中看到了这条警告消息:



  警告无法确定响应正文的内容长度。设置响应的内容长度或设置Response#chunked = true



这是什么意思,我该如何删除它?这是个问题吗?

最佳参考


向Rails-Core的一位成员提出同样的问题:


https://twitter.com/luislavena/status/108998968859566080[21]


答案是:


https://twitter.com/tenderlove/status/108999110136303617[22]



  呀,很好。需要清理它,但没有任何伤害。


其它参考1


以下补丁解决了我的问题;没有警告我。


204_304_keep_alive.patch [23]


只需在第205行编辑文件httpresponse.rb,如上面的链接所示;事实上,该链接显示了对未来Ruby版本的修正。


我在ruby 1.9.3-p0上使用rails 3.2.0作为单个用户通过RVM安装。所以在我的情况下的位置是:


~/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpresponse.rb


要更改的文件的位置根据安装类型,RVM与否,甚至是多用户或单用户而有所不同,所以我只是给它的最后一部分:


.../ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpresponse.rb


我希望这可以对某人有所帮助。


编辑:这是在ruby项目的trunk分支中改变了有问题的行的提交的链接。[24]

其它参考2


只是明确地将Gem添加到Gemfile中就可以为我删除警告消息:


group :development do
  gem 'webrick', '~> 1.3.1'
end

其它参考3


您也可以使用Thin而不是默认的Webrick。
将其添加到Gemfile
gem 'thin'


然后rails s thin将使用thin,警告将消失。

其它参考4


如果您正在使用.rvm,请执行此操作以修复它...


正如JoãoSoares所提到的那样,如果你不想在发展中摆脱这个警告,那么你就可以做到这一点。



  1. 使用您喜欢的编辑器打开此文件:


    ~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb
    

  2. 转到包含此内容的行(对我而言,它确实是第206行):


    if chunked? || @header['content-length']
    

  3. 将此修补程序中的内容更改为:[25]


    if chunked? || @header['content-length'] || @status == 304 || @status == 204
    

  4. 保存文件并最终重启rails服务器


其它参考5


这个问题已经在Ruby的主干分支中修复了,这个提交给webrick。[26]


您可以在设置中类似地编辑此特定webrick文件。大致的位置可以通过以下方式找到:


gem which webrick


要实际编辑文件:


nano \`ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"\`/httpresponse.rb


(或者代替nano,使用您最喜欢的编辑器。)

其它参考6


JRuby版本:如果您正在使用.rvm,请执行此操作以修复它...


正如JoãoSoares和 Kjellski 所提到的,如果您想要在开发中消除此警告并使用JRuby,则可以执行此操作。



  1. 使用您喜欢的编辑器打开此文件:


    ~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb
    

  2. 转到包含此内容的行(对我来说是第205行):


    if chunked? || @header['content-length']
    

  3. 将此修补程序中的内容更改为:[27]


    if chunked? || @header['content-length'] || @status == 304 || @status == 204
    

  4. 保存文件并最终重启rails服务器。


其它参考7


从webrick中删除违规行的另一种解决方法。它没那么有用:


cd `which ruby`/../../lib/ruby/1.9.1/webrick/ && sed -i '.bak' -e'/logger.warn/d' httpresponse.rb


(你可能需要sudo)

其它参考8





config.middleware.use Rack::ContentLength


到你的application.rb文件,即使是webrick,警告也会消失。在渲染json或文本响应时,这也将在生产中正确设置Content-Length