Module: RubyDNS::Resolver::Request::TCPRequestHandler

Defined in:
lib/rubydns/resolver.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.open(host, port, request) ⇒ Object



222
223
224
# File 'lib/rubydns/resolver.rb', line 222

def self.open(host, port, request)
	EventMachine::connect(host, port, TCPRequestHandler, request)
end

Instance Method Details

#initialize(request) ⇒ Object



226
227
228
229
230
# File 'lib/rubydns/resolver.rb', line 226

def initialize(request)
	@request = request
	@buffer = nil
	@length = nil
end

#post_initObject



232
233
234
235
236
237
# 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) ⇒ Object



239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
# 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