class Gem::Resolv::DNS::Message::MessageEncoder
:nodoc:
def initialize
def initialize @data = ''.dup @names = {} yield self end
def put_bytes(d)
def put_bytes(d) @data << d end
def put_label(d)
def put_label(d) self.put_string(d.to_s) end
def put_labels(d, compress: true)
def put_labels(d, compress: true) d.each_index {|i| domain = d[i..-1] if compress && idx = @names[domain] self.put_pack("n", 0xc000 | idx) return else if @data.length < 0x4000 @names[domain] = @data.length end self.put_label(d[i]) end } @data << "\0" end
def put_length16
def put_length16 length_index = @data.length @data << "\0\0" data_start = @data.length yield data_end = @data.length @data[length_index, 2] = [data_end - data_start].pack("n") end
def put_name(d, compress: true)
def put_name(d, compress: true) put_labels(d.to_a, compress: compress) end
def put_pack(template, *d)
def put_pack(template, *d) @data << d.pack(template) end
def put_string(d)
def put_string(d) self.put_pack("C", d.length) @data << d end
def put_string_list(ds)
def put_string_list(ds) ds.each {|d| self.put_string(d) } end
def to_s
def to_s return @data end