module MockDnsServer::MessageHelper
Constants
- MESSAGE_LENGTH_PACK_UNPACK_FORMAT
Public Class Methods
convertible_to_dnsruby_message?(object)
click to toggle source
# File lib/mock_dns_server/message_helper.rb, line 24 def self.convertible_to_dnsruby_message?(object) to_dns_message(object).is_a?(Dnsruby::Message) end
read_tcp_message(socket)
click to toggle source
Reads a message from a TCP connection. First gets the 2 byte length, then reads the payload. Attempts to convert the payload into a Dnsruby::Message
.
# File lib/mock_dns_server/message_helper.rb, line 54 def self.read_tcp_message(socket) message_len_str = socket.read(2) raise "Unable to read from socket; read returned nil" if message_len_str.nil? message_len = message_len_str.unpack(MESSAGE_LENGTH_PACK_UNPACK_FORMAT).first bytes_not_yet_read = message_len message_wire_data = '' while bytes_not_yet_read > 0 str = socket.read(bytes_not_yet_read) bytes_not_yet_read -= str.size message_wire_data << str end message = MessageHelper.to_dns_message(message_wire_data) message end
send_udp_and_get_response(message, host, port)
click to toggle source
Sends a UDP message and returns the response, using a temporary socket.
# File lib/mock_dns_server/message_helper.rb, line 75 def self.send_udp_and_get_response(message, host, port) socket = UDPSocket.new message = message.encode if message.is_a?(Dnsruby::Message) socket.send(message, 0, host, port) _, _, _ = IO.select([socket], nil, nil) response_data, _ = socket.recvfrom(10_000) response = to_dns_message(response_data) socket.close response end
tcp_message_package_for_write(message)
click to toggle source
Builds a string for a TCP client to send to a DNS server
@param message, either a DNS message or a string @return if message is a Dnsruby::Message
, returns the wire_data prepended with the 2-byte size field
else returns the message unchanged
# File lib/mock_dns_server/message_helper.rb, line 35 def self.tcp_message_package_for_write(message) message = message.encode if message.is_a?(Dnsruby::Message) size_field = [message.size].pack(MESSAGE_LENGTH_PACK_UNPACK_FORMAT) size_field + message end
to_dns_message(object)
click to toggle source
If the string can convert to a Dnsruby::Message
without throwing an exception, return the Dnsruby::Message
instance; else, return the original string.
# File lib/mock_dns_server/message_helper.rb, line 10 def self.to_dns_message(object) case object when String begin Dnsruby::Message.decode(object) rescue object end when Dnsruby::Message object end end
udp_message_package_for_write(object)
click to toggle source
# File lib/mock_dns_server/message_helper.rb, line 42 def self.udp_message_package_for_write(object) case object when Dnsruby::Message object.encode when String object end end