Module: RubyDNS::TCPHandler
- Defined in:
- lib/rubydns/handler.rb
Instance Method Summary collapse
- #initialize(server) ⇒ Object
-
#receive_data(data) ⇒ Object
Receive the data via a TCP connection, process messages when we receive the indicated amount of data.
-
#unbind ⇒ Object
Check that all data received was processed.
Instance Method Details
#initialize(server) ⇒ Object
95 96 97 98 99 100 101 102 |
# File 'lib/rubydns/handler.rb', line 95 def initialize(server) @server = server @buffer = BinaryStringIO.new @length = nil @processed = 0 end |
#receive_data(data) ⇒ Object
Receive the data via a TCP connection, process messages when we receive the indicated amount of data.
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/rubydns/handler.rb', line 105 def receive_data(data) # We buffer data until we've received the entire packet: @buffer.write(data) # Message includes a 16-bit length field.. we need to see if we have received it yet: if @length == nil if (@buffer.size - @processed) < 2 raise LengthError.new("Malformed message smaller than two bytes received") end # Grab the length field: @length = @buffer.string.byteslice(@processed, 2).unpack('n')[0] @processed += 2 end if (@buffer.size - @processed) >= @length data = @buffer.string.byteslice(@processed, @length) = {: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 TCP..." self.send_data([data.bytesize].pack('n')) self.send_data(data) end @processed += @length @length = nil end end |
#unbind ⇒ Object
Check that all data received was processed.
140 141 142 143 144 |
# File 'lib/rubydns/handler.rb', line 140 def unbind if @processed != @buffer.size raise LengthError.new("Unprocessed data remaining (#{@buffer.size - @processed} bytes unprocessed)") end end |