Điều gì làm WAR WARN không thể xác định độ dài nội dung của nội dung phản hồi. nghĩa là gì và làm thế nào để tôi thoát khỏi nó?


320

Kể từ khi nâng cấp lên Rails 3.1, tôi thấy thông báo cảnh báo này trong nhật ký phát triển của mình:

WARN Không thể xác định độ dài nội dung của nội dung phản hồi. Đặt độ dài nội dung của phản hồi hoặc đặtResponse#chunked = true

Điều này có nghĩa là gì và làm thế nào tôi có thể loại bỏ nó? Đó có phải là vấn đề?


1
Tương tự ở đây, đối với tôi nó xảy ra khi đó là một cuộc gọi từ xa thông qua JS.
Tim Baas

2
Tôi bắt đầu nhận được điều này ngay khi tôi nâng cấp lên Ruby 1.9.3 ngày hôm nay. Không thấy nó trước đây. Tôi nghĩ rằng đó phải là do những thay đổi của WEBrick trong Ruby 1.9.3 ...
Tyler Rick

50
Đây thực sự là một vấn đề WEBrick. Trong thời gian này, bạn có thể thêm đá quý 'mỏng' vào Gemfile và khởi động Rails thay vì WEBrick, ví dụ rails s thin; Ta-da! Không còn cảnh báo.
Scott

Câu trả lời:


229

Đã hỏi cùng một câu hỏi với một trong các thành viên của Rails-Core:

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

Và câu trả lời:

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

ya, nó ổn Cần phải làm sạch nó, nhưng không có gì bị tổn thương.


9
fyi, nếu các tin nhắn làm phiền bạn, như một cách giải quyết, bạn có thể sử dụng mỏng (thêm gem 'thin'vào gemfile của bạn, khởi động máy chủ của bạn bằng cách sử dụng rails server thin). (oops, chỉ cần nhận thấy rằng @Scott Lowe đã nói điều này ở trên.)
fearless_fool

280
Tôi thấy điều này thật khó chịu khi những thứ này được đặt trong danh mục "không có gì bị tổn thương". Thực tế là hàng ngàn người đang lãng phí thời gian để tìm hiểu những gì đang diễn ra là đủ để tranh cãi về điều đó.
Mark Fraser

16
@KenThndry vấn đề là Webrick, không phải Rails. Webrick không hỗ trợ các kết nối duy trì và do đó đưa ra cảnh báo / vấn đề chúng ta đang thấy. Bạn nên sử dụng một máy chủ web phù hợp / tốt hơn (như độc lập mỏng hoặc hành khách) cho web. Các phiên bản sắp tới của Ruby sẽ khắc phục vấn đề này.
Luis Lavena

3
Máy chủ webrick trên PC phát triển của chúng tôi hiển thị cùng một tệp .js.erb hai lần. Vấn đề kết xuất hai lần biến mất trên máy chủ sản xuất của chúng tôi đang chạy nginx. Vì vậy, đây là một vấn đề THỰC SỰ trong trường hợp như chúng ta.
dùng938363

2
Câu trả lời nên chứa nội dung của các bài đăng trên twitter thay vì liên kết.
Pedro Rolo

78

Các bản vá sau đây đã giải quyết vấn đề trong trường hợp của tôi; không còn cảnh báo cho tôi

204_304_keep_alive.patch

Chỉ cần chỉnh sửa tệp omepresponse.rb ở dòng 205 như được hiển thị tại liên kết ở trên; trong thực tế, liên kết cho thấy một sự điều chỉnh được thực hiện cho một bản phát hành tương lai của Ruby.

Tôi đang sử dụng rails 3.2.0 trên ruby ​​1.9.3-p0 được cài đặt thông qua RVM với tư cách là một người dùng. Vì vậy, vị trí trong trường hợp của tôi là:

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

Vị trí của tệp được thay đổi khác nhau tùy thuộc vào loại cài đặt, RVM hay không, hoặc thậm chí nhiều người dùng hoặc một người dùng, vì vậy tôi chỉ đưa ra phần cuối của nó:

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

Tôi hy vọng điều này có thể hữu ích cho ai đó.

EDIT: Đây là liên kết đến cam kết đã thay đổi dòng được đề cập trong nhánh thân của dự án ruby.


Tôi đang sử dụng bóp debian, apt đã cài đặt phiên bản ruby ​​1.9.3p194 và sự cố này vẫn xảy ra. Ruby là ngày 2012-04-20 và bản vá của gentlove là ngày Tue 13 tháng 12 07:30:14 2011, nhưng điều này vẫn xảy ra.
kristianp

Khi siết chặt Debian, phiên bản Ruby được cài đặt RVM 1.9.3-p327 WEBrick vẫn đưa ra những cảnh báo có vấn đề này.
MarkDBlackwell

56

Chỉ cần thêm Gem vào Gemfile một cách rõ ràng đã loại bỏ các thông điệp cảnh báo cho tôi:

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

5
Vâng, đối với tôi cũng vậy. Một manh mối về lý do tại sao tác phẩm này có thể có trong Thư viện tiêu chuẩn Gemifying Ruby : "Vì 'đá quý giả', các tệp mới của stdlib được cài đặt bởi 'cập nhật đá quý' bị bỏ qua trừ khi người dùng viết gem ['webrick'] . "
MarkDBlackwell

2
Điều này tốt hơn nhiều so với 'bỏ qua nó', hoặc 'vá webrick'. Cảm ơn bạn!
nessur

54

Bạn cũng có thể sử dụng Thin thay vì Webrick mặc định. Thêm cái này vàoGemfile gem 'thin'

sau đó rails s thinsẽ sử dụng mỏng, và cảnh báo sẽ biến mất.


Đúng. Đây là những gì tôi đã kết thúc trong những tháng gần đây. Ryan Bates cũng được đề cập trong một Railscast gần đây.
Chim Nate

1
@cam song: gần như đúng: rails s thin sẽ sử dụng thin thay vì Webrick, và cảnh báo sẽ biến mất.
sợ hãi_fool

1
Tôi đưa thinvào developmentnhóm. Rails 4 dường như tự động nhặt nó lên khi chạyrails s
vẽ

15

Nếu bạn đang sử dụng .rvm, hãy làm điều này để sửa nó ...

Như João Soares đã đề cập , tất cả các khoản tín dụng cho anh ta, đây là những gì bạn có thể làm nếu bạn không muốn thoát khỏi cảnh báo này về sự phát triển.

  1. Sử dụng trình chỉnh sửa yêu thích của bạn để mở tệp này:

    ~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb
  2. Đi đến dòng chứa cái này (đối với tôi nó thực sự là dòng 206):

    if chunked? || @header['content-length']
  3. Thay đổi nó, lấy từ bản vá này , thành này:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Lưu tệp và cuối cùng khởi động lại máy chủ rails của bạn


1
Cảm ơn bạn! Đã line 107cho tôi.
gbdev

12

Vấn đề này đã được khắc phục trong nhánh trung kế của Ruby với cam kết này với webrick.

Bạn có thể chỉnh sửa tệp webrick cụ thể này tương tự trong thiết lập của bạn. Vị trí gần đúng có thể được tìm thấy bởi:

gem which webrick

Để thực sự chỉnh sửa tập tin:

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

(Hoặc thay vì nano, hãy sử dụng trình chỉnh sửa yêu thích của bạn.)


Dòng lệnh ưa thích của tôi ở trên (hài hước bao gồm trình soạn thảo, nano) đã được gỡ bỏ mà không có sự ghi nhận và có bản quyền trên trang web RailsRock tại đây .
MarkDBlackwell

Các backticks có lẽ không nên thoát. Vì vậy, nó thực sự nên được : nano `ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"`/httpresponse.rb.
MarkDBlackwell

5

Phiên bản JRuby: Nếu bạn đang sử dụng .rvm, hãy làm điều này để sửa nó ...

Như João SoaresKjellski đã đề cập , đây là những gì bạn có thể làm nếu muốn thoát khỏi cảnh báo này về sự phát triển và bạn đang sử dụng JRuby.

  1. Sử dụng trình chỉnh sửa yêu thích của bạn để mở tệp này:

    ~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb
  2. Đi đến dòng chứa cái này (đối với tôi nó là dòng 205):

    if chunked? || @header['content-length']
  3. Thay đổi nó, lấy từ bản vá này , thành này:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Lưu tệp và cuối cùng khởi động lại máy chủ rails của bạn.


@schwabsauce Ngoại trừ hướng dẫn đầu tiên, phần còn lại không dành riêng cho JRuby; Nó giúp xác định vị trí các tập tin. Các hướng dẫn khác được lặp lại cho rõ ràng.
Crimbo

3

Một cách giải quyết khác là loại bỏ dòng vi phạm khỏi webrick. Nó chỉ không hữu ích:

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

(bạn có thể cần phải sudo)


3

Thêm vào

config.middleware.use Rack::ContentLength

vào application.rbtập tin của bạn và cảnh báo sẽ biến mất ngay cả với webrick. Điều này cũng sẽ được đặt Content-Lengthđúng trong sản xuất khi hiển thị phản hồi json hoặc văn bản.


Tôi thích ý tưởng thực sự giải quyết vấn đề thay vì che giấu nó bằng bản vá lỗi. Thật không may, đề nghị này chỉ đưa ra gấp đôi số lượng cảnh báo.
mê cung
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.