Что означает «ПРЕДУПРЕЖДЕНИЕ. Не удалось определить длину содержимого тела ответа». значит а как мне от этого избавиться?

320

Начиная с обновления до Rails 3.1 я вижу это предупреждение в моем журнале разработки:

ПРЕДУПРЕЖДЕНИЕ. Не удалось определить длину содержимого тела ответа. Установить длину содержимого ответа или установитьResponse#chunked = true

Что это значит и как я могу удалить это? Это проблема?

Нейт Берд
источник
1
То же самое здесь, для меня это происходит, когда это удаленный вызов через JS.
Тим Баас
2
Я начал получать это, как только я обновился до Ruby 1.9.3 сегодня. Не видел этого раньше. Я думаю, что это должно быть из-за изменений в WEBrick в Ruby 1.9.3 ...
Тайлер Рик
50
Это действительно проблема WEBrick. Тем временем, вы можете добавить «тонкий» гем в ваш Gemfile и загрузить Rails вместе с ним вместо WEBrick, например rails s thin; Та-да! Нет больше предупреждений.
Скотт

Ответы:

229

Задал тот же вопрос одному из участников Rails-Core:

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

И ответ:

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

да, все в порядке. Нужно его почистить, но ничего не болит.

Луис Лавена
источник
9
Кстати, если сообщения вас беспокоят, в качестве обходного пути вы можете использовать thin (добавьте gem 'thin'в свой gemfile, запустите сервер используя rails server thin). (ой, только заметил , что @Scott Lowe уже сказал , что это выше.)
fearless_fool
280
Я нахожу это раздражающим, когда такие вещи попадают в категорию «ничего не болит». Просто тот факт, что тысячи людей тратят время на то, чтобы понять, что происходит, достаточно, чтобы оспорить это.
Марк Фрейзер
16
@KenThompson проблема в Webrick, а не в Rails. Webrick не поддерживает соединения keep-alive и, таким образом, поднимает предупреждение / проблему, которую мы видим. Рекомендуется использовать правильный / лучший веб-сервер (например, тонкий или пассажирский) для веб-сайтов. В следующих версиях Ruby эта проблема будет исправлена.
Луис Лавена
3
Веб-сервер на нашем ПК для разработки дважды отображает один и тот же файл .js.erb. Проблема двойного рендеринга исчезает на нашем производственном сервере, на котором работает nginx. Так что это РЕАЛЬНАЯ проблема в таких случаях, как наш.
user938363
2
Ответ должен содержать содержание постов в твиттере, а не ссылки.
Педро Роло
78

Следующий патч решил проблему в моем случае; больше никаких предупреждений для меня.

204_304_keep_alive.patch

Просто отредактируйте файл httpresponse.rb в строке 205, как показано по ссылке выше; фактически ссылка показывает исправление, внесенное в будущий выпуск Ruby.

Я использую rails 3.2.0 на ruby ​​1.9.3-p0, установленном через RVM, как один пользователь. Так что расположение в моем случае:

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

Расположение файла, который нужно изменить, отличается в зависимости от типа установки, RVM или нет, или даже многопользовательского или однопользовательского, поэтому я просто даю последнюю часть этого:

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

Я надеюсь, что это может быть полезно для кого-то.

РЕДАКТИРОВАТЬ: Это ссылка на коммит, который изменил строку в магистральной ветви проекта ruby.

jasoares
источник
Я использую debian squeeze, apt установил ruby ​​версии 1.9.3p194, и эта проблема все еще возникает. Ruby датирован 2012-04-20, а патч tenderlove датирован вт 13 дек. 07:30:14 2011, но это все еще происходит.
Кристианп
В Debian squeeze установленный RVM Ruby версии 1.9.3-p327 WEBrick по-прежнему выдает эти проблемные предупреждения.
MarkDBlackwell
56

Просто явное добавление Gem в Gemfile избавило меня от предупреждений:

group :development do
  gem 'webrick', '~> 1.3.1'
end
ootoovak
источник
5
Да, для меня тоже. Подсказка, почему это работает, может быть в Feature # 5481 Gemifying стандартной библиотеки Ruby : «Из-за« поддельных самоцветов »новые файлы stdlib, устанавливаемые« gem update », игнорируются, если пользователь явно не пишет gem ['webrick'] «.
MarkDBlackwell
2
Это намного лучше, чем «игнорировать это» или «исправлять вебрик». Спасибо!
Nessur
54

Вы также можете использовать Thin вместо Webrick по умолчанию. Добавьте это кGemfile gem 'thin'

затем rails s thinбудет использовать тонкий, и предупреждение исчезнет.

Cam Song
источник
Да. Это то, чем я занимался в последние месяцы. Райан Бейтс также упоминается в недавнем Railscast.
Нейт Берд
1
@cam song: почти правильно: rails s thin будет использовать thin вместо Webrick, и предупреждение исчезнет.
fearless_fool
1
Я положил thinв developmentгруппу. Rails 4, кажется, поднимает его автоматически во время работыrails s
ничья
15

Если вы используете .rvm, сделайте это, чтобы исправить это ...

Как упомянул Жоао Соареш , все его заслуги, это то, что вы можете сделать, если не хотите избавиться от этого предупреждения о разработке.

  1. Используйте ваш любимый редактор, чтобы открыть этот файл:

    ~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb
  2. Перейдите к строке, которая содержит это (для меня это была действительно строка 206):

    if chunked? || @header['content-length']
  3. Измените его, взятый из этого патча , на этот:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Сохраните файл и перезапустите сервер rails

Kjellski
источник
1
Спасибо! Был line 107для меня.
gbdev
12

Эта проблема была исправлена ​​в ветке Ruby с этим коммитом в webrick.

Вы можете редактировать этот конкретный файл webrick аналогично в вашей настройке. Примерное местоположение можно найти по:

gem which webrick

Чтобы на самом деле редактировать файл:

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

(Или вместо nano используйте ваш любимый редактор.)

MarkDBlackwell
источник
Моя необычная командная строка выше (с юмором включая редактор, nano) была отменена без указания авторства и защищена авторским правом на сайте RailsRock здесь .
MarkDBlackwell
Обратные следы, вероятно, не следует избегать. Так оно и должно быть действительно: nano `ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"`/httpresponse.rb.
MarkDBlackwell
5

Версия JRuby: Если вы используете .rvm, сделайте это, чтобы это исправить ...

Как упоминали Жоао Соареш и Кьельски , это то, что вы можете сделать, если хотите избавиться от этого предупреждения о разработке и используете JRuby.

  1. Используйте ваш любимый редактор, чтобы открыть этот файл:

    ~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb
  2. Перейдите к строке, содержащей это (для меня это была строка 205):

    if chunked? || @header['content-length']
  3. Измените его, взятый из этого патча , на этот:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Сохраните файл и перезапустите сервер rails.

Crimbo
источник
@schwabsauce За исключением первой инструкции, остальные не являются специфичными для JRuby; это помогает найти файл. Остальные инструкции повторяются для ясности.
Кримбо
3

Другой обходной путь, который удаляет оскорбительную строку из webrick. Это просто не так полезно:

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

(вам может понадобиться sudo)

Ксавье Шей
источник
3

Добавить

config.middleware.use Rack::ContentLength

в ваш application.rbфайл, и предупреждение исчезнет даже с вебрик. Это также будет Content-Lengthправильно настроено при рендеринге json или текстового ответа.

Майкл Францль
источник
Мне нравится идея по-настоящему решить проблему, а не скрывать ее с помощью патча keep-alive. К сожалению, это предложение просто выплюнуло вдвое больше предупреждений.
Лабиринт