Что означает "WARN Не удалось определить длину тела ответа". и как я могу избавиться от него?

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

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

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

Ответ 2

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

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.

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Если вы используете .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

Ответ 6

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

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

gem which webrick

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

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

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

Ответ 7

Версия 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.

Ответ 8

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

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

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

Ответ 9

Добавить

config.middleware.use Rack::ContentLength

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