启用permessage-deflate后Undertow发送WebSocket消息损坏问题
WebSocket消息损坏问题排查与求助
运行环境:Undertow 2.3.5.Final,OpenJDK 11.0.22(2024-01-16)
功能:实现一个发送光标位置的WebSocket服务器
问题现象
打开两个标签页连接服务器后,客户端最终会收到损坏的消息:
- 成功消息示例:
{"op":"refresh-presence","room-id":"123","data":{"5c494daf-3c68-4ef6-b649-69177cc10105":{"peer-id":"5c494daf-3c68-4ef6-b649-69177cc10105","user":null,"data":{}},"b4eb6d8a-562a-4b8c-8e44-ecd43cba3621":{"peer-id":"b4eb6d8a-562a-4b8c-8e44-ecd43cba3621","user":null,"data":{}},"88f03150-696d-4e09-afbd-1381a2fa2f7e":{"peer-id":"88f03150-696d-4e09-afbd-1381a2fa2f7e","user":null,"data":{"cursors-space-default--main-123":{"x":723,"y":345,"xPercent":56.484375,"yPercent":52.43161094224924}}}}}
- 损坏消息示例1(头部截断+字段值被UUID污染):
ors-space-default--main-123":{"x":562,"y":12,"xPercent":43.9ab521,"r56nt":1b3273a68bf-fefe7d735"}
- 损坏消息示例2(UUID字段截断):
成功消息:
{"op":"set-presence-ok","room-id":"123","client-event-id":"9093a7cc-96ea-42e5-943e-e7c7962bbfcc"}
损坏消息:
{"op":"set-presence-ok","room-id":"123","client-event-id":"6186021","u44-45ser"265-211b8cu44315"}
配置代码
WebSocket连接设置(Clojure)
(defn ws-request [^HttpServerExchange exchange ^IPersistentMap headers ^WebSocketConnectionCallback callback] (let [handler (-> (WebSocketProtocolHandshakeHandler. callback) (.addExtension (PerMessageDeflateHandshake. true ; client? 6 ; deflaterLevel: is a number from 0 (no compression) to 9 (maximum compression) )))] (when headers (set-headers (.getResponseHeaders exchange) headers)) (.handleRequest handler exchange)))
消息发送代码(Clojure)
(defn send-json! "Serializes `obj` to json, and sends over a websocket." [obj ws-conn] (let [obj-json (->json obj) p (promise) _ (WebSockets/sendText ^String obj-json ^WebSocketChannel ws-conn (proxy [WebSocketCallback] [] (complete [ws-conn context] (deliver p nil)) (onError [ws-conn context throwable] (deliver p throwable)))) ret @p] (when (instance? Throwable ret) (throw ret))))
潜在原因定位
移除PerMessageDeflateHandshake压缩扩展后,消息损坏问题不再复现。但目前无法确定该扩展的具体问题点,寻求技术解决方案。
内容的提问来源于stack exchange,提问作者Stepan Parunashvili
相关产品推荐
相关产品推荐

