“WARN无法确定响应主体的内容长度”是什么意思,以及如何摆脱它?

由于升级到Rails 3.1,我在我的开发日志中看到这个警告消息:

WARN无法确定响应主体的内容长度。 设置响应的内容长度或设置Response#chunked = true

这是什么意思,我怎么能删除它? 这是个问题吗?

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

https://twitter.com/#!/luislavena/status/108998968859566080

答案是:

https://twitter.com/#!/tenderlove/status/108999110136303617

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

下面的补丁解决了的问题 ; 没有更多的警告给我。

204_304_keep_alive.patch

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

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

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

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

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

我希望这可以帮助某人。

编辑:这是提交的链接 ,改变ruby项目的树干分支中的问题线。

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

那么rails s thin会变瘦,警告就会消失。

只是明确地将Gem添加到Gemfile中,为我摆脱了警告信息:

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

如果您使用的是.rvm,请修复它。

正如JoãoSoares所提到的那样,所有的信用都归功于他,如果你不想在发展中摆脱这个警告,那么这就是你所能做的。

  1. 使用你最喜欢的编辑器来打开这个文件:

     ~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb 
  2. 去包含这一行(对我来说,这是真的线206):

     if chunked? || @header['content-length'] 
  3. 把它从这个补丁里改成这个:

     if chunked? || @header['content-length'] || @status == 304 || @status == 204 
  4. 保存文件,并最终重新启动您的导轨服务器

这个问题已经在Ruby的trunk分支中解决了,这个提交给webrick。

你可以在你的设置中编辑这个特别的webrick文件。 大概的位置可以通过以下方式find:

 gem which webrick 

要实际编辑文件:

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

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

JRuby版本:如果您使用的是.rvm,请修复它。

正如JoãoSoaresKjellski所提到的,如果您想要摆脱开发中的这个警告并且使用JRuby,就可以做到这一点。

  1. 使用你最喜欢的编辑器来打开这个文件:

     ~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb 
  2. 去包含这一行(对我来说,这是行205):

     if chunked? || @header['content-length'] 
  3. 把它从这个补丁里改成这个:

     if chunked? || @header['content-length'] || @status == 304 || @status == 204 
  4. 保存文件,并最终重新启动您的导轨服务器。

另一个解决方法,从webrick中删除违规行。 这不是很有用:

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

(你可能需要sudo

 config.middleware.use Rack::ContentLength 

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