次のルビーコードを試しました...
self.response.headers["Cache-Control"] ||= "no-cache"
self.response.headers["Transfer-Encoding"] = "chunked"
self.response.headers['Last-Modified'] = Time.now.ctime.to_s
self.response_body = Rack::Chunked::Body.new(Enumerator.new do |y|
10.times do
sleep 1
y << "Hello World\n"
end
end)
これは Unicron サーバーではうまく機能しますが、シン サーバーを使用してストリーミングすることはできません。1.5.0 と 2.0.0.pre も試しましたが、これはシンでは機能しません。
次のラックコードを試しましたが、
class DeferredBody
def each(block)
@server_block = block
end
def send(data)
@server_block.call data
end
end
class RackStreamApp
def self.call(env)
Thread.new do
sleep 2 # simulate waiting for some event
body = DeferredBody.new
response = [200, {'Content-Type' => 'text/plain'}, body]
env['async.callback'].call response
body.send 'Hello, '
sleep 2
body.send 'World'
end
[-1, {}, []] # or throw :async
end
end
上記のコードは、Unicorn Server を使用すると「Hello, World」をストリーミングしますが、シン サーバー 1.5.0 を使用するとコードはストリーミングされません (2.0.0-pre も試しました)。
シン サーバーを使用してデータをストリーミングするためにできることはありますか?