RubyDNS::Resolver::Request::TCPRequestHandler

Public Class Methods

new(request) click to toggle source
# File lib/rubydns/resolver.rb, line 226
def initialize(request)
        @request = request
        @buffer = nil
        @length = nil
end
open(host, port, request) click to toggle source
# File lib/rubydns/resolver.rb, line 222
def self.open(host, port, request)
        EventMachine::connect(host, port, TCPRequestHandler, request)
end

Public Instance Methods

post_init() click to toggle source
# File lib/rubydns/resolver.rb, line 232
def post_init
        data = @request.packet
        
        send_data([data.bytesize].pack('n'))
        send_data data
end
receive_data(data) click to toggle source
# File lib/rubydns/resolver.rb, line 239
def receive_data(data)
        # We buffer data until we've received the entire packet:
        @buffer ||= BinaryStringIO.new
        @buffer.write(data)

        # If we've received enough data and we haven't figured out the length yet...
        if @length == nil and @buffer.size > 2
                # Extract the length from the buffer:
                @length = @buffer.string.byteslice(0, 2).unpack('n')[0]
        end

        # If we know what the length is, and we've got that much data, we can decode the message:
        if @length != nil and @buffer.size >= (@length + 2)
                data = @buffer.string.byteslice(2, @length)
                
                message = RubyDNS::decode_message(data)
                
                @request.process_response!(message)
        end
        
        # If we have received more data than expected, should this be an error?
rescue Resolv::DNS::DecodeError => error
        @request.process_response!(error)
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.