Skip to content

http.websocket做ws客户端时,给用FastAPI写的websocket后端发消息需要带masking_key,否则链接会被close #2084

@pigparadise

Description

@pigparadise

主要还是RFC标准的问题,Python的Web框架FASTAPI的标准更加严格,不发会导致1002错误,然后收到close。
尝试改了2个地方暂时可以过,测试时的 masking_key = math.random(0, 0xFFFFFFFF)
M.read里面,收到ping后会主动回复pong一下,改起来有些难受。也许有更优雅的改法,下面的改法仅供参考

--- a/skynet/lualib/http/websocket.lua
+++ b/skynet/lualib/http/websocket.lua
@@ -486,7 +486,7 @@ function M.connect(url, header, timeout)
 end
 
 
-function M.read(id)
+function M.read(id, masking_key)
     local ws_obj = assert(ws_pool[id])
     local recv_buf
     while true do
@@ -495,7 +495,7 @@ function M.read(id)
             _close_websocket(ws_obj)
             return false, payload_data
         elseif op == "ping" then
-            write_frame(ws_obj, "pong", payload_data)
+            write_frame(ws_obj, "pong", payload_data, masking_key)
         elseif op ~= "pong" then  -- op is frame, text binary
             if fin and not recv_buf then
                 return payload_data
@@ -520,9 +520,9 @@ function M.write(id, data, fmt, masking_key)
 end
 
 
-function M.ping(id)
+function M.ping(id, payload_data, masking_key)
     local ws_obj = assert(ws_pool[id])
-    write_frame(ws_obj, "ping")
+    write_frame(ws_obj, "ping", payload_data, masking_key)
 end

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions