我正在尝试在我的应用程序中利用服务器发送事件。我正在使用Sinatra和
当我在Thin上运行我的应用程序时,我完全没有问题,我的事件流按预期工作。然而,当我将我的应用程序切换到使用Puma时,除了我的
我的流设置如下:
sinatra-sse
gem。这个gem包装了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
我这样启动Thin:
@@puma_instance = Puma::Server.new MyApp::WebUI
@@puma_instance.add_tcp_listener ip, port
@@puma_instance.run
有什么想法吗?任何帮助都将不胜感激。
编辑:更多信息 这是在Puma上运行时cURL给出的结果。
$ 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
$
相比之下,这就是在Thin上发生的情况
$ 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的耦合可能不是问题。