Я пытаюсь использовать события, отправленные сервером, в своем приложении. Я использую Sinatra и гем sinatra-sse
. Этот драгоценный камень является оберткой для вызова Sinatra stream :keep_alive
.
При запуске моего приложения на Thin у меня нет абсолютно никаких проблем, и мой поток событий работает так, как ожидалось. Однако, когда я переключил свое приложение на работу с Puma, все работает, за исключением того, что мой sse_stream
абсолютно ничего не делает! Он просто возвращает пустую страницу.
Мой поток настроен так
get "/logstream/:server" do
if rbcserver = MyApp.servers[params[:server]]
sse_stream do |stream|
rbcserver.add_web_logger(stream)
stream.callback { rbcserver.remove_web_logger(stream) }
end
else
error 404
end
end
Я начинаю тонкий так:
@@puma_instance = Puma::Server.new MyApp::WebUI
@@puma_instance.add_tcp_listener ip, port
@@puma_instance.run
Есть идеи, что происходит? Любая помощь будет оценена по достоинству.
РЕДАКТИРОВАТЬ: еще немного информации. Это то, что дает cURL при работе на Puma.
$ curl -L -b cookies.txt -c cookies.txt -i http://localhost:9001/logstream/myserver
HTTP/1.1 200 OK
Content-Type: text/event-stream;charset=utf-8
X-Content-Type-Options: nosniff
Transfer-Encoding: chunked
$
Принимая во внимание, что это то, что происходит на тонком
$ curl -L -b cookies.txt -c cookies.txt -i http://localhost:9001/logstream/myserver
HTTP/1.1 200 OK
Content-Type: text/event-stream;charset=utf-8
X-Content-Type-Options: nosniff
Connection: close
Server: thin 1.5.1 codename Straight Razor
event: <event name>
data: <my data>
event: <event name>
data: <my data>
<continues as more data comes in>
РЕДАКТИРОВАТЬ: я должен добавить, что мое приложение использует EventMachine в своей основе, поэтому связь sinatra_sse
с EM, скорее всего, не является проблемой.