class HrrRbNetconf::Server::Capability::Base_1_1::Sender

Constants

MAX_CHUNK_SIZE

Public Class Methods

new(io_w, logger: nil) click to toggle source
# File lib/hrr_rb_netconf/server/capability/base_1_1.rb, line 103
def initialize io_w, logger: nil
  self.logger = logger
  @io_w = io_w
  @formatter = REXML::Formatters::Pretty.new(2)
  @formatter.compact = true
end

Public Instance Methods

send_message(msg) click to toggle source
# File lib/hrr_rb_netconf/server/capability/base_1_1.rb, line 110
def send_message msg
  raw_msg = StringIO.new
  case msg
  when String
    begin
      @formatter.write(REXML::Document.new(msg, {:ignore_whitespace_nodes => :all}).root, raw_msg)
    rescue => e
      log_error { "Invalid sending message: #{msg.inspect}: #{e.message}" }
      raise "Invalid sending message: #{msg.inspect}: #{e.message}"
    end
  when REXML::Document
    @formatter.write(msg.root, raw_msg)
  when REXML::Element
    @formatter.write(msg, raw_msg)
  else
    log_error { "Unexpected sending message: #{msg.inspect}" }
    raise ArgumentError, "Unexpected sending message: #{msg.inspect}"
  end
  log_debug { "Sending message: #{raw_msg.string.inspect}" }
  raw_msg.rewind
  encoded_msg = StringIO.new
  until raw_msg.eof?
    chunk_size = rand(1..MAX_CHUNK_SIZE)
    chunk_data = raw_msg.read(chunk_size)
    encoded_msg.write "\n##{chunk_data.size}\n#{chunk_data}"
  end
  encoded_msg.write "\n##\n"
  log_debug { "Sending encoded message: #{encoded_msg.string.inspect}" }
  begin
    @io_w.write encoded_msg.string
  rescue => e
    log_info { "Sender IO closed: #{e.class}: #{e.message}" }
    raise IOError, "Sender IO closed: #{e.class}: #{e.message}"
  end
end