| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- local request = require("fastweb.request")
- local response = require("fastweb.response")
- local ws = require("fastweb.websocket")
- local codec = require("fastweb.codec")
- local base64 = require("base64")
- local utils = require("utils")
- if not ws.valid() then
- response.response_done()
- return
- end
- if ws.type() == ws.UPGRADE then
- print("[WS_UPGRADE] CONNID:" .. ws.connid())
- local accept_key = base64.encode(utils.hex_to_bytes(codec.sha1(ws.sec_websocket_key() .. "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")))
- response.header("Sec-WebSocket-Accept", accept_key)
- response.header("Connection", "Upgrade")
- response.header("Upgrade", "websocket")
- response.send_header(101, "Switching Protocols")
- elseif ws.type() == ws.MESSAGE_HEADER then
- local opcode = ws.opcode()
- local log = "[WS_HEADER] CONNID:" .. ws.connid()
- if opcode == ws.OPCODE_TEXT then
- log = log .. " [TEXT]"
- elseif opcode == ws.OPCODE_BINARY then
- log = log .. " [BINARY]"
- elseif opcode == ws.OPCODE_CLOSE then
- log = log .. " [CLOSE]"
- elseif opcode == ws.OPCODE_PING then
- log = log .. " [PING]"
- elseif opcode == ws.OPCODE_PONG then
- log = log .. " [PONG]"
- else
- log = log .. " [OPCODE:" .. opcode .. "]"
- end
- log = log .. " [FINAL:" .. tostring(ws.final()) .. "] [LENGTH:" .. ws.length() .. "]"
- print(log)
- elseif ws.type() == ws.MESSAGE_BODY then
- local connid = ws.connid()
- local opcode = ws.opcode()
- local body = request.body()
- local log = "[WS_BODY] CONNID:" .. connid
- .. " [OPCODE:" .. tostring(opcode) .. "]"
- .. " [LENGTH:" .. tostring(#body) .. "]"
- print(log)
- if opcode == ws.OPCODE_CLOSE then
- -- 客户端关闭:回 Close 帧(可带回原载荷),完成握手
- print("[WS_BODY] reply CLOSE")
- response.send_ws(body, ws.OPCODE_CLOSE)
- elseif opcode == ws.OPCODE_PING then
- -- Ping 必须回 Pong,载荷原样带回
- print("[WS_BODY] reply PONG")
- response.send_ws(body, ws.OPCODE_PONG)
- elseif opcode == ws.OPCODE_PONG then
- -- Pong 无需回复
- print("[WS_BODY] PONG ignored")
- elseif opcode == ws.OPCODE_TEXT or opcode == ws.OPCODE_BINARY then
- -- 文本/二进制:原样回显
- response.send_ws(body, opcode)
- else
- print("[WS_BODY] unhandled opcode:" .. tostring(opcode))
- end
- elseif ws.type() == ws.CLOSE then
- -- TCP 已断开,只做清理,不要再发帧
- print("[WS_CLOSE] CONNID:" .. ws.connid())
- return
- else
- print("UNKNOWN")
- end
- response.response_done()
|