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

299

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

WARN Не удалось определить длину содержимого тела ответа. Установите длину содержимого ответа или установите Response#chunked = true

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

  • 1
    То же самое здесь, для меня это происходит, когда это удаленный вызов через JS.
  • 2
    Я начал получать это, как только я обновился до Ruby 1.9.3 сегодня. Не видел это раньше. Я думаю, что это должно быть связано с изменениями в WEBrick в Ruby 1.9.3 ...
Показать ещё 1 комментарий
Теги:
webrick

9 ответов

225
Лучший ответ

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

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

И ответ:

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

ya, это нормально. Нужно убирать его, но ничто не пострадало.

  • 9
    Кстати, если сообщения вас беспокоят, в качестве обходного пути вы можете использовать thin (добавьте gem 'thin' в ваш gemfile, запустите сервер с помощью rails server thin ). (К сожалению, только что заметил, что @ Скотт Лоу уже сказал это выше.)
  • 280
    Я нахожу это раздражающим, когда такие вещи попадают в категорию «ничего не болит». Просто тот факт, что тысячи людей тратят время на то, чтобы понять, что происходит, достаточно, чтобы оспорить это.
Показать ещё 6 комментариев
81

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

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

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

EDIT: ссылка на фиксацию, которая изменила соответствующую строку в ветке соединительной линии проекта ruby.

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

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

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

  • 0
    Да. Это то, чем я занимался в последние месяцы. Райан Бейтс также упоминается в недавнем Railscast.
  • 1
    @cam song: почти правильно: rails s thin будет использовать thin вместо Webrick, и предупреждение исчезнет.
Показать ещё 1 комментарий
54

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

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

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

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

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

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

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

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

  • 1
    Спасибо! Была line 107 для меня.
11

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

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

gem which webrick

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

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

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

  • 0
    приятно отметить, что в случае выхода новой версии ruby
  • 0
    Моя необычная командная строка выше (с юмором включая редактор, nano) была отменена без указания авторства и защищена авторским правом на сайте RailsRock здесь .
5

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

Как упоминалось João Soares и Kjellski, это то, что вы можете сделать, если хотите избавиться от этого предупреждения при разработке, и вы используете JRuby.

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

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

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

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

  • 0
    код в этом решении не является специфичным для JRuby, не так ли?
  • 0
    @schwabsauce За исключением первой инструкции, остальные не являются специфичными для JRuby; это помогает найти файл. Другие инструкции повторяются для ясности.
3

Еще одно обходное решение, которое удаляет оскорбительную строку из webrick. Это просто не так полезно:

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

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

2

Добавить

config.middleware.use Rack::ContentLength

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню