Co oznacza „OSTRZEŻENIE Nie można określić długości treści treści odpowiedzi”. znaczy i jak się go pozbyć?

320

Od czasu aktualizacji do wersji Rails 3.1 w moim dzienniku programowania pojawia się komunikat ostrzegawczy:

OSTRZEŻENIE Nie można określić długości treści treści odpowiedzi. Ustaw długość treści odpowiedzi lub zestawuResponse#chunked = true

Co to oznacza i jak mogę go usunąć? To jest problem?

Nate Bird
źródło
1
To samo tutaj, dla mnie dzieje się, gdy jest to zdalne połączenie za pośrednictwem JS.
Tim Baas,
2
Zacząłem otrzymywać to, jak tylko uaktualniłem dziś do Ruby 1.9.3. Nie widziałem tego wcześniej. Myślę, że musi to być spowodowane zmianami w WEBrick w Ruby 1.9.3 ...
Tyler Rick
50
To rzeczywiście problem WEBrick. W międzyczasie, można dodać „cienka” gem do Gemfile i rozruchowych Rails z tym, że zamiast WEBrick, np rails s thin; Ta-da! Nigdy więcej ostrzeżeń.
Scott

Odpowiedzi:

229

Zadałem to samo pytanie jednemu z członków Rails-Core:

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

I odpowiedź:

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

tak, w porządku. Trzeba to posprzątać, ale nic nie zostanie zranione.

Luis Lavena
źródło
9
fyi, jeśli wiadomości Ci przeszkadzają, możesz obejść to jako obejście (dodaj gem 'thin'do pliku gem, uruchom serwer za pomocą rails server thin). (Ups, właśnie zauważyłem, że @Scott Lowe już to powiedział powyżej.)
nieustraszony_głup
280
Uważam to za irytujące, gdy tego rodzaju rzeczy zaliczane są do kategorii „nic się nie boli”. Sam fakt, że tysiące ludzi marnuje czas na zastanawianie się, co się dzieje, wystarczy, aby to zakwestionować.
Mark Fraser
16
@KenThompson problemem jest Webrick, a nie Rails. Webrick nie obsługuje utrzymywanych połączeń, dlatego podnosi ostrzeżenie / problem, który widzimy. Zaleca się używanie odpowiedniego / lepszego serwera WWW (takiego jak cienki lub samodzielny osobny) dla sieci. Nadchodzące wersje Ruby naprawią ten problem.
Luis Lavena
3
Serwer webrick na naszym komputerze programistycznym renderuje ten sam plik .js.erb dwa razy. Problem podwójnego renderowania znika na naszym serwerze produkcyjnym, na którym działa nginx. To jest PRAWDZIWY problem w przypadkach takich jak nasz.
user938363
2
Odpowiedź powinna zawierać treść wpisów na Twitterze zamiast linków.
Pedro Rolo
78

Następująca łatka rozwiązała problem w moim przypadku; nie ma już dla mnie ostrzeżeń.

204_304_keep_alive.patch

Po prostu edytuj plik httpresponse.rb w wierszu 205, jak pokazano na powyższym linku; w rzeczywistości link pokazuje poprawkę do przyszłej wersji Ruby.

Używam szyn 3.2.0 na Ruby 1.9.3-p0 zainstalowanego przez RVM jako pojedynczy użytkownik. Lokalizacja w moim przypadku to:

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

Lokalizacja pliku, który ma zostać zmieniony, różni się w zależności od rodzaju instalacji, RVM lub nie, a nawet wielu użytkowników lub pojedynczego użytkownika, więc podaję ostatnią jego część:

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

Mam nadzieję, że może to komuś pomóc.

EDYCJA: To jest link do zatwierdzenia, który zmienił daną linię w gałęzi pnia projektu ruby.

jasoares
źródło
Używam debian squeeze, apt zainstalowanej Ruby w wersji 1.9.3p194, i ten problem nadal występuje. Ruby ma datę 2012-04-20, a łatka tenderlove jest opatrzona datą Tue Dec 13 07:30:14 2011, ale nadal tak się dzieje.
kristianp
Podczas wyciskania Debiana zainstalowana w RVM wersja Ruby 1.9.3-p327 WEBrick nadal wyświetla te problematyczne ostrzeżenia.
MarkDBlackwell
56

Po prostu wyraźne dodanie Gem do Gemfile pozbyło się dla mnie komunikatów ostrzegawczych:

group :development do
  gem 'webrick', '~> 1.3.1'
end
ootoovak
źródło
5
Tak, dla mnie też. Wskazówka, dlaczego to działa, może znaleźć się w standardowej bibliotece funkcji nr 5481 Gemifying Ruby : „Z powodu„ fałszywych klejnotów ”nowe pliki stdlib zainstalowane przez„ aktualizację klejnotów ”są ignorowane, chyba że użytkownik wyraźnie napisze klejnot [„ webrick ”] . ”
MarkDBlackwell
2
Jest to o wiele lepsze niż „ignorowanie” lub „łatanie webrick”. Dziękuję Ci!
nessur
54

Możesz także użyć opcji Cienki zamiast domyślnego Webrick. Dodaj to doGemfile gem 'thin'

następnie rails s thinużyje cienkiej, a ostrzeżenie zniknie.

Cam Song
źródło
Tak. To właśnie skończyło się w ostatnich miesiącach. Ryan Bates wspominał również w ostatnim Railscast.
Nate Bird,
1
@cam song: prawie poprawne: cienkie szyny użyją cienkiego zamiast Webricka, a ostrzeżenie zniknie.
nieustraszony_słupek
1
Umieściłem thinw developmentgrupie. Szyny 4 wydaje się wybranie go automatycznie podczas uruchamianiarails s
remis
15

Jeśli używasz .rvm, zrób to, aby to naprawić ...

Jak wspomniał João Soares , wszystkie kredyty dla niego, to jest to, co możesz zrobić, jeśli nie chcesz pozbyć się tego ostrzeżenia o rozwoju.

  1. Użyj swojego ulubionego edytora, aby otworzyć ten plik:

    ~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb
  2. Przejdź do wiersza zawierającego to (dla mnie tak naprawdę była to linia 206):

    if chunked? || @header['content-length']
  3. Zmień to, zaczerpnięte z tej łatki , na to:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Zapisz plik i ostatecznie zrestartuj serwer Railsowy

Kjellski
źródło
1
Dziękuję Ci! Był line 107dla mnie
gbdev
12

Ten problem został rozwiązany w gałęzi pnia Ruby dzięki temu zatwierdzeniu webrick.

Możesz edytować ten konkretny plik Webrick w podobny sposób w konfiguracji. Przybliżoną lokalizację można znaleźć:

gem which webrick

Aby faktycznie edytować plik:

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

(Lub zamiast nano użyj ulubionego edytora).

MarkDBlackwell
źródło
Moja fantazyjna linia poleceń powyżej (humorystycznie włączając edytora, nano) została zniesiona bez przypisania i chroniona prawem autorskim na stronie RailsRock tutaj .
MarkDBlackwell
Cofnięcia prawdopodobnie nie powinny uciekać. Tak powinno być naprawdę: nano `ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"`/httpresponse.rb.
MarkDBlackwell
5

Wersja JRuby: Jeśli używasz .rvm, zrób to, aby to naprawić ...

Jak wspomnieli João Soares i Kjellski , możesz to zrobić, jeśli chcesz pozbyć się tego ostrzeżenia podczas programowania i używasz JRuby.

  1. Użyj swojego ulubionego edytora, aby otworzyć ten plik:

    ~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb
  2. Przejdź do wiersza zawierającego to (dla mnie była to linia 205):

    if chunked? || @header['content-length']
  3. Zmień to, zaczerpnięte z tej łatki , na to:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Zapisz plik i ostatecznie zrestartuj serwer Railsowy.

Crimbo
źródło
@schwabsauce Z wyjątkiem pierwszej instrukcji, reszta nie jest specyficzna dla JRuby; pomaga zlokalizować plik. Pozostałe instrukcje są powtarzane dla jasności.
Crimbo
3

Kolejne obejście, które usuwa obraźliwą linię z webrick. To po prostu nie jest tak przydatne:

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

(być może trzeba sudo)

Xavier Shay
źródło
3

Dodaj

config.middleware.use Rack::ContentLength

do twojego application.rbpliku, a ostrzeżenie zniknie nawet z Webrick. Spowoduje to również Content-Lengthprawidłowe ustawienie podczas renderowania odpowiedzi Json lub tekstowej.

Michael Franzl
źródło
Podoba mi się pomysł rozwiązania problemu zamiast ukrywania go za pomocą łatki podtrzymującej życie. Niestety, ta sugestia wypluła dwa razy więcej ostrzeżeń.
labirynt