File tree Expand file tree Collapse file tree 1 file changed +41
-9
lines changed
Expand file tree Collapse file tree 1 file changed +41
-9
lines changed Original file line number Diff line number Diff line change @@ -179,6 +179,35 @@ class Detach < StandardError
179179 end
180180
181181 class WebSocketServer
182+ class Frame
183+ attr_reader :b
184+
185+ def initialize
186+ @b = '' . b
187+ end
188+
189+ def << obj
190+ case obj
191+ when String
192+ @b << obj . b
193+ when Enumerable
194+ obj . each { |e | self << e }
195+ end
196+ end
197+
198+ def char bytes
199+ @b << bytes
200+ end
201+
202+ def ulonglong bytes
203+ @b << [ bytes ] . pack ( 'Q>' )
204+ end
205+
206+ def uint16 bytes
207+ @b << [ bytes ] . pack ( 'n*' )
208+ end
209+ end
210+
182211 def initialize s
183212 @sock = s
184213 end
@@ -197,27 +226,30 @@ def handshake
197226
198227 def send **msg
199228 msg = JSON . generate ( msg )
200- frame = [ ]
229+ frame = Frame . new
201230 fin = 0b10000000
202231 opcode = 0b00000001
203- frame << fin + opcode
232+ frame . char fin + opcode
204233
205234 mask = 0b00000000 # A server must not mask any frames in a WebSocket Protocol.
206235 bytesize = msg . bytesize
207236 if bytesize < 126
208237 payload_len = bytesize
238+ frame . char mask + payload_len
209239 elsif bytesize < 2 ** 16
210240 payload_len = 0b01111110
211- ex_payload_len = [ bytesize ] . pack ( 'n*' ) . bytes
212- else
241+ frame . char mask + payload_len
242+ frame . uint16 bytesize
243+ elsif bytesize < 2 ** 64
213244 payload_len = 0b01111111
214- ex_payload_len = [ bytesize ] . pack ( 'Q>' ) . bytes
245+ frame . char mask + payload_len
246+ frame . ulonglong bytesize
247+ else
248+ raise 'Bytesize is too big.'
215249 end
216250
217- frame << mask + payload_len
218- frame . push *ex_payload_len if ex_payload_len
219- frame . push *msg . bytes
220- @sock . print frame . pack 'c*'
251+ frame << msg
252+ @sock . print frame . b
221253 end
222254
223255 def extract_data
You can’t perform that action at this time.
0 commit comments