¿Qué significa "ADVERTENCIA no pudo determinar la longitud del contenido del cuerpo de respuesta"? qué significa y cómo me deshago de él?

320

Desde la actualización a Rails 3.1, veo este mensaje de advertencia en mi registro de desarrollo:

WARN No se pudo determinar la longitud del contenido del cuerpo de la respuesta. Establecer la longitud del contenido de la respuesta o establecerResponse#chunked = true

¿Qué significa esto y cómo puedo eliminarlo? ¿Es un problema?

Nate Bird
fuente
1
Lo mismo aquí, para mí está sucediendo cuando es una llamada remota a través de JS.
Tim Baas
2
Comencé a recibir esto tan pronto como actualicé a Ruby 1.9.3 hoy. No lo estaba viendo antes. Creo que debe ser debido a los cambios en WEBrick en Ruby 1.9.3 ...
Tyler Rick
50
De hecho, es un problema de WEBrick. Mientras tanto, puede agregar la gema 'delgada' a su Gemfile y arrancar Rails con eso en lugar de WEBrick, por ejemplo rails s thin; Ta-da! No más advertencias.
Scott

Respuestas:

229

Hice la misma pregunta a uno de los miembros de Rails-Core:

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

Y la respuesta:

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

ya está bien Necesito limpiarlo, pero nada está siendo lastimado.

Luis Lavena
fuente
99
para su información, si los mensajes le molestan, como solución alternativa puede usar thin (agregue gem 'thin'a su gemfile, inicie su servidor usando rails server thin). (Ups, acabo de notar que @Scott Lowe ya dijo esto arriba).
fearless_fool
280
Encuentro esto molesto cuando este tipo de cosas se colocan en la categoría de "nada está siendo lastimado". Solo el hecho de que miles de personas están perdiendo el tiempo teniendo que descubrir qué está sucediendo es suficiente para cuestionar eso.
Mark Fraser
16
@KenThompson el problema es Webrick, no Rails. Webrick no admite conexiones para mantener vivo y, por lo tanto, plantea la advertencia / problema que estamos viendo. Se recomienda que utilice un servidor web adecuado / mejor (como delgado o pasajero independiente) para la web. Las próximas versiones de Ruby solucionarán este problema.
Luis Lavena
3
El servidor webrick en nuestra PC de desarrollo representa el mismo archivo .js.erb dos veces. El problema de renderizado doble desaparece en nuestro servidor de producción que ejecuta nginx. Entonces este es un problema REAL en casos como el nuestro.
user938363
2
La respuesta debe contener el contenido de las publicaciones de Twitter en lugar de enlaces.
Pedro Rolo
78

El siguiente parche resolvió el problema en mi caso; No más advertencias para mí.

204_304_keep_alive.patch

Simplemente edite el archivo httpresponse.rb en la línea 205 como se muestra en el enlace de arriba; de hecho, el enlace muestra una corrección hecha a un lanzamiento futuro de Ruby.

Estoy usando rails 3.2.0 en ruby ​​1.9.3-p0 instalado a través de RVM como un solo usuario. Entonces la ubicación en mi caso es:

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

La ubicación del archivo que se va a modificar varía según el tipo de instalación, RVM o no, o incluso multiusuario o usuario único, por lo que solo estoy dando la última parte:

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

Espero que esto pueda ser útil para alguien.

EDITAR: Este es el enlace al commit que alteró la línea en cuestión en la rama del tronco del proyecto ruby.

jasoares
fuente
Estoy usando debian squeeze, apt instalado ruby ​​versión 1.9.3p194, y este problema aún ocurre. Ruby tiene fecha del 20/04/2012 y el parche de tenderlove está fechado el martes 13 de diciembre 07:30:14 2011, pero esto todavía ocurre.
kristianp
En Debian Squeeze, la versión 1.9.3-p327 de Ruby instalada en RVM WEBrick todavía da estas advertencias problemáticas.
MarkDBlackwell
56

Simplemente agregar explícitamente la Gema al Gemfile me eliminó los mensajes de advertencia:

group :development do
  gem 'webrick', '~> 1.3.1'
end
ootoovak
fuente
55
Sí, para mi también. Una pista de por qué esto funciona puede estar en la función # 5481 Biblioteca estándar de Gemifying Ruby : "Debido a 'gemas falsas', los nuevos archivos de un stdlib instalado por 'gem update' se ignoran a menos que un usuario escriba gem ['webrick'] explícitamente ".
MarkDBlackwell
2
Esto es mucho mejor que 'ignorarlo' o 'parchear webrick'. ¡Gracias!
nessur
54

También puede usar Thin en lugar del Webrick predeterminado. Agregue esto aGemfile gem 'thin'

luego rails s thinusará thin, y la advertencia desaparecerá.

Cam Song
fuente
Si. Esto es lo que terminé haciendo en los últimos meses. Ryan Bates también lo mencionó en un reciente Railscast.
Nate Bird
1
@cam song: casi correcto: los rieles delgados usarán thin en lugar de Webrick, y la advertencia desaparecerá.
fearless_fool
1
Lo pongo thinen developmentgrupo. Parece que Rails 4 lo recoge automáticamente cuando se ejecutarails s
dibuje el
15

Si está utilizando .rvm, haga esto para solucionarlo ...

Como mencionó João Soares , todos los créditos a él, esto es lo que puede hacer si no quiere deshacerse de esta advertencia sobre el desarrollo.

  1. Use su editor favorito para abrir este archivo:

    ~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb
  2. Vaya a la línea que contiene esto (para mí fue realmente la línea 206):

    if chunked? || @header['content-length']
  3. Cámbielo, tomado de este parche , a esto:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Guarde el archivo y finalmente reinicie su servidor rails

Kjellski
fuente
1
¡Gracias! Fue line 107para mi
gbdev
12

Este problema se ha solucionado en la rama troncal de Ruby con este commit a webrick.

Puede editar este archivo webrick en particular de manera similar en su configuración. La ubicación aproximada se puede encontrar por:

gem which webrick

Para editar realmente el archivo:

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

(O en lugar de nano, use su editor favorito).

MarkDBlackwell
fuente
Mi elegante línea de comando anterior (que incluye humorísticamente el editor, nano) se levantó sin atribución y con derechos de autor en el sitio RailsRock aquí .
MarkDBlackwell
Los backticks probablemente no deberían escaparse. Así que en realidad debería ser: nano `ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"`/httpresponse.rb.
MarkDBlackwell
5

Versión de JRuby: si está utilizando .rvm, haga esto para solucionarlo ...

Como lo mencionaron João Soares y Kjellski , esto es lo que puede hacer si desea deshacerse de esta advertencia sobre el desarrollo y está utilizando JRuby.

  1. Use su editor favorito para abrir este archivo:

    ~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb
  2. Vaya a la línea que contiene esto (para mí era la línea 205):

    if chunked? || @header['content-length']
  3. Cámbielo, tomado de este parche , a esto:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Guarde el archivo y, finalmente, reinicie su servidor rails.

Carmesí
fuente
@schwabsauce Excepto por la primera instrucción, el resto no es específico de JRuby; Ayuda a localizar el archivo. Las otras instrucciones se repiten para mayor claridad.
Crimbo
3

Otra solución alternativa que elimina la línea ofensiva de webrick. Simplemente no es tan útil:

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

(puede que necesite sudo)

Xavier Shay
fuente
3

Añadir

config.middleware.use Rack::ContentLength

a su application.rbarchivo, y la advertencia desaparecerá incluso con webrick. Esto también se configurará Content-Lengthcorrectamente en producción cuando se procese una respuesta json o de texto.

Michael Franzl
fuente
Me encanta la idea de resolver el problema en lugar de esconderlo con el parche Keep-Live. Desafortunadamente, esta sugerencia solo escuchó el doble de las advertencias.
laberinto