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


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.