123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- --- mod_websocket.lua
- +++ mod_websocket.lua
- @@ -163,34 +163,34 @@ function handle_request(event)
- return 403;
- end
-
- - local function websocket_close(code, message)
- + local function websocket_close(conn, code, message)
- conn:write(build_close(code, message));
- conn:close();
- end
-
- local dataBuffer;
- - local function handle_frame(frame)
- + local function handle_frame(conn, frame)
- local opcode = frame.opcode;
- local length = frame.length;
- module:log("debug", "Websocket received frame: opcode=%0x, %i bytes", frame.opcode, #frame.data);
-
- -- Error cases
- if frame.RSV1 or frame.RSV2 or frame.RSV3 then -- Reserved bits non zero
- - websocket_close(1002, "Reserved bits not zero");
- + websocket_close(conn, 1002, "Reserved bits not zero");
- return false;
- end
-
- if opcode == 0x8 then -- close frame
- if length == 1 then
- - websocket_close(1002, "Close frame with payload, but too short for status code");
- + websocket_close(conn, 1002, "Close frame with payload, but too short for status code");
- return false;
- elseif length >= 2 then
- local status_code = parse_close(frame.data)
- if status_code < 1000 then
- - websocket_close(1002, "Closed with invalid status code");
- + websocket_close(conn, 1002, "Closed with invalid status code");
- return false;
- elseif ((status_code > 1003 and status_code < 1007) or status_code > 1011) and status_code < 3000 then
- - websocket_close(1002, "Closed with reserved status code");
- + websocket_close(conn, 1002, "Closed with reserved status code");
- return false;
- end
- end
- @@ -198,28 +198,28 @@ function handle_request(event)
-
- if opcode >= 0x8 then
- if length > 125 then -- Control frame with too much payload
- - websocket_close(1002, "Payload too large");
- + websocket_close(conn, 1002, "Payload too large");
- return false;
- end
-
- if not frame.FIN then -- Fragmented control frame
- - websocket_close(1002, "Fragmented control frame");
- + websocket_close(conn, 1002, "Fragmented control frame");
- return false;
- end
- end
-
- if (opcode > 0x2 and opcode < 0x8) or (opcode > 0xA) then
- - websocket_close(1002, "Reserved opcode");
- + websocket_close(conn, 1002, "Reserved opcode");
- return false;
- end
-
- if opcode == 0x0 and not dataBuffer then
- - websocket_close(1002, "Unexpected continuation frame");
- + websocket_close(conn, 1002, "Unexpected continuation frame");
- return false;
- end
-
- if (opcode == 0x1 or opcode == 0x2) and dataBuffer then
- - websocket_close(1002, "Continuation frame expected");
- + websocket_close(conn, 1002, "Continuation frame expected");
- return false;
- end
-
- @@ -229,11 +229,11 @@ function handle_request(event)
- elseif opcode == 0x1 then -- Text frame
- dataBuffer = {frame.data};
- elseif opcode == 0x2 then -- Binary frame
- - websocket_close(1003, "Only text frames are supported");
- + websocket_close(conn, 1003, "Only text frames are supported");
- return;
- elseif opcode == 0x8 then -- Close request
- - websocket_close(1000, "Goodbye");
- - return;
- + websocket_close(conn, 1000, "Goodbye");
- + return "";
- elseif opcode == 0x9 then -- Ping frame
- frame.opcode = 0xA;
- conn:write(build_frame(frame));
- @@ -276,7 +276,7 @@ function handle_request(event)
-
- while frame do
- frameBuffer = frameBuffer:sub(length + 1);
- - local result = handle_frame(frame);
- + local result = handle_frame(session.conn, frame);
- if not result then return; end
- cache[#cache+1] = filter_open_close(result);
- frame, length = parse_frame(frameBuffer);
|