失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > iOS各浏览器 macOS的safari无法使用websocket问题

iOS各浏览器 macOS的safari无法使用websocket问题

时间:2024-06-11 13:18:30

相关推荐

iOS各浏览器 macOS的safari无法使用websocket问题

iOS各浏览器、macOS的safari无法使用websocket问题

现象结论排查过程

现象

写了个页面放在一个购买的服务器上,使用websocket从后台获取数据。某天开始iphone突然无法建立socket连接了,各个浏览器均不行。测试时发现macbook的safari也会失败,开控制台可以看到失败信息为:“failed: Error during WebSocket handshake: ‘Connection’ header value is not ‘Upgrade’”。

PC、Android上各浏览器正常,macbook上的chrome、firefox也正常;本地启动tomcat测试时也是一切正常无此问题。

结论

购买的服务器的部署结构为apache->tomcat。apache上设置了force-proxy-request-1.0,导致实际tomcat收到的请求为http1.0。tomcat对http1.0请求会固定在应答头加上Connection: close,应答头会同时出现Connection: upgrade和Connection: close,其他能建立连接的浏览器可能只判断了前者,失败的可能判断了后者。tomcat对http1.1才能正常只应答Connection: upgrade。删除apache上这个强制1.0的配置项后恢复正常。

排查过程

(一直在绕弯)

年中刚出现这个问题时,我2个iPhone有段时间是1台正常1台不正常,所以一开始以为是苹果更新出了什么问题导致,主要针对这方面搜索,并没有什么结果。

近期稍微有空了,所以继续针对这个问题进行了进一步排查。首先是因为手机的safari也有问题,这个可以连mac来看下控制台,结果发现其实mac的safari也有问题,控制台能看到报错,所以后续就拿safari+这个报错搜了下,结果的确也是有人遇到过这个问题,解决方案是换tomcat。

因为那个服务器上的tomcat、jdk一直都有在更新最新的,感觉应该不是tomcat问题。我本地测试也是旧的tomcat和新的tomcat都测过,都正常的。

于是开始自我怀疑我代码是不是哪里有问题,排查过程中甚至解决了个一直没空解决的bug(= =)。

又试了下那个服务器上其他版本的tomcat、jdk,也试了下各个能改的配置项,结果还是一样问题。(然而force-proxy-request-1.0的那个配置项他们没做到页面上让我可以自己配)

(终于进入正轨)

想了想既然我本地tomcat测试正常,那个服务器不正常,肯定是应答里有啥不一样,于是决定抓包。

(下了个wireshark,第一次用还不太会用,本地浏览器连本地tomcat时没抓到,最后是用手机连本地tomcat抓的。)

我本地tomcat测试时的抓包:

0000 e4 b2 fb a8 55 61 c8 69 cd a0 cf 06 08 00 45 00 ....Ua.i......E.0010 00 e2 00 00 40 00 40 06 b7 e8 c0 a8 00 70 c0 a8 ....@.@......p..0020 00 6d 1f 90 f5 bf d1 f8 23 91 6c 52 84 e5 80 18 .m......#.lR....0030 10 05 e0 80 00 00 01 01 08 0a 38 ce 66 23 15 5a ..........8.f#.Z0040 04 6c 48 54 54 50 2f 31 2e 31 20 31 30 31 20 0d .lHTTP/1.1 101 .0050 0a 53 65 72 76 65 72 3a 20 41 70 61 63 68 65 2d .Server: Apache-0060 43 6f 79 6f 74 65 2f 31 2e 31 0d 0a 55 70 67 72 Coyote/1.1..Upgr0070 61 64 65 3a 20 77 65 62 73 6f 63 6b 65 74 0d 0a ade: websocket..0080 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 75 70 67 72 Connection: upgr0090 61 64 65 0d 0a 53 65 63 2d 57 65 62 53 6f 63 6b ade..Sec-WebSock00a0 65 74 2d 41 63 63 65 70 74 3a 20 2b 31 4b 50 6d et-Accept: +1KPm00b0 63 35 52 76 57 56 55 52 7a 50 6f 44 32 56 59 61 c5RvWVURzPoD2VYa00c0 53 6c 78 52 42 4d 3d 0d 0a 44 61 74 65 3a 20 57 SlxRBM=..Date: W00d0 65 64 2c 20 32 39 20 4d 61 79 20 32 30 31 39 20 ed, 29 May 00e0 31 32 3a 32 38 3a 32 37 20 47 4d 54 0d 0a 0d 0a 12:28:27 GMT....

连服务器的抓包:

0000 c8 69 cd a0 cf 06 94 d9 b3 e3 44 5f 08 00 45 00 .i........D_..E.0010 00 da 27 b9 40 00 35 06 ee 13 73 ee fa 4c c0 a8 ..'.@.5...s..L..0020 00 6e 00 50 c4 cf 89 45 58 df cb c4 c2 2f 80 18 .n.P...EX..../..0030 1d e8 f7 ed 00 00 01 01 08 0a 00 3d e7 74 14 39 ...........=.t.90040 47 48 48 54 54 50 2f 31 2e 31 20 31 30 31 20 0d GHHTTP/1.1 101 .0050 0a 55 70 67 72 61 64 65 3a 20 77 65 62 73 6f 63 .Upgrade: websoc0060 6b 65 74 0d 0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a ket..Connection:0070 20 75 70 67 72 61 64 65 0d 0a 53 65 63 2d 57 65 upgrade..Sec-We0080 62 53 6f 63 6b 65 74 2d 41 63 63 65 70 74 3a 20 bSocket-Accept:0090 58 69 6b 54 6d 57 49 52 71 55 62 49 6a 38 47 32 XikTmWIRqUbIj8G200a0 4d 6c 56 78 59 39 32 6e 52 54 63 3d 0d 0a 44 61 MlVxY92nRTc=..Da00b0 74 65 3a 20 54 68 75 2c 20 30 36 20 4a 75 6e 20 te: Thu, 06 Jun00c0 32 30 31 39 20 31 33 3a 34 34 3a 31 38 20 47 4d 13:44:18 GM00d0 54 0d 0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 T..Connection: c00e0 6c 6f 73 65 0d 0a 0d 0a lose....

可以看到除了Connection: upgrade外,最后还多了个Connection: close。

找服务器的技术支持反馈下这个情况,表示不太懂。行吧我继续查= =。

偶然撇到了tomcat的access的log日志里打印的收到的请求都是http1.0,结合我当年对Connection头的研究,记得它对http1.0和1.1是不一样处理的。看了下文档1的确也是不一样的,http1.0默认Connection: close,所以猜测tomcat默认给加上了。

用curl设http1.0对本地tomcat试一下,果然能复现出应答头多Connection: close。

curl -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Sec-WebSocket-Key: gECcaHsGS5M+ZrM7SPyc6Q==" -H "Sec-WebSocket-Version: 13" -H "Sec-WebSocket-Extensions: x-webkit-deflate-frame" --http1.0 -v http://localhost:8080/showresult* Trying ::1...* TCP_NODELAY set* Connected to localhost (::1) port 8080 (#0)> GET /showresult HTTP/1.0> Host: localhost:8080> User-Agent: curl/7.54.0> Accept: */*> Connection: Upgrade> Upgrade: websocket> Sec-WebSocket-Key: gECcaHsGS5M+ZrM7SPyc6Q==> Sec-WebSocket-Version: 13> Sec-WebSocket-Extensions: x-webkit-deflate-frame>< HTTP/1.1 101< Upgrade: websocket< Connection: upgrade< Sec-WebSocket-Accept: bnKWsWFNUcBPRs/wUgi2qfdfStA=< Date: Fri, 21 Jun 23:26:06 GMT< Connection: close<

再找服务器的技术支持问下是不是配了apache强制1.0的配置,删掉再测就好啦。

/zh-CN/docs/Web/HTTP/Headers/Connection ↩︎

如果觉得《iOS各浏览器 macOS的safari无法使用websocket问题》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。