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



174
175
176
# File 'lib/rubydns/resolver.rb', line 174

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

Instance Method Details

#initialize(request) ⇒ Object



178
179
180
181
182
# File 'lib/rubydns/resolver.rb', line 178

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

#post_initObject



184
185
186
187
188
189
# File 'lib/rubydns/resolver.rb', line 184

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

#receive_data(data) ⇒ Object



191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
# File 'lib/rubydns/resolver.rb', line 191

def receive_data(data)
	# We buffer data until we've received the entire packet:
	@buffer ||= BinaryStringIO.new
	@buffer.write(data)

	if @length == nil
		if @buffer.size > 2
			@length = @buffer.string.byteslice(0, 2).unpack('n')[0]
		end
	end

	if @buffer.size == (@length + 2)
		data = @buffer.string.byteslice(2, @length)
		
		message = RubyDNS::decode_message(data)
		
		if message.id == @request.message.id
			@request.process_response!(message)
		else
			@request.logger.warn "[#{@request.message.id}] Received response with incorrect message id: #{message.id}" if @request.logger
		end
	elsif @buffer.size > (@length + 2)
		@request.try_next_server!
	end
end