Software /
code /
prosody-modules
Annotate
mod_websocket/mod_websocket.lua @ 1268:854a3933cfcd
mod_muc_log_http: URL-encode room names. This allows special characters in room names to work. Ideally this escaping shouldn’t be done in the user visible content, but the module’s template system doesn’t currently allow that.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Sat, 04 Jan 2014 16:50:57 -0500 |
parent | 1193:bbe278a56b0a |
child | 1272:717a08403b26 |
rev | line source |
---|---|
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
1 -- Prosody IM |
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
2 -- Copyright (C) 2012 Florian Zeitz |
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
3 -- |
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
4 -- This project is MIT/X11 licensed. Please see the |
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
5 -- COPYING file in the source package for more information. |
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
6 -- |
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
7 |
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
8 module:set_global(); |
129 | 9 |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
10 local add_filter = require "util.filters".add_filter; |
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
11 local sha1 = require "util.hashes".sha1; |
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
12 local base64 = require "util.encodings".base64.encode; |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
13 local softreq = require "util.dependencies".softreq; |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
14 local portmanager = require "core.portmanager"; |
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
15 |
905
eae665bc2122
mod_websocket: Fix require to work with lua-bitop (Thanks István and Zash)
Florian Zeitz <florob@babelmonkeys.de>
parents:
895
diff
changeset
|
16 local bit; |
eae665bc2122
mod_websocket: Fix require to work with lua-bitop (Thanks István and Zash)
Florian Zeitz <florob@babelmonkeys.de>
parents:
895
diff
changeset
|
17 pcall(function() bit = require"bit"; end); |
eae665bc2122
mod_websocket: Fix require to work with lua-bitop (Thanks István and Zash)
Florian Zeitz <florob@babelmonkeys.de>
parents:
895
diff
changeset
|
18 bit = bit or softreq"bit32" |
eae665bc2122
mod_websocket: Fix require to work with lua-bitop (Thanks István and Zash)
Florian Zeitz <florob@babelmonkeys.de>
parents:
895
diff
changeset
|
19 if not bit then module:log("error", "No bit module found. Either LuaJIT 2, lua-bitop or Lua 5.2 is required"); end |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
20 local band = bit.band; |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
21 local bxor = bit.bxor; |
910
c469a2b2d77d
mod_websocket: Avoid floating point division
Florian Zeitz <florob@babelmonkeys.de>
parents:
909
diff
changeset
|
22 local rshift = bit.rshift; |
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
23 |
1026
e254cf49e14d
mod_websocket: Call string and table functions through locals
Florian Zeitz <florob@babelmonkeys.de>
parents:
1025
diff
changeset
|
24 local t_concat = table.concat; |
e254cf49e14d
mod_websocket: Call string and table functions through locals
Florian Zeitz <florob@babelmonkeys.de>
parents:
1025
diff
changeset
|
25 local s_byte = string.byte; |
e254cf49e14d
mod_websocket: Call string and table functions through locals
Florian Zeitz <florob@babelmonkeys.de>
parents:
1025
diff
changeset
|
26 local s_char= string.char; |
e254cf49e14d
mod_websocket: Call string and table functions through locals
Florian Zeitz <florob@babelmonkeys.de>
parents:
1025
diff
changeset
|
27 |
1193
bbe278a56b0a
mod_websocket: Add consider_websocket_secure option
Florian Zeitz <florob@babelmonkeys.de>
parents:
1029
diff
changeset
|
28 local consider_websocket_secure = module:get_option_boolean("consider_websocket_secure"); |
856
7eb54ed58856
mod_websocket: Add CORS support
Florian Zeitz <florob@babelmonkeys.de>
parents:
853
diff
changeset
|
29 local cross_domain = module:get_option("cross_domain_websocket"); |
7eb54ed58856
mod_websocket: Add CORS support
Florian Zeitz <florob@babelmonkeys.de>
parents:
853
diff
changeset
|
30 if cross_domain then |
7eb54ed58856
mod_websocket: Add CORS support
Florian Zeitz <florob@babelmonkeys.de>
parents:
853
diff
changeset
|
31 if cross_domain == true then |
7eb54ed58856
mod_websocket: Add CORS support
Florian Zeitz <florob@babelmonkeys.de>
parents:
853
diff
changeset
|
32 cross_domain = "*"; |
7eb54ed58856
mod_websocket: Add CORS support
Florian Zeitz <florob@babelmonkeys.de>
parents:
853
diff
changeset
|
33 elseif type(cross_domain) == "table" then |
1026
e254cf49e14d
mod_websocket: Call string and table functions through locals
Florian Zeitz <florob@babelmonkeys.de>
parents:
1025
diff
changeset
|
34 cross_domain = t_concat(cross_domain, ", "); |
856
7eb54ed58856
mod_websocket: Add CORS support
Florian Zeitz <florob@babelmonkeys.de>
parents:
853
diff
changeset
|
35 end |
7eb54ed58856
mod_websocket: Add CORS support
Florian Zeitz <florob@babelmonkeys.de>
parents:
853
diff
changeset
|
36 if type(cross_domain) ~= "string" then |
7eb54ed58856
mod_websocket: Add CORS support
Florian Zeitz <florob@babelmonkeys.de>
parents:
853
diff
changeset
|
37 cross_domain = nil; |
7eb54ed58856
mod_websocket: Add CORS support
Florian Zeitz <florob@babelmonkeys.de>
parents:
853
diff
changeset
|
38 end |
7eb54ed58856
mod_websocket: Add CORS support
Florian Zeitz <florob@babelmonkeys.de>
parents:
853
diff
changeset
|
39 end |
7eb54ed58856
mod_websocket: Add CORS support
Florian Zeitz <florob@babelmonkeys.de>
parents:
853
diff
changeset
|
40 |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
41 module:depends("c2s") |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
42 local sessions = module:shared("c2s/sessions"); |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
43 local c2s_listener = portmanager.get_service("c2s").listener; |
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
44 |
677
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
45 -- Websocket helpers |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
46 local function parse_frame(frame) |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
47 local result = {}; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
48 local pos = 1; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
49 local length_bytes = 0; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
50 local tmp_byte; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
51 |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
52 if #frame < 2 then return; end |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
53 |
1026
e254cf49e14d
mod_websocket: Call string and table functions through locals
Florian Zeitz <florob@babelmonkeys.de>
parents:
1025
diff
changeset
|
54 tmp_byte = s_byte(frame, pos); |
677
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
55 result.FIN = band(tmp_byte, 0x80) > 0; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
56 result.RSV1 = band(tmp_byte, 0x40) > 0; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
57 result.RSV2 = band(tmp_byte, 0x20) > 0; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
58 result.RSV3 = band(tmp_byte, 0x10) > 0; |
690
5acc203972f3
mod_websocket: Add fragmentation support
Florian Zeitz <florob@babelmonkeys.de>
parents:
689
diff
changeset
|
59 result.opcode = band(tmp_byte, 0x0F); |
677
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
60 |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
61 pos = pos + 1; |
1026
e254cf49e14d
mod_websocket: Call string and table functions through locals
Florian Zeitz <florob@babelmonkeys.de>
parents:
1025
diff
changeset
|
62 tmp_byte = s_byte(frame, pos); |
677
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
63 result.MASK = band(tmp_byte, 0x80) > 0; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
64 result.length = band(tmp_byte, 0x7F); |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
65 |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
66 if result.length == 126 then |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
67 length_bytes = 2; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
68 result.length = 0; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
69 elseif result.length == 127 then |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
70 length_bytes = 8; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
71 result.length = 0; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
72 end |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
73 |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
74 if #frame < (2 + length_bytes) then return; end |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
75 |
677
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
76 for i = 1, length_bytes do |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
77 pos = pos + 1; |
1026
e254cf49e14d
mod_websocket: Call string and table functions through locals
Florian Zeitz <florob@babelmonkeys.de>
parents:
1025
diff
changeset
|
78 result.length = result.length * 256 + s_byte(frame, pos); |
677
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
79 end |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
80 |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
81 if #frame < (2 + length_bytes + (result.MASK and 4 or 0) + result.length) then return; end |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
82 |
677
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
83 if result.MASK then |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
84 local counter = 0; |
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
85 local data = {}; |
1028
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
86 local key = {s_byte(frame, pos+1), s_byte(frame, pos+2), |
1026
e254cf49e14d
mod_websocket: Call string and table functions through locals
Florian Zeitz <florob@babelmonkeys.de>
parents:
1025
diff
changeset
|
87 s_byte(frame, pos+3), s_byte(frame, pos+4)} |
1028
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
88 result.key = key; |
677
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
89 |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
90 pos = pos + 5; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
91 for i = pos, pos + result.length - 1 do |
1028
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
92 data[#data+1] = s_char(bxor(key[counter+1], s_byte(frame, i))); |
677
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
93 counter = (counter + 1) % 4; |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
94 end |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
95 result.data = t_concat(data, ""); |
677
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
96 else |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
97 result.data = frame:sub(pos + 1, pos + result.length); |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
98 end |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
99 |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
100 return result, 2 + length_bytes + (result.MASK and 4 or 0) + result.length; |
677
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
101 end |
eeb41cd5e9f3
mod_websocket: Move frame handling into a separate function
Florian Zeitz <florob@babelmonkeys.de>
parents:
676
diff
changeset
|
102 |
687
d141375ece4b
mod_websocket: Move frame building into a function
Florian Zeitz <florob@babelmonkeys.de>
parents:
677
diff
changeset
|
103 local function build_frame(desc) |
d141375ece4b
mod_websocket: Move frame building into a function
Florian Zeitz <florob@babelmonkeys.de>
parents:
677
diff
changeset
|
104 local length; |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
105 local result = {}; |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
106 local data = desc.data or ""; |
687
d141375ece4b
mod_websocket: Move frame building into a function
Florian Zeitz <florob@babelmonkeys.de>
parents:
677
diff
changeset
|
107 |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
108 result[#result+1] = s_char(0x80 * (desc.FIN and 1 or 0) + desc.opcode); |
687
d141375ece4b
mod_websocket: Move frame building into a function
Florian Zeitz <florob@babelmonkeys.de>
parents:
677
diff
changeset
|
109 |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
110 length = #data; |
687
d141375ece4b
mod_websocket: Move frame building into a function
Florian Zeitz <florob@babelmonkeys.de>
parents:
677
diff
changeset
|
111 if length <= 125 then -- 7-bit length |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
112 result[#result+1] = s_char(length); |
687
d141375ece4b
mod_websocket: Move frame building into a function
Florian Zeitz <florob@babelmonkeys.de>
parents:
677
diff
changeset
|
113 elseif length <= 0xFFFF then -- 2-byte length |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
114 result[#result+1] = s_char(126); |
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
115 result[#result+1] = s_char(rshift(length, 8)) .. s_char(length%0x100); |
687
d141375ece4b
mod_websocket: Move frame building into a function
Florian Zeitz <florob@babelmonkeys.de>
parents:
677
diff
changeset
|
116 else -- 8-byte length |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
117 result[#result+1] = s_char(127); |
1025
b56a9aa171b3
mod_websocket: Fix length calculation
Florian Zeitz <florob@babelmonkeys.de>
parents:
969
diff
changeset
|
118 local length_bytes = {}; |
b56a9aa171b3
mod_websocket: Fix length calculation
Florian Zeitz <florob@babelmonkeys.de>
parents:
969
diff
changeset
|
119 for i = 8, 1, -1 do |
1026
e254cf49e14d
mod_websocket: Call string and table functions through locals
Florian Zeitz <florob@babelmonkeys.de>
parents:
1025
diff
changeset
|
120 length_bytes[i] = s_char(length % 0x100); |
1025
b56a9aa171b3
mod_websocket: Fix length calculation
Florian Zeitz <florob@babelmonkeys.de>
parents:
969
diff
changeset
|
121 length = rshift(length, 8); |
687
d141375ece4b
mod_websocket: Move frame building into a function
Florian Zeitz <florob@babelmonkeys.de>
parents:
677
diff
changeset
|
122 end |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
123 result[#result+1] = t_concat(length_bytes, ""); |
687
d141375ece4b
mod_websocket: Move frame building into a function
Florian Zeitz <florob@babelmonkeys.de>
parents:
677
diff
changeset
|
124 end |
d141375ece4b
mod_websocket: Move frame building into a function
Florian Zeitz <florob@babelmonkeys.de>
parents:
677
diff
changeset
|
125 |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
126 result[#result+1] = data; |
687
d141375ece4b
mod_websocket: Move frame building into a function
Florian Zeitz <florob@babelmonkeys.de>
parents:
677
diff
changeset
|
127 |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
128 return t_concat(result, ""); |
687
d141375ece4b
mod_websocket: Move frame building into a function
Florian Zeitz <florob@babelmonkeys.de>
parents:
677
diff
changeset
|
129 end |
d141375ece4b
mod_websocket: Move frame building into a function
Florian Zeitz <florob@babelmonkeys.de>
parents:
677
diff
changeset
|
130 |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
131 --- Filter stuff |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
132 function handle_request(event, path) |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
133 local request, response = event.request, event.response; |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
134 local conn = response.conn; |
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
135 |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
136 if not request.headers.sec_websocket_key then |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
137 response.headers.content_type = "text/html"; |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
138 return [[<!DOCTYPE html><html><head><title>Websocket</title></head><body> |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
139 <p>It works! Now point your WebSocket client to this URL to connect to Prosody.</p> |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
140 </body></html>]]; |
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
141 end |
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
142 |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
143 local wants_xmpp = false; |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
144 (request.headers.sec_websocket_protocol or ""):gsub("([^,]*),?", function (proto) |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
145 if proto == "xmpp" then wants_xmpp = true; end |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
146 end); |
129 | 147 |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
148 if not wants_xmpp then |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
149 return 501; |
129 | 150 end |
151 | |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
152 local function websocket_close(code, message) |
1026
e254cf49e14d
mod_websocket: Call string and table functions through locals
Florian Zeitz <florob@babelmonkeys.de>
parents:
1025
diff
changeset
|
153 local data = s_char(rshift(code, 8)) .. s_char(code%0x100) .. message; |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
154 conn:write(build_frame({opcode = 0x8, FIN = true, data = data})); |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
155 conn:close(); |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
156 end |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
157 |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
158 local dataBuffer; |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
159 local function handle_frame(frame) |
1028
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
160 local opcode = frame.opcode; |
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
161 local length = frame.length; |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
162 module:log("debug", "Websocket received: %s (%i bytes)", frame.data, #frame.data); |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
163 |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
164 -- Error cases |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
165 if frame.RSV1 or frame.RSV2 or frame.RSV3 then -- Reserved bits non zero |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
166 websocket_close(1002, "Reserved bits not zero"); |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
167 return false; |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
168 end |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
169 |
1029
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
170 if opcode == 0x8 then |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
171 if length == 1 then |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
172 websocket_close(1002, "Close frame with payload, but too short for status code"); |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
173 return false; |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
174 elseif length >= 2 then |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
175 local status_code = s_byte(frame.data, 1) * 256 + s_byte(frame.data, 2) |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
176 if status_code < 1000 then |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
177 websocket_close(1002, "Closed with invalid status code"); |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
178 return false; |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
179 elseif ((status_code > 1003 and status_code < 1007) or status_code > 1011) and status_code < 3000 then |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
180 websocket_close(1002, "Cosed with reserved status code"); |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
181 return false; |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
182 end |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
183 end |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
184 end |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
185 |
1029
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
186 if opcode >= 0x8 then |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
187 if length > 125 then -- Control frame with too much payload |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
188 websocket_close(1002, "Payload too large"); |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
189 return false; |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
190 end |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
191 |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
192 if not frame.FIN then -- Fragmented control frame |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
193 websocket_close(1002, "Fragmented control frame"); |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
194 return false; |
9d85aded2fb6
mod_websocket: Add some more error checks for close frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
1028
diff
changeset
|
195 end |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
196 end |
690
5acc203972f3
mod_websocket: Add fragmentation support
Florian Zeitz <florob@babelmonkeys.de>
parents:
689
diff
changeset
|
197 |
1028
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
198 if (opcode > 0x2 and opcode < 0x8) or (opcode > 0xA) then |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
199 websocket_close(1002, "Reserved opcode"); |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
200 return false; |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
201 end |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
202 |
1028
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
203 if opcode == 0x0 and not dataBuffer then |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
204 websocket_close(1002, "Unexpected continuation frame"); |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
205 return false; |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
206 end |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
207 |
1028
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
208 if (opcode == 0x1 or opcode == 0x2) and dataBuffer then |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
209 websocket_close(1002, "Continuation frame expected"); |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
210 return false; |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
211 end |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
212 |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
213 -- Valid cases |
1028
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
214 if opcode == 0x0 then -- Continuation frame |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
215 dataBuffer[#dataBuffer+1] = frame.data; |
1028
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
216 elseif opcode == 0x1 then -- Text frame |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
217 dataBuffer = {frame.data}; |
1028
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
218 elseif opcode == 0x2 then -- Binary frame |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
219 websocket_close(1003, "Only text frames are supported"); |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
220 return; |
1028
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
221 elseif opcode == 0x8 then -- Close request |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
222 websocket_close(1000, "Goodbye"); |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
223 return; |
1028
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
224 elseif opcode == 0x9 then -- Ping frame |
691
04662cc35280
mod_websocket: Answer ping frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
690
diff
changeset
|
225 frame.opcode = 0xA; |
04662cc35280
mod_websocket: Answer ping frames
Florian Zeitz <florob@babelmonkeys.de>
parents:
690
diff
changeset
|
226 conn:write(build_frame(frame)); |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
227 return ""; |
690
5acc203972f3
mod_websocket: Add fragmentation support
Florian Zeitz <florob@babelmonkeys.de>
parents:
689
diff
changeset
|
228 else |
1028
81065638299d
mod_websocket: Access some values via locales instead of through tables
Florian Zeitz <florob@babelmonkeys.de>
parents:
1027
diff
changeset
|
229 log("warn", "Received frame with unsupported opcode %i", opcode); |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
230 return ""; |
690
5acc203972f3
mod_websocket: Add fragmentation support
Florian Zeitz <florob@babelmonkeys.de>
parents:
689
diff
changeset
|
231 end |
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
232 |
690
5acc203972f3
mod_websocket: Add fragmentation support
Florian Zeitz <florob@babelmonkeys.de>
parents:
689
diff
changeset
|
233 if frame.FIN then |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
234 local data = t_concat(dataBuffer, ""); |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
235 dataBuffer = nil; |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
236 return data; |
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
237 end |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
238 return ""; |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
239 end |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
240 |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
241 conn:setlistener(c2s_listener); |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
242 c2s_listener.onconnect(conn); |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
243 |
1193
bbe278a56b0a
mod_websocket: Add consider_websocket_secure option
Florian Zeitz <florob@babelmonkeys.de>
parents:
1029
diff
changeset
|
244 local session = sessions[conn]; |
bbe278a56b0a
mod_websocket: Add consider_websocket_secure option
Florian Zeitz <florob@babelmonkeys.de>
parents:
1029
diff
changeset
|
245 |
bbe278a56b0a
mod_websocket: Add consider_websocket_secure option
Florian Zeitz <florob@babelmonkeys.de>
parents:
1029
diff
changeset
|
246 session.secure = consider_websocket_secure or session.secure; |
bbe278a56b0a
mod_websocket: Add consider_websocket_secure option
Florian Zeitz <florob@babelmonkeys.de>
parents:
1029
diff
changeset
|
247 |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
248 local frameBuffer = ""; |
1193
bbe278a56b0a
mod_websocket: Add consider_websocket_secure option
Florian Zeitz <florob@babelmonkeys.de>
parents:
1029
diff
changeset
|
249 add_filter(session, "bytes/in", function(data) |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
250 local cache = {}; |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
251 frameBuffer = frameBuffer .. data; |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
252 local frame, length = parse_frame(frameBuffer); |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
253 |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
254 while frame do |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
255 frameBuffer = frameBuffer:sub(length + 1); |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
256 local result = handle_frame(frame); |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
257 if not result then return; end |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
258 cache[#cache+1] = result; |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
259 frame, length = parse_frame(frameBuffer); |
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
260 end |
1027
6a2dfa8af421
mod_websocket: Optimize string concatenation
Florian Zeitz <florob@babelmonkeys.de>
parents:
1026
diff
changeset
|
261 return t_concat(cache, ""); |
844
a0987c0e4e1d
mod_websocket: Check whether the xmpp sub-protocol was requested
Florian Zeitz <florob@babelmonkeys.de>
parents:
842
diff
changeset
|
262 end); |
a0987c0e4e1d
mod_websocket: Check whether the xmpp sub-protocol was requested
Florian Zeitz <florob@babelmonkeys.de>
parents:
842
diff
changeset
|
263 |
1193
bbe278a56b0a
mod_websocket: Add consider_websocket_secure option
Florian Zeitz <florob@babelmonkeys.de>
parents:
1029
diff
changeset
|
264 add_filter(session, "bytes/out", function(data) |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
265 return build_frame({ FIN = true, opcode = 0x01, data = tostring(data)}); |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
266 end); |
842
32df4d13f178
mod_websocket: More robust frame handling
Florian Zeitz <florob@babelmonkeys.de>
parents:
840
diff
changeset
|
267 |
969
8eba9d4809d2
mod_websocket: Set status_code instead of status
Florian Zeitz <florob@babelmonkeys.de>
parents:
910
diff
changeset
|
268 response.status_code = 101; |
895
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
269 response.headers.upgrade = "websocket"; |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
270 response.headers.connection = "Upgrade"; |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
271 response.headers.sec_webSocket_accept = base64(sha1(request.headers.sec_websocket_key .. "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")); |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
272 response.headers.sec_webSocket_protocol = "xmpp"; |
1f4d77104da5
mod_websocket: Simplify by getting the c2s_listener from mod_c2s
Florian Zeitz <florob@babelmonkeys.de>
parents:
857
diff
changeset
|
273 response.headers.access_control_allow_origin = cross_domain; |
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
274 |
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
275 return ""; |
129 | 276 end |
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
277 |
688
e87678a52720
mod_websocket: Make this a shared module
Florian Zeitz <florob@babelmonkeys.de>
parents:
687
diff
changeset
|
278 function module.add_host(module) |
e87678a52720
mod_websocket: Make this a shared module
Florian Zeitz <florob@babelmonkeys.de>
parents:
687
diff
changeset
|
279 module:depends("http"); |
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
280 module:provides("http", { |
909
ec4c6e8f277d
mod_websocket: Change the HTTP name to websocket, and override the default_path instead
Florian Zeitz <florob@babelmonkeys.de>
parents:
905
diff
changeset
|
281 name = "websocket"; |
ec4c6e8f277d
mod_websocket: Change the HTTP name to websocket, and override the default_path instead
Florian Zeitz <florob@babelmonkeys.de>
parents:
905
diff
changeset
|
282 default_path = "xmpp-websocket"; |
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
283 route = { |
849
6e2ec1825182
mod_websocket: Accept GET request without trailing /
Florian Zeitz <florob@babelmonkeys.de>
parents:
844
diff
changeset
|
284 ["GET"] = handle_request; |
6e2ec1825182
mod_websocket: Accept GET request without trailing /
Florian Zeitz <florob@babelmonkeys.de>
parents:
844
diff
changeset
|
285 ["GET /"] = handle_request; |
676
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
286 }; |
54fa9d6d7809
mod_websocket: New mod_c2s based version, still WIP
Florian Zeitz <florob@babelmonkeys.de>
parents:
129
diff
changeset
|
287 }); |
129 | 288 end |