Обновление (2012-03-21)
Начиная с Sinatra 1.3.0, вы можете использовать новый потоковый API:
get '/' do
stream do |out|
out << "foo\n"
sleep 10
out << "bar\n"
end
end
Старый ответ
К сожалениюу вас нет потока, к которому вы можете просто подключиться (это не будет работать с промежуточным программным обеспечением Rack).Результат, возвращенный из блока маршрута, может просто ответить на each
.Затем обработчик Rack вызывает each
с блоком, и в этом блоке сбрасывает заданную часть тела клиенту.
Все ответы стойки должны всегда отвечать на each
и всегда передавать строки вданный блок.Синатра позаботится об этом за вас, если вы просто вернете строку.
Простой пример потоковой передачи:
require 'sinatra'
get '/' do
result = ["this", " takes", " some", " time"]
class << result
def each
super do |str|
yield str
sleep 0.3
end
end
end
result
end
Теперь вы можете просто поместить все свое сканирование в each
Метод:
require 'sinatra'
class Crawler
def initialize(url)
@url = url
end
def each
yield "opening url\n"
result = open @url
yield "seaching for foo\n"
if result.include? "foo"
yield "found it\n"
else
yield "not there, sorry\n"
end
end
end
get '/' do
Crawler.new 'http://mysite'
end