O que significa "WARN Não foi possível determinar o comprimento do conteúdo do corpo da resposta". significa e como me livrar dele?

320

Desde a atualização para o Rails 3.1, estou vendo esta mensagem de aviso no meu log de desenvolvimento:

WARN Não foi possível determinar o comprimento do conteúdo do corpo da resposta. Definir o comprimento do conteúdo da resposta ou definirResponse#chunked = true

O que isso significa e como posso removê-lo? Isso é um problema?

Nate Bird
fonte
1
O mesmo aqui, para mim, está acontecendo quando é uma chamada remota via JS.
Tim Baas
2
Comecei a receber isso assim que atualizei para o Ruby 1.9.3 hoje. Não estava vendo isso antes. Eu acho que deve ser devido a mudanças no WEBrick em Ruby 1.9.3 ...
Tyler Rick
50
É realmente uma questão WEBrick. Enquanto isso, você pode adicionar a gema 'thin' ao seu Gemfile e inicializar o Rails com isso em vez do WEBrick, por exemplo rails s thin; Ta-da! Não há mais avisos.
Scott

Respostas:

229

A mesma pergunta foi feita a um dos membros do Rails-Core:

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

E a resposta:

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

sim, tudo bem. Precisa limpá-lo, mas nada está sendo ferido.

Luis Lavena
fonte
9
fyi, se as mensagens o incomodarem, como uma solução alternativa, você pode usar thin (adicione gem 'thin'ao seu gemfile, inicie o servidor usando rails server thin). (oops, só notei que @ Scott Lowe já disse isso acima.)
fearless_fool
280
Acho isso irritante quando esses tipos de coisas são colocados na categoria "nada está sendo ferido". Apenas o fato de milhares de pessoas estarem perdendo tempo tendo que descobrir o que está acontecendo é suficiente para contestar isso.
Mark2
16
@ KenThompson, o problema é Webrick, não Rails. A Webrick não suporta conexões keep-alive e, portanto, levanta o aviso / problema que estamos vendo. É recomendável que você use um servidor da web adequado / melhor (como thin ou standalone de passageiro) para a web. As próximas versões do Ruby resolverão esse problema.
Luis Lavena
3
O servidor webrick em nosso PC de desenvolvimento renderiza o mesmo arquivo .js.erb duas vezes. O problema de renderização duas vezes desaparece em nosso servidor de produção que está executando o nginx. Portanto, este é um problema REAL em casos como o nosso.
precisa saber é o seguinte
2
A resposta deve conter o conteúdo das postagens do twitter em vez dos links.
Pedro Rolo
78

O patch a seguir resolveu o problema no meu caso; não há mais avisos para mim.

204_304_keep_alive.patch

Apenas edite o arquivo activationpresponse.rb na linha 205, como mostrado no link acima; de fato, o link mostra uma correção feita em uma versão futura do Ruby.

Estou usando o Rails 3.2.0 no ruby ​​1.9.3-p0 instalado através do RVM como um único usuário. Portanto, a localização no meu caso é:

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

A localização do arquivo a ser alterado varia de acordo com o tipo de instalação, RVM ou não, ou mesmo multiusuário ou único usuário, então estou apenas dando a última parte dele:

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

Espero que isso possa ser útil para alguém.

EDIT: Este é o link para o commit que alterou a linha em questão no ramo do tronco do projeto ruby.

jasoares
fonte
Estou usando o debian squeeze, o apt instalou a versão 1.9.3p194 do ruby, e esse problema ainda ocorre. Ruby é datado de 20/04/2012 e o patch de tenderlove é datado de 13 de dezembro às 07:30:14 2011, mas isso ainda ocorre.
Kristianp
No Debian squeeze, o Ruby instalado no RVM versão 1.9.3-p327 WEBrick ainda oferece esses avisos problemáticos.
MarkDBlackwell
56

Apenas adicionar explicitamente a Gem ao Gemfile se livrou das mensagens de aviso para mim:

group :development do
  gem 'webrick', '~> 1.3.1'
end
Ootoovak
fonte
5
Sim para mim também. Uma pista do motivo pelo qual isso funciona pode estar na biblioteca padrão Gemifying Ruby do recurso # 5481 : "Por causa de 'gemas falsas', os novos arquivos de um stdlib instalado por 'gem update' são ignorados, a menos que um usuário escreva gem ['webrick'] explicitamente. . "
MarkDBlackwell
2
Isso é muito melhor do que 'ignorá-lo' ou 'patch webrick'. Obrigado!
nessur
54

Você também pode usar Thin em vez do Webrick padrão. Adicione isto aGemfile gem 'thin'

então rails s thinusará thin e o aviso desaparecerá.

Cam Song
fonte
Sim. Foi isso que acabei fazendo nos meses mais recentes. Ryan Bates também mencionado em um recente Railscast.
Nate Bird
1
@cam song: quase correto: o rails s thin usará thin em vez do Webrick, e o aviso desaparecerá.
Fearless_fool
1
Eu coloquei thinem developmentgrupo. O Rails 4 parece buscá-lo automaticamente durante a execuçãorails s
draw
15

Se você estiver usando .rvm, faça isso para corrigi-lo ...

Como mencionado por João Soares , todos os créditos para ele, é isso que você pode fazer se não quiser se livrar desse aviso no desenvolvimento.

  1. Use seu editor favorito para abrir este arquivo:

    ~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb
  2. Vá para a linha que contém isso (para mim, era realmente a linha 206):

    if chunked? || @header['content-length']
  3. Altere-o, retirado deste patch , para este:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Salve o arquivo e, eventualmente, reinicie o servidor rails

Kjellski
fonte
1
Obrigado! Foi line 107para mim.
precisa saber é
12

Esse problema foi corrigido na ramificação do tronco do Ruby com esse commit no webrick.

Você pode editar esse arquivo webrick em particular da mesma forma em sua configuração. A localização aproximada pode ser encontrada por:

gem which webrick

Para realmente editar o arquivo:

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

(Ou, em vez de nano, use seu editor favorito.)

MarkDBlackwell
fonte
Minha linha de comando sofisticada acima (incluindo humoristicamente o editor, nano) foi levantada sem atribuição e com direitos autorais no site RailsRock aqui .
precisa saber é o seguinte
Os backticks provavelmente não devem ser escapados. Então, ele realmente deve ser: nano `ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"`/httpresponse.rb.
precisa saber é o seguinte
5

Versão do JRuby: se você estiver usando .rvm, faça isso para corrigi-lo ...

Conforme mencionado por João Soares e Kjellski , é isso que você pode fazer se quiser se livrar deste aviso no desenvolvimento e estiver usando o JRuby.

  1. Use seu editor favorito para abrir este arquivo:

    ~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb
  2. Vá para a linha que contém isso (para mim, era a linha 205):

    if chunked? || @header['content-length']
  3. Altere-o, retirado deste patch , para este:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Salve o arquivo e, eventualmente, reinicie o servidor rails.

Crimbo
fonte
@schwabsauce Exceto pela primeira instrução, o restante não é específico do JRuby; ajuda a localizar o arquivo. As outras instruções são repetidas para maior clareza.
Crimbo
3

Outra solução alternativa que remove a linha incorreta do webrick. Simplesmente não é tão útil:

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

(você pode precisar sudo)

Xavier Shay
fonte
3

Adicionar

config.middleware.use Rack::ContentLength

ao seu application.rbarquivo e o aviso desaparecerá mesmo com o webrick. Isso também será definido Content-Lengthcorretamente na produção ao renderizar uma resposta json ou de texto.

Michael Franzl
fonte
Adoro a idéia de resolver o problema em vez de ocultá-lo com o patch keep-alive. Infelizmente, essa sugestão cuspiu o dobro dos avisos.
labyrinth