Module: DAP::Encoding

Defined in:
lib/dap/encoding.rb

Constant Summary collapse

CONTENT_LENGTH_HEADER =
'Content-Length'

Class Method Summary collapse

Class Method Details

.decode(s) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/dap/encoding.rb', line 4

def self.decode(s)
  headers = {}

  loop do
    l = s.gets
    raise EOFError if l.nil?

    l = l.strip
    break if l.empty?

    name, value = l.split(':', 2)
    raise "Invalid header '#{l}'" unless value

    headers[name.strip] = value.strip
  end

  raise "No headers" unless headers.size
  raise "Missing content length" unless headers.key?(CONTENT_LENGTH_HEADER)

  cl = headers[CONTENT_LENGTH_HEADER].to_i
  raise "Invalid content length" unless cl.to_s == headers[CONTENT_LENGTH_HEADER]

  body = s.read(cl)
  values = JSON.parse(body)
  DAP::ProtocolMessage.from(values)
end

.decode_all(s) ⇒ Object



42
43
44
45
46
# File 'lib/dap/encoding.rb', line 42

def self.decode_all(s)
  loop do
    yield decode(s)
  end
end

.encode(message) ⇒ Object



31
32
33
34
35
36
37
38
39
40
# File 'lib/dap/encoding.rb', line 31

def self.encode(message)
  raise "Body must be a protocol message" unless message.is_a? DAP::ProtocolMessage

  headers = {}

  body = JSON.dump(message.to_wire)
  headers[CONTENT_LENGTH_HEADER] = body.size

  headers.map { |name, value| "#{name}: #{value}\r\n" }.join + "\r\n" + body
end