Was bedeutet "WARN"? Die Inhaltslänge des Antwortkörpers konnte nicht bestimmt werden. " meine und wie kann ich es loswerden?


320

Seit dem Upgrade auf Rails 3.1 wird diese Warnmeldung in meinem Entwicklungsprotokoll angezeigt:

WARN Die Inhaltslänge des Antwortkörpers konnte nicht ermittelt werden. Legen Sie die Inhaltslänge der Antwort oder des Satzes festResponse#chunked = true

Was bedeutet das und wie kann ich es entfernen? Ist es ein Problem?


1
Das gleiche gilt für mich, wenn es sich um einen Fernanruf über JS handelt.
Tim Baas

2
Ich habe damit angefangen, sobald ich heute auf Ruby 1.9.3 aktualisiert habe. Ich habe es vorher nicht gesehen. Ich denke, es muss an Änderungen in WEBrick in Ruby 1.9.3 liegen ...
Tyler Rick

50
Es ist in der Tat ein WEBrick-Problem. In der Zwischenzeit können Sie den "dünnen" Edelstein zu Ihrer Gemfile hinzufügen und Rails damit anstelle von WEBrick booten, z rails s thin. Ta-da! Keine Warnungen mehr.
Scott

Antworten:


229

Hat einem Mitglied von Rails-Core dieselbe Frage gestellt:

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

Und die Antwort:

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

Ja, es ist in Ordnung. Ich muss es aufräumen, aber nichts wird verletzt.


9
gem 'thin'Zu Ihrer Information , wenn Sie die Nachrichten stören, können Sie als Problemumgehung Thin verwenden ( zu Ihrer Gem-Datei hinzufügen , Ihren Server mit starten rails server thin). (Ups, habe gerade bemerkt, dass @Scott Lowe dies bereits oben gesagt hat.)
furchtloser_Narr

280
Ich finde das ärgerlich, wenn solche Dinge in die Kategorie "nichts wird verletzt" eingeordnet werden. Allein die Tatsache, dass Tausende von Menschen Zeit damit verschwenden, herauszufinden, was los ist, reicht aus, um dies zu bestreiten.
Mark Fraser

16
@ KenThompson das Problem ist Webrick, nicht Rails. Webrick unterstützt keine Keep-Alive-Verbindungen und wirft daher die Warnung / das Problem auf, das wir sehen. Es wird empfohlen, einen geeigneten / besseren Webserver (wie Thin oder Passagier Standalone) für das Web zu verwenden. In den kommenden Versionen von Ruby wird dieses Problem behoben.
Luis Lavena

3
Der Webrick-Server auf unserem Entwicklungs-PC rendert dieselbe .js.erb-Datei zweimal. Das Problem mit dem zweimaligen Rendern verschwindet auf unserem Produktionsserver, auf dem nginx ausgeführt wird. Das ist also ein echtes Problem in Fällen wie unserem.
user938363

2
Die Antwort sollte den Inhalt der Twitter-Beiträge anstelle von Links enthalten.
Pedro Rolo

78

Der folgende Patch hat das Problem in meinem Fall gelöst . keine Warnungen mehr für mich.

204_304_keep_alive.patch

Bearbeiten Sie einfach die Datei httpresponse.rb in Zeile 205 wie unter dem obigen Link gezeigt. Tatsächlich zeigt der Link eine Korrektur, die an einer zukünftigen Version von Ruby vorgenommen wurde.

Ich verwende Rails 3.2.0 auf Ruby 1.9.3-p0, das über RVM als Einzelbenutzer installiert wurde. Der Ort in meinem Fall ist also:

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

Der Speicherort der zu ändernden Datei hängt von der Art der Installation, der RVM oder nicht oder sogar von Mehrbenutzer- oder Einzelbenutzern ab. Ich gebe also nur den letzten Teil davon:

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

Ich hoffe das kann jemandem helfen.

BEARBEITEN: Dies ist der Link zu dem Commit, der die betreffende Zeile im Trunk-Zweig des Ruby-Projekts geändert hat.


Ich verwende Debian Squeeze, apt installiert Ruby Version 1.9.3p194, und dieses Problem tritt immer noch auf. Ruby ist vom 20.04.2012 datiert und der Patch von Tenderlove ist vom 13. Dezember, 07:30:14 2011, aber dies tritt immer noch auf.
Kristianp

Bei Debian Squeeze gibt die von RVM installierte Ruby-Version 1.9.3-p327 WEBrick weiterhin diese problematischen Warnungen aus.
MarkDBlackwell

56

Durch explizites Hinzufügen des Edelsteins zur Gemfile wurden die Warnmeldungen für mich entfernt:

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

5
Ja, auch für mich. Ein Hinweis darauf, warum dies funktioniert, finden Sie in Feature # 5481 Gemifying Ruby-Standardbibliothek : "Aufgrund von 'gefälschten Edelsteinen' werden die neuen Dateien einer durch 'gem update' installierten stdlib ignoriert, es sei denn, ein Benutzer schreibt gem ['webrick'] explizit . "
MarkDBlackwell

2
Dies ist so viel besser als "Ignorieren" oder "Patch-Webrick". Vielen Dank!
Nessur

54

Sie können auch Thin anstelle des Standard-Webricks verwenden. Fügen Sie dies hinzuGemfile gem 'thin'

Dann rails s thinwird Thin verwendet und die Warnung verschwindet.


Ja. Das habe ich in den letzten Monaten getan. Ryan Bates wurde kürzlich in einem Railscast erwähnt.
Nate Bird

1
@cam song: fast richtig: Rails s thin verwendet thin anstelle von Webrick und die Warnung verschwindet.
fearless_fool

1
Ich habe thinin developmentGruppe gesetzt. Rails 4 scheint es beim Laufen automatisch aufzunehmenrails s
ziehen Sie den

15

Wenn Sie .rvm verwenden, tun Sie dies, um das Problem zu beheben ...

Wie von João Soares erwähnt , können Sie dies tun, wenn Sie diese Warnung bei der Entwicklung nicht loswerden möchten.

  1. Verwenden Sie Ihren bevorzugten Editor, um diese Datei zu öffnen:

    ~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb
  2. Gehen Sie zu der Zeile, die dies enthält (für mich war es wirklich Zeile 206):

    if chunked? || @header['content-length']
  3. Ändern Sie es aus diesem Patch in:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Speichern Sie die Datei und starten Sie Ihren Rails-Server neu


1
Vielen Dank! War line 107für mich.
Gbdev

12

Dieses Problem wurde in Rubys Trunk-Zweig mit diesem Commit für Webrick behoben.

Sie können diese spezielle Webrick-Datei in Ihrem Setup auf ähnliche Weise bearbeiten. Der ungefähre Standort kann ermittelt werden durch:

gem which webrick

So bearbeiten Sie die Datei tatsächlich:

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

(Oder verwenden Sie anstelle von Nano Ihren Lieblingseditor.)


Meine schicke Befehlszeile oben (humorvoll einschließlich des Editors, Nano) wurde ohne Namensnennung aufgehoben und auf der RailsRock-Site hier urheberrechtlich geschützt .
MarkDBlackwell

Die Backticks sollten wahrscheinlich nicht entkommen. So sollte es wirklich sein : nano `ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"`/httpresponse.rb.
MarkDBlackwell

5

JRuby-Version: Wenn Sie .rvm verwenden, tun Sie dies, um das Problem zu beheben ...

Wie von João Soares und Kjellski erwähnt , können Sie dies tun, wenn Sie diese Warnung bei der Entwicklung entfernen möchten und JRuby verwenden.

  1. Verwenden Sie Ihren bevorzugten Editor, um diese Datei zu öffnen:

    ~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb
  2. Gehen Sie zu der Zeile, die dies enthält (für mich war es Zeile 205):

    if chunked? || @header['content-length']
  3. Ändern Sie es aus diesem Patch in:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Speichern Sie die Datei und starten Sie Ihren Rails-Server neu.


@schwabsauce Mit Ausnahme der ersten Anweisung ist der Rest nicht JRuby-spezifisch; Es hilft beim Auffinden der Datei. Die anderen Anweisungen werden zur Klarheit wiederholt.
Crimbo

3

Eine weitere Problemumgehung, mit der die fehlerhafte Zeile aus dem Webrick entfernt wird. Es ist einfach nicht so nützlich:

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

(Möglicherweise müssen Sie sudo)


3

Hinzufügen

config.middleware.use Rack::ContentLength

zu Ihrer application.rbDatei, und die Warnung verschwindet auch mit Webrick. Dies wird auch Content-Lengthin der Produktion richtig eingestellt , wenn eine JSON- oder Textantwort gerendert wird.


Ich liebe die Idee, das Problem tatsächlich zu lösen, anstatt es mit dem Keep-Alive-Patch zu verstecken. Leider spuckte dieser Vorschlag nur doppelt so viele Warnungen aus.
Labyrinth
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.