comparison mod_websocket/mod_websocket.lua @ 1028:81065638299d

mod_websocket: Access some values via locales instead of through tables
author Florian Zeitz <florob@babelmonkeys.de>
date Thu, 30 May 2013 23:49:14 +0200
parents 6a2dfa8af421
children 9d85aded2fb6
comparison
equal deleted inserted replaced
1027:6a2dfa8af421 1028:81065638299d
80 if #frame < (2 + length_bytes + (result.MASK and 4 or 0) + result.length) then return; end 80 if #frame < (2 + length_bytes + (result.MASK and 4 or 0) + result.length) then return; end
81 81
82 if result.MASK then 82 if result.MASK then
83 local counter = 0; 83 local counter = 0;
84 local data = {}; 84 local data = {};
85 result.key = {s_byte(frame, pos+1), s_byte(frame, pos+2), 85 local key = {s_byte(frame, pos+1), s_byte(frame, pos+2),
86 s_byte(frame, pos+3), s_byte(frame, pos+4)} 86 s_byte(frame, pos+3), s_byte(frame, pos+4)}
87 result.key = key;
87 88
88 pos = pos + 5; 89 pos = pos + 5;
89 for i = pos, pos + result.length - 1 do 90 for i = pos, pos + result.length - 1 do
90 data[#data+1] = s_char(bxor(result.key[counter+1], s_byte(frame, i))); 91 data[#data+1] = s_char(bxor(key[counter+1], s_byte(frame, i)));
91 counter = (counter + 1) % 4; 92 counter = (counter + 1) % 4;
92 end 93 end
93 result.data = t_concat(data, ""); 94 result.data = t_concat(data, "");
94 else 95 else
95 result.data = frame:sub(pos + 1, pos + result.length); 96 result.data = frame:sub(pos + 1, pos + result.length);
153 conn:close(); 154 conn:close();
154 end 155 end
155 156
156 local dataBuffer; 157 local dataBuffer;
157 local function handle_frame(frame) 158 local function handle_frame(frame)
159 local opcode = frame.opcode;
160 local length = frame.length;
158 module:log("debug", "Websocket received: %s (%i bytes)", frame.data, #frame.data); 161 module:log("debug", "Websocket received: %s (%i bytes)", frame.data, #frame.data);
159 162
160 -- Error cases 163 -- Error cases
161 if frame.RSV1 or frame.RSV2 or frame.RSV3 then -- Reserved bits non zero 164 if frame.RSV1 or frame.RSV2 or frame.RSV3 then -- Reserved bits non zero
162 websocket_close(1002, "Reserved bits not zero"); 165 websocket_close(1002, "Reserved bits not zero");
163 return false; 166 return false;
164 end 167 end
165 168
166 if frame.opcode >= 0x8 and frame.length > 125 then -- Control frame with too much payload 169 if opcode >= 0x8 and length > 125 then -- Control frame with too much payload
167 websocket_close(1002, "Payload too large"); 170 websocket_close(1002, "Payload too large");
168 return false; 171 return false;
169 end 172 end
170 173
171 if frame.opcode >= 0x8 and not frame.FIN then -- Fragmented control frame 174 if opcode >= 0x8 and not frame.FIN then -- Fragmented control frame
172 websocket_close(1002, "Fragmented control frame"); 175 websocket_close(1002, "Fragmented control frame");
173 return false; 176 return false;
174 end 177 end
175 178
176 if (frame.opcode > 0x2 and frame.opcode < 0x8) or (frame.opcode > 0xA) then 179 if (opcode > 0x2 and opcode < 0x8) or (opcode > 0xA) then
177 websocket_close(1002, "Reserved opcode"); 180 websocket_close(1002, "Reserved opcode");
178 return false; 181 return false;
179 end 182 end
180 183
181 if frame.opcode == 0x0 and not dataBuffer then 184 if opcode == 0x0 and not dataBuffer then
182 websocket_close(1002, "Unexpected continuation frame"); 185 websocket_close(1002, "Unexpected continuation frame");
183 return false; 186 return false;
184 end 187 end
185 188
186 if (frame.opcode == 0x1 or frame.opcode == 0x2) and dataBuffer then 189 if (opcode == 0x1 or opcode == 0x2) and dataBuffer then
187 websocket_close(1002, "Continuation frame expected"); 190 websocket_close(1002, "Continuation frame expected");
188 return false; 191 return false;
189 end 192 end
190 193
191 -- Valid cases 194 -- Valid cases
192 if frame.opcode == 0x0 then -- Continuation frame 195 if opcode == 0x0 then -- Continuation frame
193 dataBuffer[#dataBuffer+1] = frame.data; 196 dataBuffer[#dataBuffer+1] = frame.data;
194 elseif frame.opcode == 0x1 then -- Text frame 197 elseif opcode == 0x1 then -- Text frame
195 dataBuffer = {frame.data}; 198 dataBuffer = {frame.data};
196 elseif frame.opcode == 0x2 then -- Binary frame 199 elseif opcode == 0x2 then -- Binary frame
197 websocket_close(1003, "Only text frames are supported"); 200 websocket_close(1003, "Only text frames are supported");
198 return; 201 return;
199 elseif frame.opcode == 0x8 then -- Close request 202 elseif opcode == 0x8 then -- Close request
200 websocket_close(1000, "Goodbye"); 203 websocket_close(1000, "Goodbye");
201 return; 204 return;
202 elseif frame.opcode == 0x9 then -- Ping frame 205 elseif opcode == 0x9 then -- Ping frame
203 frame.opcode = 0xA; 206 frame.opcode = 0xA;
204 conn:write(build_frame(frame)); 207 conn:write(build_frame(frame));
205 return ""; 208 return "";
206 else 209 else
207 log("warn", "Received frame with unsupported opcode %i", frame.opcode); 210 log("warn", "Received frame with unsupported opcode %i", opcode);
208 return ""; 211 return "";
209 end 212 end
210 213
211 if frame.FIN then 214 if frame.FIN then
212 local data = t_concat(dataBuffer, ""); 215 local data = t_concat(dataBuffer, "");