Module: RubyDNS::UDPHandler
- Defined in:
- lib/rubydns/handler.rb
Class Method Summary collapse
Instance Method Summary collapse
Class Method Details
.process(server, data, options = {}, &block) ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/rubydns/handler.rb', line 34 def self.process(server, data, = {}, &block) server.logger.debug "Receiving incoming query (#{data.bytesize} bytes)..." query = nil begin query = RubyDNS::(data) return server.process_query(query, , &block) rescue server.logger.error "Error processing request!" server.logger.error "#{$!.class}: #{$!.}" $!.backtrace.each { |at| server.logger.error at } # Encoding may fail, so we need to handle this particular case: server_failure = Resolv::DNS::Message::new(query ? query.id : 0) server_failure.qr = 1 server_failure.opcode = query ? query.opcode : 0 server_failure.aa = 1 server_failure.rd = 0 server_failure.ra = 0 server_failure.rcode = Resolv::DNS::RCode::ServFail # We can't do anything at this point... yield server_failure end end |
Instance Method Details
#initialize(server) ⇒ Object
30 31 32 |
# File 'lib/rubydns/handler.rb', line 30 def initialize(server) @server = server end |
#receive_data(data) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/rubydns/handler.rb', line 63 def receive_data(data) = {:peer => RubyDNS::get_peer_details(self)} UDPHandler.process(@server, data, ) do |answer| data = answer.encode @server.logger.debug "Writing response to client (#{data.bytesize} bytes) via UDP..." if data.bytesize > UDP_TRUNCATION_SIZE @server.logger.warn "Response via UDP was larger than #{UDP_TRUNCATION_SIZE}!" # Reencode data with truncation flag marked as true: truncation_error = Resolv::DNS::Message.new(answer.id) truncation_error.tc = 1 data = truncation_error.encode end self.send_data(data) end end |