Module: EventMachine::WebSocket::ClientFraming

Defined in:
lib/eventmachine/websocket/client.rb

Instance Method Summary collapse

Instance Method Details

#send_frame(frame_type, data) ⇒ Object



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