69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# File 'lib/eventmachine/websocket/client.rb', line 69
def send_frame(frame_type, data)
head = String.new(capacity: 14)
head << (C::FIN | C::FRAME_TYPES[frame_type])
len = data.bytesize
case len
when 0..125
head << [len | C::MASKED].pack("C")
when 126..65535
head << [126 | C::MASKED, len].pack("Cn")
else
head << [127 | C::MASKED, len].pack("CQ>")
end
mask_size = 4
mask = SecureRandom.bytes(mask_size)
head << mask
dmask = mask * 2
dm = dmask.unpack1("Q")
dms = dmask.bytesize
q, r = len.divmod(dms)
q.times do |i|
b = i * dms
data[b, dms] = [data[b, dms].unpack1("Q") ^ dm].pack("Q")
end
r.times do |i|
b = q * dms + i
data.setbyte(b, data.getbyte(b) ^ dmask[i].ord)
end
@connection.send_data(head)
@connection.send_data(data)
end
|