“警告无法确定响应正文的内容长度”是啥意思。意思是我如何摆脱它?

Posted

技术标签:

【中文标题】“警告无法确定响应正文的内容长度”是啥意思。意思是我如何摆脱它?【英文标题】:What does "WARN Could not determine content-length of response body." mean and how to I get rid of it?“警告无法确定响应正文的内容长度”是什么意思。意思是我如何摆脱它? 【发布时间】:2011-10-28 06:47:44 【问题描述】:

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

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

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

【问题讨论】:

这里也一样,对我来说这是通过 JS 远程调用时发生的。 我今天升级到 Ruby 1.9.3 后就开始使用它。以前没见过。我认为这一定是由于 Ruby 1.9.3 中 WEBrick 的变化... 确实是WEBrick问题。同时,您可以将“瘦”gem 添加到您的 Gemfile 并使用它而不是 WEBrick 启动 Rails,例如rails s thin;达达!没有更多警告。 【参考方案1】:

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

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

答案是:

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

是的,没关系。需要清理它,但没有受到任何伤害。

【讨论】:

fyi,如果消息困扰您,作为一种解决方法,您可以使用 Thin(将 gem 'thin' 添加到您的 gemfile,使用 rails server thin 启动您的服务器)。 (哎呀,刚刚注意到@Scott Lowe 已经在上面说过了。) 当这些事情被归入“没有受到伤害”的类别时,我觉得这很烦人。数以千计的人都在浪费时间弄清楚到底发生了什么,这一事实足以反驳这一点。 @KenThompson 问题出在 Webrick,而不是 Rails。 Webrick 不支持保持连接,因此会引发我们看到的警告/问题。建议您使用适当/更好的网络服务器(如瘦或独立的乘客)进行网络。即将发布的 Ruby 版本将解决此问题。 我们开发PC上的webrick服务器两次渲染同一个.js.erb文件。两次渲染问题在我们运行 nginx 的生产服务器上消失了。所以在我们这样的案例中,这是一个真正的问题。 答案应该包含推特帖子的内容而不是链接。【参考方案2】:

添加

config.middleware.use Rack::ContentLength

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

【讨论】:

我喜欢实际解决问题的想法,而不是用保活补丁隐藏它。不幸的是,这个建议只是发出了两倍的警告。【参考方案3】:

这个问题已经在 Ruby 的主干分支中通过 commit 到 webrick 得到修复。

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

gem which webrick

实际编辑文件:

nano \`ruby -e"print %xgem which webrick.chomp %Q.rb\n"\`/httpresponse.rb

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

【讨论】:

我上面花哨的命令行(幽默地包括编辑器 nano)在 RailsRock 网站here 上被取消了署名并受版权保护。 反引号可能不应该被转义。所以它真的应该是:nano `ruby -e"print %xgem which webrick.chomp %Q.rb\n"`/httpresponse.rb.【参考方案4】:

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

正如 João SoaresKjellski 所提到的,如果您想摆脱这个关于开发的警告并且您正在使用 JRuby,那么您可以这样做。 p>

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

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

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

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

    将其从this patch更改为:

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

    保存文件并最终重新启动您的 Rails 服务器。

【讨论】:

@schwabsauce 除了第一条指令,其余的都不是 JRuby 特有的;它有助于找到文件。为了清楚起见,重复了其他说明。【参考方案5】:

只需将 Gem 显式添加到 Gemfile 即可消除警告消息:

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

【讨论】:

是的,我也是。为什么这个工作的线索可能在Feature #5481 Gemifying Ruby standard library:“因为'fake gems','gem update'安装的stdlib的新文件是ignored,除非用户明确写gem ['webrick']。” 这比“忽略它”或“修补 webrick”要好得多。谢谢!【参考方案6】:

如果您使用的是 .rvm,请执行此操作来修复它...

正如 João Soares 所提到的,所有功劳归于他,如果你不想摆脱这个关于开发的警告,你可以这样做。

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

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

    转到包含此内容的行(对我来说确实是第 206 行):

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

    将其从this patch更改为:

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

    保存文件并最终重新启动您的 Rails 服务器

【讨论】:

谢谢!对我来说是line 107【参考方案7】:

您也可以使用 Thin 代替默认的 Webrick。 将此添加到Gemfile gem 'thin'

那么rails s thin会使用thin,警告就会消失。

【讨论】:

是的。这就是我最近几个月所做的事情。 Ryan Bates 在最近的 Railscast 中也提到过。 @cam song:几乎正确:rails s thin 将使用 thin 而不是 Webrick,并且警告会消失。 我将thin 放入development 组。 Rails 4 似乎在运行 rails s 时自动拾取它【参考方案8】:

以下补丁解决了我的问题;不再向我发出警告。

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

要更改的文件的位置因安装类型、是否为 RVM、甚至是多用户或单用户而异,所以我只给出它的最后一部分:

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

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

编辑:这是 link 提交更改了 ruby​​ 项目的主干分支中的相关行。

【讨论】:

我用的是debiansqueeze,apt安装了ruby 1.9.3p194版,还是出现这个问题。 Ruby 的日期为 2012-04-20,tenderlove 的补丁日期为 2011 年 12 月 13 日星期二 07:30:14,但这仍然会发生。 在 Debian Squeeze 上,RVM 安装的 Ruby 版本 1.9.3-p327 WEBrick 仍然给出这些有问题的警告。【参考方案9】:

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

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

(您可能需要sudo

【讨论】:

以上是关于“警告无法确定响应正文的内容长度”是啥意思。意思是我如何摆脱它?的主要内容,如果未能解决你的问题,请参考以下文章

CVE是啥意思,CVE是啥意思

“?”是啥意思?调用jsp时标记是啥意思? [复制]

MSSQLServer是啥意思,MSSQLServer是啥意思

PX代表的是啥?是啥意思?

“?”是啥意思?在 Erlang 中是啥意思? [复制]

msa是啥意思 关于msa是啥意思介绍