Ни Webrick, ни Thin не поддерживают потоковую передачу таким образом.Вы можете попробовать дворнягу или единорога.Если вы хотите использовать Thin или Rainbows !, вам нужно подключиться к циклу событий, чтобы добиться потоковой передачи:
require 'sinatra'
class Stream
include EventMachine::Deferrable
def initialize
@counter = 0
end
def each(&block)
if @counter > 10
succeed
else
EM.next_tick do
yield counter
each(&block)
end
end
end
end
get '/' do
Stream.new
end
Я недавно написал реализацию EventSource следующим образом:
require 'sinatra'
class EventStream
include EventMachine::Deferrable
def each
count = 0
timer = EventMachine::PeriodicTimer.new(1) do
yield "data: #{count += 1}\n\n"
end
errback { timer.cancel }
end
end
get '/' do
EventMachine.next_tick do
request.env['async.callback'].call [
200, {'Content-Type' => 'text/event-stream'},
EventStream.new ]
end
[-1, {}, []]
end
Если вы хотите использовать Webrick для потоковой передачи: здесь - это патч.