增加websocket支持
This commit is contained in:
77
www/api/ws.lua
Normal file
77
www/api/ws.lua
Normal file
@@ -0,0 +1,77 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user