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



197
198
199
# File 'lib/rubydns/resolver.rb', line 197

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

Instance Method Details

#initialize(request) ⇒ Object



201
202
203
204
205
# File 'lib/rubydns/resolver.rb', line 201

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

#post_initObject



207
208
209
210
211
212
# File 'lib/rubydns/resolver.rb', line 207

def post_init
	data = @request.packet
	
	send_data([data.bytesize].pack('n'))
	send_data data
end

#receive_data(data) ⇒ Object



214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# File 'lib/rubydns/resolver.rb', line 214

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