Module: RubyDNS::UDPHandler
- Defined in:
- lib/rubydns/handler.rb
Constant Summary collapse
- UDP_TRUNCATION_SIZE =
512
Class Method Summary collapse
Instance Method Summary collapse
Class Method Details
.process(server, data, &block) ⇒ Object
33 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 |
# File 'lib/rubydns/handler.rb', line 33 def self.process(server, data, &block) server.logger.debug "Receiving incoming query (#{data.bytesize} bytes)..." query = nil begin query = Resolv::DNS::Message::decode(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
29 30 31 |
# File 'lib/rubydns/handler.rb', line 29 def initialize(server) @server = server end |
#receive_data(data) ⇒ Object
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/rubydns/handler.rb', line 62 def receive_data(data) 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: answer.tc = 1 data = answer.encode.byteslice(0,UDP_TRUNCATION_SIZE) end self.send_data(data) end end |