module SvcbRrPatch::SvcParams

Constants

PARAMETER_REGISTRY

Public Class Methods

decode(octet) click to toggle source

@param octet [String]

@return [Hash] Integer => SvcbRrPatch::$Object rubocop:disable Metrics/AbcSize

# File lib/svcb_rr_patch/svc_params.rb, line 43
def self.decode(octet)
  svc_params = {}
  i = 0
  h = Hash[(0..PARAMETER_REGISTRY.size - 1).zip(PARAMETER_REGISTRY)].invert
  while i < octet.length
    raise ::Resolv::DNS::DecodeError if i + 4 > octet.length

    k = octet.slice(i, 2).unpack1('n')
    # SvcParamKeys SHALL appear in increasing numeric order.
    raise ::Resolv::DNS::DecodeError \
      unless svc_params.keys.find { |already| h[already] >= k }.nil?

    i += 2
    vlen = octet.slice(i, 2).unpack1('n')
    i += 2
    raise ::Resolv::DNS::DecodeError if i + vlen > octet.length

    v = octet.slice(i, vlen)
    i += vlen
    # Values are in a format specific to the SvcParamKey.
    svc_param_key = PARAMETER_REGISTRY[k]
    svc_param_values = decode_svc_params(svc_param_key, v)
    svc_params.store(svc_param_key, svc_param_values)
  end
  raise ::Resolv::DNS::DecodeError if i != octet.length

  svc_params
end
encode(svc_params) click to toggle source

@return [String]

# File lib/svcb_rr_patch/svc_params.rb, line 27
def self.encode(svc_params)
  h = Hash[(0..PARAMETER_REGISTRY.size - 1).zip(PARAMETER_REGISTRY)].invert

  svc_params
    .map { |k, v| [h[k], v] }
    .sort { |lh, rh| lh.first <=> rh.first }
    .map do |k, v|
      [k].pack('n') + v.encode.then { |s| [s.length].pack('n') + s }
    end
    .join
end