什么"WARN无法确定响应主体的内容长度." 意思是如何摆脱它?

Nat*_*ird 320 ruby ruby-on-rails webrick

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

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

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

Lui*_*ena 229

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

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

答案是:

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

呀,没关系.需要清理它,但没有任何伤害.

  • 当这些事情被归入"没有受到伤害"的范畴时,我觉得这很烦人.事实上,成千上万的人正在浪费时间去弄清楚发生了什么,这足以引发争议. (280认同)
  • @KenThompson的问题是Webrick,而不是Rails.Webrick不支持保持连接,因此引发了我们所看到的警告/问题.建议您使用适当/更好的网络服务器(如瘦或乘客独立)用于网络.即将推出的Ruby版本将解决这个问题. (16认同)
  • fyi,如果消息打扰你,作为一种解决方法,你可以使用thin(将gem添加到你的gem文件中,使用`rails server thin`启动你的服务器).(哎呀,刚刚注意到@Scott Lowe已经在上面说过了.) (9认同)
  • 我们的开发PC上的webrick服务器呈现两次相同的.js.erb文件.两次渲染问题在运行nginx的生产服务器上消失.所以在像我们这样的情况下这是一个真正的问题. (3认同)
  • 答案应该包含twitter帖子的内容而不是链接. (2认同)

jas*_*res 78

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

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
Run Code Online (Sandbox Code Playgroud)

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

.../ruby-1.9.3-p0/lib/ruby/1.9.1/webrick/httpresponse.rb
Run Code Online (Sandbox Code Playgroud)

我希望这对某人有帮助.

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


oot*_*vak 56

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

group :development do
  gem 'webrick', '~> 1.3.1'
end
Run Code Online (Sandbox Code Playgroud)

  • 是的,对我来说也是.有关其工作原理的一个线索可能在[功能#5481 Gemifying Ruby标准库](https://bugs.ruby-lang.org/issues/5481#note-1)中:"由于'假宝石',新的除非用户明确写入gem ['webrick'],否则'gem update'安装的stdlib文件会被[忽略](https://bugs.ruby-lang.org/issues/5481#note-36)." (5认同)
  • 这比"忽略它"或"补丁webrick"要好得多.谢谢! (2认同)

Cam*_*ong 54

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

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


Kje*_*ski 15

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

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

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

    ~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb
    
    Run Code Online (Sandbox Code Playgroud)
  2. 转到包含此行的行(对我而言,它实际上是第206行):

    if chunked? || @header['content-length']
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将此修补程序中的内容更改为:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
    
    Run Code Online (Sandbox Code Playgroud)
  4. 保存文件,最终重启rails服务器


Mar*_*ell 12

这个问题已经在Ruby的trunk分支中修复了,我们提交了webrick.

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

gem which webrick
Run Code Online (Sandbox Code Playgroud)

要实际编辑文件:

nano \`ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"\`/httpresponse.rb
Run Code Online (Sandbox Code Playgroud)

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


Cri*_*mbo 5

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

正如提到的若昂·苏亚雷斯Kjellski,这就是,如果你想摆脱对发展这一警告的,你正在使用JRuby你可以做什么.

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

    ~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb
    
    Run Code Online (Sandbox Code Playgroud)
  2. 转到包含此行的行(对我来说是第205行):

    if chunked? || @header['content-length']
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将此修补程序中的内容更改为:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
    
    Run Code Online (Sandbox Code Playgroud)
  4. 保存文件,最终重启rails服务器.