Javascript Safari服务器发送事件(SSE)Infinte循环

Javascript Safari服务器发送事件(SSE)Infinte循环,javascript,safari,eventsource,Javascript,Safari,Eventsource,我在Safari 9和Safari 10中遇到服务器发送事件(SSE)问题。SSE连接打开,立即关闭,然后在无限循环中重新连接 这是客户端代码: var events = new EventSource("/stream/events") 以下是http响应头: > GET /stream/events HTTP/1.1 > User-Agent: curl/7.43.0 > Accept: */* > < HTTP/1.1 200 OK < Access

我在Safari 9和Safari 10中遇到服务器发送事件(SSE)问题。SSE连接打开,立即关闭,然后在无限循环中重新连接

这是客户端代码:

var events = new EventSource("/stream/events")
以下是http响应头:

> GET /stream/events HTTP/1.1
> User-Agent: curl/7.43.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Access-Control-Allow-Origin: *
< Cache-Control: no-cache
< Connection: keep-alive
< Content-Type: text/event-stream
< Expires: Thu, 01 Jan 1970 00:00:00 GMT
< Last-Modified: Tue, 19 Sep 2017 05:28:22 GMT
< Strict-Transport-Security: max-age=31536000
< X-Accel-Buffering: no
< X-Content-Type-Options: nosniff
< X-Frame-Options: DENY
< X-Xss-Protection: 1; mode=block
< Date: Tue, 19 Sep 2017 05:28:22 GMT
< Transfer-Encoding: chunked

我打赌Safari javascript控制台中充满了:

[Error] Failed to load resource: The operation couldnt be completed. Protocol error
这很可能是一个协议错误。http/2的最新版本说

端点不得生成包含连接特定头字段的HTTP/2消息;任何包含特定于连接的标头字段的消息都必须视为格式错误

我不能确定这是您的问题,因为我看不到您的HTTP/2尝试的HTTP头,但是许多HTTP/2实现选择仍然发送
Connection:Keep-Alive
头,而包括Safari和curl在内的几个用户代理决定对此问题严格

更新


我应该补充一点,错误的头,很可能是标准的“Connection:keep alive”头,可以由任何服务器端组件(通常是应用程序的SSE服务器端组件)设置,而不是容器本身。我打赌容器应该在http/2中过滤它。

你能显示Safari发送的头吗?我猜在GET请求之前发送了HEAD或OPTIONS请求,并且您的后端脚本没有处理它。(http/2的角度很有意思。)(我只是发表评论,而不是回答,因为目前这是一个相当疯狂的猜测,但请参阅我的书《HTML5 SSE数据推送应用程序》(Data Push Apps with HTML5 SSE,其中Safari是表现不同的浏览器)第9章。)谢谢你的提问。服务器配置为回复所有选项和HEAD请求,但是,根据我们接收到的服务器日志,这两个选项和HEAD请求都没有。我禁用了http2,并且我的应用程序一切正常,所以至少我有一个临时解决方案。我每晚都在Safari 9/10/11/webkit中测试,所以现在我认为下一步可能是创建webkit错误报告。是否可以查看Safari以查看它发送的请求和头?也就是说,就像你用Chrome和Firefox获得的web开发者屏幕一样(现在内置)。查看Safari的事件视图是否与服务器日志中的事件视图匹配会很有趣。网络选项卡仅显示请求的单个GET条目。
[Error] Failed to load resource: The operation couldnt be completed. Protocol error