module DAP::Encoding

Encoding and decoding for DAP messages

Constants

CONTENT_LENGTH_HEADER

The name of the content length header.

Public Class Methods

decode(s) click to toggle source

Decode a DAP message from the stream. @param s [IO] the stream @return [ProtocolMessage] the message

# File lib/dap/encoding.rb, line 9
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) { |decode(s)| ... } click to toggle source

Decode all DAP messages from the stream. @param s [IO] the stream @yield Invokes the block for each message

# File lib/dap/encoding.rb, line 53
def self.decode_all(s)
  loop do
    yield decode(s)
  end
end
encode(message) click to toggle source

Encode a DAP message to a string. @param message [ProtocolMessage] the message @return [String] the encoded message

# File lib/dap/encoding.rb, line 39
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.bytesize

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