Cosa significa "WARN Impossibile determinare la lunghezza del contenuto del corpo della risposta". cattivo e come sbarazzarsene?


320

Dall'aggiornamento a Rails 3.1 vedo questo messaggio di avviso nel mio log di sviluppo:

WARN Impossibile determinare la lunghezza del contenuto del corpo della risposta. Imposta la lunghezza del contenuto della risposta o setResponse#chunked = true

Cosa significa e come posso rimuoverlo? È un problema?


1
Lo stesso qui, per me succede quando si tratta di una chiamata remota tramite JS.
Tim Baas,

2
Ho iniziato a ottenerlo non appena ho aggiornato a Ruby 1.9.3 oggi. Non lo vedevo prima. Penso che debba essere dovuto ai cambiamenti in WEBrick in Ruby 1.9.3 ...
Tyler Rick,

50
È davvero un problema di WEBrick. Nel frattempo, potresti aggiungere la gemma "sottile" al tuo Gemfile e avviare Rails con quella invece di WEBrick, ad esempio rails s thin; Ta-da! Niente più avvisi.
Scott,

Risposte:


229

Ha posto la stessa domanda a uno dei membri di Rails-Core:

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

E la risposta:

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

ya va bene Ho bisogno di ripulirlo, ma nulla viene ferito.


9
a proposito, se i messaggi ti gem 'thin'danno fastidio, come soluzione alternativa puoi usare thin (aggiungi al tuo gemfile, avvia il tuo server utilizzando rails server thin). (oops, ho appena notato che @Scott Lowe lo ha già detto sopra.)
fearless_fool

280
Lo trovo fastidioso quando questo genere di cose viene inserito nella categoria "niente viene ferito". Solo il fatto che migliaia di persone stiano perdendo tempo a capire cosa sta succedendo è sufficiente per contestarlo.
Mark Fraser,

16
@KenThompson il problema è Webrick, non Rails. Webrick non supporta connessioni keep-alive e quindi genera l'avviso / problema che stiamo vedendo. Si consiglia di utilizzare un web server adeguato / migliore (come thin o passeggero autonomo) per il web. Le prossime versioni di Ruby risolveranno questo problema.
Luis Lavena,

3
Il server webrick sul nostro PC di sviluppo esegue il rendering dello stesso file .js.erb due volte. Il doppio problema di rendering scompare sul nostro server di produzione che esegue nginx. Quindi questo è un vero problema in casi come il nostro.
user938363

2
La risposta dovrebbe contenere il contenuto dei post di Twitter anziché i collegamenti.
Pedro Rolo,

78

La seguente patch ha risolto il problema nel mio caso; niente più avvertimenti per me.

204_304_keep_alive.patch

Basta modificare il file httpresponse.rb alla riga 205 come mostrato nel link sopra; infatti il ​​link mostra una correzione apportata a una versione futura di Ruby.

Sto usando rails 3.2.0 su ruby ​​1.9.3-p0 installato tramite RVM come singolo utente. Quindi la posizione nel mio caso è:

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

La posizione del file da modificare varia a seconda del tipo di installazione, RVM o no, o anche multiutente o singolo utente, quindi sto solo dando l'ultima parte di esso:

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

Spero che questo possa essere utile a qualcuno.

EDIT: questo è il collegamento al commit che ha modificato la linea in questione nel ramo trunk del progetto ruby.


Sto usando Debian Squeeze, apt installato Ruby versione 1.9.3p194, e questo problema si verifica ancora. Ruby è datato 20/04/2012 e la patch di tenderlove è datata mar 13 dic 07:30:14 2011, ma questo si verifica ancora.
kristianp,

Su Debian Squeeze, la versione 1.9.3-p327 di Ruby installata su RVM fornisce ancora questi avvisi problematici.
MarkDBlackwell,

56

L'aggiunta esplicita della Gemma al Gemfile mi ha eliminato i messaggi di avviso:

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

5
Sì, anche per me. Un indizio sul perché questo potrebbe essere nella funzione standard # 5481 Gemifying Ruby standard : "A causa di 'gemme false', i nuovi file di uno stdlib installato da 'gem update' vengono ignorati a meno che un utente non scriva esplicitamente gem ['webrick'] ".
MarkDBlackwell,

2
È molto meglio di "ignorarlo" o "patch webrick". Grazie!
nessur,

54

Puoi anche usare Thin al posto del Webrick predefinito. Aggiungi questo aGemfile gem 'thin'

quindi rails s thinutilizzerà thin e l'avvertimento scomparirà.


Sì. Questo è quello che ho finito per fare negli ultimi mesi. Ryan Bates ha anche citato in un recente Railscast.
Nate Bird,

1
@cam song: quasi corretto: rails s thin userà thin invece di Webrick e l'avvertimento scomparirà.
fearless_fool

1
Ho messo thinin developmentgruppo. Rails 4 sembra raccoglierlo automaticamente durante l'esecuzionerails s
disegna il

15

Se stai usando .rvm, fallo per risolverlo ...

Come accennato da João Soares , tutti i crediti per lui, questo è ciò che puoi fare se non vuoi liberarti di questo avviso sullo sviluppo.

  1. Usa il tuo editor preferito per aprire questo file:

    ~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb
  2. Vai alla riga che contiene questo (per me era davvero la linea 206):

    if chunked? || @header['content-length']
  3. Modificalo, preso da questa patch , in questo:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Salvare il file ed eventualmente riavviare il server rails


1
Grazie! È stato line 107per me
gbdev,

12

Questo problema è stato risolto nel ramo di trunk di Ruby con questo commit su webrick.

È possibile modificare questo particolare file webrick in modo simile nella configurazione. La posizione approssimativa può essere trovata da:

gem which webrick

Per modificare effettivamente il file:

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

(O invece di nano, usa il tuo editor preferito.)


La mia stravagante riga di comando sopra (incluso in modo umoristico l'editor, nano) è stata revocata senza attribuzione e protetta da copyright sul sito RailsRock qui .
MarkDBlackwell,

I backtick probabilmente non dovrebbero essere sfuggiti. Quindi in realtà dovrebbe essere: nano `ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"`/httpresponse.rb.
MarkDBlackwell,

5

Versione JRuby: se stai usando .rvm, fallo per risolverlo ...

Come accennato da João Soares e Kjellski , questo è ciò che puoi fare se vuoi sbarazzarti di questo avviso sullo sviluppo e stai usando JRuby.

  1. Usa il tuo editor preferito per aprire questo file:

    ~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb
  2. Vai alla riga che contiene questo (per me era la linea 205):

    if chunked? || @header['content-length']
  3. Modificalo, preso da questa patch , in questo:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Salvare il file ed eventualmente riavviare il server rails.


@schwabsauce Ad eccezione della prima istruzione, il resto non è specifico di JRuby; aiuta a individuare il file. Le altre istruzioni sono ripetute per chiarezza.
Crimbo,

3

Un'altra soluzione alternativa che rimuove la linea offensiva da Webrick. Non è poi così utile:

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

(potrebbe essere necessario sudo)


3

Inserisci

config.middleware.use Rack::ContentLength

nel tuo application.rbfile e l'avviso scompare anche con webrick. Questo imposterà Content-Lengthcorrettamente anche in produzione quando si esegue il rendering di una risposta json o testuale.


Adoro l'idea di risolvere effettivamente il problema invece di nasconderlo con la patch keep-alive. Sfortunatamente, questo suggerimento ha appena sputato il doppio di molti avvisi.
labirinto,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.