HTTP Chunked Transfer エンコーディングでストリーミング データを受信する小さな Ruby スクリプトを作成しようとしています。だから私はこれのクライアント側でルビーを使用しています。Ruby (および Rails) がストリームを提供することに関する多くの質問と情報を見つけることができますが、それらを消費することについてはあまり知りません。おそらくそれは些細なことであり、HTTP の低レベルの機能として機能するはずだからです。誰かが私に小さなサンプル スクリプトをくれませんか?
私はいくつかのことを試しました。これはopen-uriを使用しています:
require 'open-uri'
streamURL = 'http://localhost/sample-stream.php'
puts "Opening"
open(streamURL) do |f|
puts "Opening steam " + streamURL + " (never gets here)"
p f.meta
p "Content-Type: " + f.content_type
p "last modified" + f.last_modified.to_s
no = 1
# print the first three lines
f.each do |line|
print "#{no}: #{line}"
no += 1
break if no > 4
end
end
...そしてこれは net http を使用しています:
require 'net/http'
require 'uri'
streamURL = 'http://localhost/sample-stream.php'
url = URI.parse(streamURL)
full_path = (url.query.empty?) ? url.path : "#{url.path}?#{url.query}"
the_request = Net::HTTP::Get.new(full_path, {'Transfer-Encoding' => 'chunked', 'content-type' => 'text/plain'})
#(Side question: Does it even make sense to specify 'chunked' in the request?)
puts "Opening stream " + streamURL
the_response = Net::HTTP.start(url.host, url.port) { |http|
http.request(the_request)
}
puts the_response.body #never gets here
どちらの場合も、何も出力されません。Apache で、私の php スクリプトが忙しく、ますます多くのデータを吐き出していることがわかります。ここで何が問題なのかは明らかだと思います。どちらの場合も、スクリプトは処理する前に応答全体を取得するのを待っていると思います (これは決して起こりません)。
私のphpスクリプト(サーバー)に何か問題がある可能性があることに言及する必要がありますが、それがFirefoxにかなりうまくチャンクを吹き込んでいるのを見ることができます.
では、データをストリーミングする簡単なルビーの方法はありますか? または、これを行うには特別な宝石/ライブラリが必要になると予想する必要がありますか? (たとえば、このライブラリに出くわしました)