@@ -73,29 +73,32 @@ defmodule Bandit.WebSocket.Frame do
73
73
end
74
74
75
75
@ impl Bandit.Extractor
76
- @ spec deserialize ( binary ( ) ) :: { :ok , frame ( ) } | { :error , term ( ) }
76
+ @ spec deserialize ( binary ( ) , module ( ) ) :: { :ok , frame ( ) } | { :error , term ( ) }
77
77
def deserialize (
78
78
<< fin :: 1 , compressed :: 1 , rsv :: 2 , opcode :: 4 , 1 :: 1 , 127 :: 7 , length :: 64 , mask :: 32 ,
79
- payload :: binary - size ( length ) >>
79
+ payload :: binary - size ( length ) >> ,
80
+ primitive_ops_module
80
81
) do
81
- to_frame ( fin , compressed , rsv , opcode , mask , payload )
82
+ to_frame ( fin , compressed , rsv , opcode , mask , payload , primitive_ops_module )
82
83
end
83
84
84
85
def deserialize (
85
86
<< fin :: 1 , compressed :: 1 , rsv :: 2 , opcode :: 4 , 1 :: 1 , 126 :: 7 , length :: 16 , mask :: 32 ,
86
- payload :: binary - size ( length ) >>
87
+ payload :: binary - size ( length ) >> ,
88
+ primitive_ops_module
87
89
) do
88
- to_frame ( fin , compressed , rsv , opcode , mask , payload )
90
+ to_frame ( fin , compressed , rsv , opcode , mask , payload , primitive_ops_module )
89
91
end
90
92
91
93
def deserialize (
92
94
<< fin :: 1 , compressed :: 1 , rsv :: 2 , opcode :: 4 , 1 :: 1 , length :: 7 , mask :: 32 ,
93
- payload :: binary - size ( length ) >>
95
+ payload :: binary - size ( length ) >> ,
96
+ primitive_ops_module
94
97
) do
95
- to_frame ( fin , compressed , rsv , opcode , mask , payload )
98
+ to_frame ( fin , compressed , rsv , opcode , mask , payload , primitive_ops_module )
96
99
end
97
100
98
- def deserialize ( _msg ) do
101
+ def deserialize ( _msg , _primitive_ops_module ) do
99
102
{ :error , :deserialization_failed }
100
103
end
101
104
@@ -155,14 +158,15 @@ defmodule Bandit.WebSocket.Frame do
155
158
end
156
159
end
157
160
158
- defp to_frame ( _fin , _compressed , rsv , _opcode , _mask , _payload ) when rsv != 0x0 do
161
+ defp to_frame ( _fin , _compressed , rsv , _opcode , _mask , _payload , _primitive_ops_module )
162
+ when rsv != 0x0 do
159
163
{ :error , "Received unsupported RSV flags #{ rsv } " }
160
164
end
161
165
162
- defp to_frame ( fin , compressed , 0x0 , opcode , mask , payload ) do
166
+ defp to_frame ( fin , compressed , 0x0 , opcode , mask , payload , primitive_ops_module ) do
163
167
fin = fin == 0x1
164
168
compressed = compressed == 0x1
165
- unmasked_payload = mask ( payload , mask )
169
+ unmasked_payload = primitive_ops_module . ws_mask ( payload , mask )
166
170
167
171
opcode
168
172
|> case do
@@ -198,26 +202,4 @@ defmodule Bandit.WebSocket.Frame do
198
202
defp mask_and_length ( length ) when length <= 125 , do: << 0 :: 1 , length :: 7 >>
199
203
defp mask_and_length ( length ) when length <= 65_535 , do: << 0 :: 1 , 126 :: 7 , length :: 16 >>
200
204
defp mask_and_length ( length ) , do: << 0 :: 1 , 127 :: 7 , length :: 64 >>
201
-
202
- # Note that masking is an involution, so we don't need a separate unmask function
203
- @ spec mask ( binary ( ) , integer ( ) ) :: binary ( )
204
- def mask ( payload , mask )
205
- when is_binary ( payload ) and is_integer ( mask ) and mask >= 0x00000000 and mask <= 0xFFFFFFFF do
206
- mask ( << >> , payload , mask )
207
- end
208
-
209
- defp mask ( acc , << h :: 32 , rest :: binary >> , mask ) do
210
- mask ( << acc :: binary , ( << Bitwise . bxor ( h , mask ) :: 32 >> ) >> , rest , mask )
211
- end
212
-
213
- for size <- [ 24 , 16 , 8 ] do
214
- defp mask ( acc , << h :: unquote ( size ) >> , mask ) do
215
- << mask :: unquote ( size ) , _ :: binary >> = << mask :: 32 >>
216
- << acc :: binary , ( << Bitwise . bxor ( h , mask ) :: unquote ( size ) >> ) >>
217
- end
218
- end
219
-
220
- defp mask ( acc , << >> , _mask ) do
221
- acc
222
- end
223
205
end
0 commit comments