Що означає "ПОПЕРЕДЖЕННЯ Не вдалося визначити тривалість вмісту відповіді". маю на увазі і як я від цього позбутися?


320

З моменту оновлення до Rails 3.1 я бачу це попереджувальне повідомлення у своєму журналі реєстрації:

УВАГА Не вдалося визначити довжину вмісту тіла відповіді. Встановлення довжини вмісту відповіді або наборуResponse#chunked = true

Що це означає і як я можу її видалити? Це проблема?


1
Те саме, для мене це відбувається, коли це віддалений дзвінок через JS.
Тім Баас

2
Я почав отримувати це, як тільки перейшов на Ruby 1.9.3 сьогодні. Раніше цього не бачив Я думаю, що це повинно бути пов'язано зі змінами WEBrick у Ruby 1.9.3 ...
Tyler Rick

50
Це справді проблема WEBrick. Тим часом, ви можете додати «тонкий» дорогоцінний камінь до свого Gemfile і завантажувати Rails за допомогою цього замість WEBrick, наприклад rails s thin; Та-да! Більше немає попереджень.
Скотт

Відповіді:


229

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

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

І відповідь:

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

так, це добре. Потрібно його почистити, але нічого не шкодить.


9
fyi, якщо повідомлення вас турбують, ви можете використовувати тонкий (додайте gem 'thin'до свого gemfile, запустіть сервер rails server thin). (ой, щойно помітив, що @Scott Lowe вже сказав це вище.)
безстрашний_фол

280
Мені це дратує, коли такі речі ставляться до категорії "нічого не боляче". Тільки той факт, що тисячі людей витрачають час, щоб розібратися, що відбувається, достатньо, щоб спростувати це.
Марк Фрейзер

16
@KenThompson проблема - Вебрік, а не Рейки. Webrick не підтримує постійне з'єднання, і, таким чином, виникає попередження / проблема, яку ми бачимо. Рекомендується використовувати належний / кращий веб-сервер (наприклад, тонкий або пасажирський автономний) для Інтернету. Майбутні версії Ruby виправлять цю проблему.
Луїс Лавена

3
Сервер webrick на нашому ПК для розробки надає один і той же файл .js.erb двічі. Проблема з рендерінгом двічі зникає на нашому виробничому сервері, на якому працює nginx. Тож це РЕАЛЬНА проблема у таких випадках, як у нас.
user938363

2
Відповідь повинна містити вміст повідомлень на Twitter, а не посилання.
Педро Роло

78

Наступний патч вирішив проблему в моєму випадку; більше немає попереджень для мене.

204_304_keep_alive.patch

Просто відредагуйте файл httpresponse.rb у рядку 205, як показано за посиланням вище; насправді посилання показує виправлення, внесене до майбутнього випуску Ruby.

Я використовую рейки 3.2.0 на рубіні 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: Це посилання на команду, яка змінила відповідну лінію в гілці магістралі рубінового проекту.


Я використовую стиснення debian, apt, встановлену рубінову версію 1.9.3p194, і ця проблема все ще виникає. Ruby датований 2012-04-20, а латка tenderlove датована 13 грудня 07:30:14 2011, але це все ще відбувається.
Крістіанп

На Debian видавленні, встановлена ​​RVM версія Ruby версії 1.9.3-p327 WEBrick все ще надає ці проблемні попередження.
MarkDBlackwell

56

Щойно явно додавши Gem до Gemfile, я позбувся попереджувальних повідомлень:

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

5
Так, і для мене. Підказка, чому це може бути, у Feature # 5481 Gemifying Ruby стандартна бібліотека : "Через" підроблені дорогоцінні камені "нові файли stdlib, встановлені" gem update ", ігноруються, якщо користувач не пише явно gem ['webrick'] . "
MarkDBlackwell

2
Це набагато краще, ніж "ігнорувати це" або "виправити патч". Дякую!
несур

54

Ви також можете використовувати Thin замість Webrick за замовчуванням. Додайте це доGemfile gem 'thin'

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


Так. Це те, що я закінчила за останні місяці. Раян Бейтс також згадувався в нещодавньому Railscast.
Пташка Нейт

1
Пісня @cam: майже правильна: рейки s thin будуть використовувати тонкі замість Webrick, і попередження зникне.
безстрашний_фол

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. Збережіть файл і, зрештою, перезапустіть сервер рейкових систем


1
Дякую! Був line 107для мене.
gbdev

12

Ця проблема була вирішена в багажному відділенні Рубі з цим покінчити з WEBrick.

Ви можете редагувати цей конкретний файл webrick аналогічно у налаштуваннях. Орієнтовне місцезнаходження можна знайти за:

gem which webrick

Щоб фактично відредагувати файл:

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

(Або замість нано, використовуйте улюблений редактор.)


Мій модний командний рядок вище (жартівливо включаючи редактор, 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. Збережіть файл і, зрештою, перезапустіть сервер рейкових систем.


@schwabsauce За винятком першої інструкції, решта не є специфічною для JRuby; це допомагає знайти файл. Інші вказівки повторюються для наочності.
Crimbo

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файл, і попередження зникне навіть із webrick. Це також буде встановлено Content-Lengthналежним чином у виробництві під час надання json або текстової відповіді.


Мені подобається, як насправді вирішити проблему, а не приховувати її за допомогою патча, що зберігається. На жаль, ця пропозиція просто виплюнула вдвічі більше попереджень.
лабіринт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.