# File debug-1.4.0/lib/debug/server_cdp.rb, line 212
def extract_data
first_group = @sock.getbyte
fin = first_group & 0b10000000 != 128
raise 'Unsupported' if fin
opcode = first_group & 0b00001111
raise Detach if opcode == 8
raise "Unsupported: #{opcode}" unless opcode == 1
second_group = @sock.getbyte
mask = second_group & 0b10000000 == 128
raise 'The client must mask all frames' unless mask
payload_len = second_group & 0b01111111
# TODO: Support other payload_lengths
if payload_len == 126
payload_len = @sock.gets(2).unpack('n*')[0]
end
masking_key = []
4.times { masking_key << @sock.getbyte }
unmasked = []
payload_len.times do |n|
masked = @sock.getbyte
unmasked << (masked ^ masking_key[n % 4])
end
JSON.parse unmasked.pack 'c*'
end
# File debug-1.4.0/lib/debug/server_cdp.rb, line 175
def handshake
req = @sock.readpartial 4096
$stderr.puts '[>]' + req if SHOW_PROTOCOL
if req.match /^Sec-WebSocket-Key: (.*)\r\n/
accept = Base64.strict_encode64 Digest::SHA1.digest "#{$1}258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
@sock.print "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: #{accept}\r\n\r\n"
else
"Unknown request: #{req}"
end
end
# File debug-1.4.0/lib/debug/server_cdp.rb, line 187
def send **msg
msg = JSON.generate(msg)
frame = []
fin = 0b10000000
opcode = 0b00000001
frame << fin + opcode
mask = 0b00000000 # A server must not mask any frames in a WebSocket Protocol.
bytesize = msg.bytesize
if bytesize < 126
payload_len = bytesize
elsif bytesize < 2 ** 16
payload_len = 0b01111110
ex_payload_len = [bytesize].pack('n*').bytes
else
payload_len = 0b01111111
ex_payload_len = [bytesize].pack('Q>').bytes
end
frame << mask + payload_len
frame.push *ex_payload_len if ex_payload_len
frame.push *msg.bytes
@sock.print frame.pack 'c*'
end