Apa yang “PERINGATAN Tidak dapat menentukan panjang konten tubuh tanggapan.” maksud dan bagaimana saya menyingkirkannya?

320

Sejak meningkatkan ke Rails 3.1 saya melihat pesan peringatan ini di log pengembangan saya:

PERINGATAN Tidak dapat menentukan panjang konten tubuh tanggapan. Setel panjang konten respons atau setelResponse#chunked = true

Apa artinya ini dan bagaimana saya bisa menghapusnya? Apakah ini masalah?

Nate Bird
sumber
1
Sama di sini, bagi saya itu terjadi ketika itu panggilan jarak jauh melalui JS.
Tim Baas
2
Saya mulai mendapatkan ini segera setelah saya memutakhirkan ke Ruby 1.9.3 hari ini. Tidak melihatnya sebelumnya. Saya pikir itu pasti karena perubahan dalam WEBrick di Ruby 1.9.3 ...
Tyler Rick
50
Ini memang masalah WEBrick. Sementara itu, Anda bisa menambahkan permata 'tipis' ke Gemfile Anda dan mem-boot Rails dengan itu alih-alih WEBrick, misalnya rails s thin; Ta-da! Tidak ada lagi peringatan.
Scott

Jawaban:

229

Mengajukan pertanyaan yang sama kepada salah satu anggota Rails-Core:

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

Dan jawabannya:

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

ya, tidak apa-apa. Perlu membersihkannya, tetapi tidak ada yang terluka.

Luis Lavena
sumber
9
fyi, jika pesan mengganggu Anda, sebagai solusi Anda dapat menggunakan thin (tambahkan gem 'thin'ke gemfile Anda, mulai menggunakan server Anda rails server thin). (oops, perhatikan saja bahwa @Scott Lowe sudah mengatakan ini di atas.)
fearless_fool
280
Saya menemukan ini menjengkelkan ketika hal-hal semacam ini dimasukkan ke dalam kategori "tidak ada yang disakiti". Fakta bahwa ribuan orang membuang waktu untuk mencari tahu apa yang sedang terjadi sudah cukup untuk membantahnya.
Mark Fraser
16
@ KenThompson masalahnya adalah Webrick, bukan Rails. Webrick tidak mendukung koneksi tetap-hidup dan karenanya memunculkan peringatan / masalah yang kita lihat. Dianjurkan agar Anda menggunakan server web yang tepat / lebih baik (seperti tipis atau penumpang mandiri) untuk web. Versi Ruby yang akan datang akan memperbaiki masalah ini.
Luis Lavena
3
Server webrick pada PC pengembangan kami membuat file .js.erb yang sama dua kali. Masalah rendering dua kali menghilang di server produksi kami yang menjalankan nginx. Jadi ini adalah masalah NYATA dalam kasus seperti kita.
user938363
2
Jawabannya harus mengandung konten posting twitter bukan tautan.
Pedro Rolo
78

Tambalan berikut memecahkan masalah dalam kasus saya; tidak ada lagi peringatan untuk saya.

204_304_keep_alive.patch

Cukup edit file httpresponse.rb di baris 205 seperti yang ditunjukkan pada tautan di atas; sebenarnya tautan tersebut menunjukkan koreksi yang dilakukan terhadap rilis Ruby di masa mendatang.

Saya menggunakan rel 3.2.0 pada ruby ​​1.9.3-p0 diinstal melalui RVM sebagai pengguna tunggal. Jadi lokasi dalam kasus saya adalah:

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

Lokasi file yang akan diubah berbeda tergantung pada jenis instalasi, RVM atau tidak, atau bahkan multi-pengguna atau pengguna tunggal, jadi saya hanya memberikan bagian terakhirnya:

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

Saya harap ini dapat bermanfaat bagi seseorang.

EDIT: Ini adalah tautan ke komit yang mengubah garis yang dimaksud di cabang trunk proyek ruby.

jasoares
sumber
Saya menggunakan debian squeeze, apt ruby ​​yang diinstal versi 1.9.3p194, dan masalah ini masih terjadi. Ruby bertanggal 2012-04-20 dan patch tenderlove bertanggal Sel 13 Des 07:30:14 2011, tetapi ini masih terjadi.
kristianp
Pada Debian squeeze, WEBrick Ruby yang diinstal RVM versi 1.9.3-p327 masih memberikan peringatan bermasalah ini.
MarkDBlackwell
56

Secara eksplisit menambahkan Permata ke Gemfile menyingkirkan pesan peringatan untuk saya:

group :development do
  gem 'webrick', '~> 1.3.1'
end
ootoovak
sumber
5
Ya, untuk saya juga. Petunjuk mengapa ini bekerja mungkin ada di Fitur # 5481 Perpustakaan standar Ruby Gemifying : "Karena 'permata palsu', file baru dari stdlib yang diinstal oleh 'pembaruan permata' diabaikan kecuali jika pengguna menulis permata ['webrick'] secara eksplisit . "
MarkDBlackwell
2
Ini jauh lebih baik daripada 'abaikan saja', atau 'tambalan webrick'. Terima kasih!
nessur
54

Anda juga dapat menggunakan Thin sebagai ganti Webrick default. Tambahkan ini keGemfile gem 'thin'

kemudian rails s thinakan menggunakan tipis, dan peringatan itu akan hilang.

Lagu Cam
sumber
Iya. Inilah yang akhirnya saya lakukan dalam beberapa bulan terakhir. Ryan Bates juga disebutkan dalam Railscast baru-baru ini.
Nate Bird
1
@cam lagu: hampir benar: rails thin akan menggunakan thin bukan Webrick, dan warnanya akan hilang.
fearless_fool
1
Saya dimasukkan ke thindalam developmentgrup. Rails 4 tampaknya mengambilnya secara otomatis saat berjalanrails s
gambar
15

Jika Anda menggunakan .rvm, lakukan ini untuk memperbaikinya ...

Seperti disebutkan oleh João Soares , semua kredit kepadanya, ini adalah apa yang dapat Anda lakukan jika Anda tidak ingin menghilangkan peringatan ini pada pengembangan.

  1. Gunakan editor favorit Anda untuk membuka file ini:

    ~/.rvm/rubies/<ruby-version>/lib/ruby/1.9.1/webrick/httpresponse.rb
  2. Pergi ke baris yang berisi ini (bagi saya itu benar-benar baris 206):

    if chunked? || @header['content-length']
  3. Ubah itu, yang diambil dari tambalan ini , menjadi ini:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Simpan file dan akhirnya restart server rails Anda

Kjellski
sumber
1
Terima kasih! Apakah line 107untuk saya.
gbdev
12

Masalah ini telah diperbaiki di cabang utama Ruby dengan komit ini ke webrick.

Anda dapat mengedit file webrick khusus ini dengan cara yang sama di pengaturan Anda. Perkiraan lokasi dapat ditemukan oleh:

gem which webrick

Untuk benar-benar mengedit file:

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

(Atau alih-alih nano, gunakan editor favorit Anda.)

MarkDBlackwell
sumber
Baris perintah mewah saya di atas (lucu termasuk editor, nano) dicabut tanpa atribusi dan hak cipta di situs RailsRock di sini .
MarkDBlackwell
Backtick mungkin tidak boleh diloloskan. Jadi harus benar-benar menjadi: nano `ruby -e"print %x{gem which webrick}.chomp %Q{.rb\n}"`/httpresponse.rb.
MarkDBlackwell
5

Versi JRuby: Jika Anda menggunakan .rvm, lakukan ini untuk memperbaikinya ...

Seperti yang disebutkan oleh João Soares dan Kjellski , ini adalah apa yang dapat Anda lakukan jika Anda ingin menyingkirkan peringatan tentang pengembangan ini dan Anda menggunakan JRuby.

  1. Gunakan editor favorit Anda untuk membuka file ini:

    ~/.rvm/rubies/jruby-<version>/lib/ruby/<1.8 or 1.9>/webrick/httpresponse.rb
  2. Pergi ke baris yang berisi ini (bagi saya itu baris 205):

    if chunked? || @header['content-length']
  3. Ubah itu, yang diambil dari tambalan ini , menjadi ini:

    if chunked? || @header['content-length'] || @status == 304 || @status == 204
  4. Simpan file dan akhirnya restart server rails Anda.

Crimbo
sumber
@ schwabsauce Kecuali untuk instruksi pertama, sisanya tidak khusus untuk JRuby; ini membantu menemukan file. Instruksi lain diulangi untuk kejelasan.
Crimbo
3

Solusi lain yang menghapus garis menyinggung dari webrick. Hanya saja tidak begitu berguna:

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

(Anda mungkin perlu sudo)

Xavier Shay
sumber
3

Menambahkan

config.middleware.use Rack::ContentLength

ke application.rbfile Anda , dan peringatan itu akan hilang bahkan dengan webrick. Ini juga akan diatur Content-Lengthdengan benar dalam produksi ketika memberikan json atau teks tanggapan.

Michael Franzl
sumber
Saya suka ide untuk benar-benar menyelesaikan masalah alih-alih menyembunyikannya dengan patch keep-live. Sayangnya, saran ini hanya memuntahkan peringatan dua kali lebih banyak.
labirin