Module: RubyDNS::TCPHandler
- Includes:
- Peername
- 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.
Methods included from Peername
Instance Method Details
#initialize(server) ⇒ Object
105 106 107 108 109 110 111 112 |
# File 'lib/rubydns/handler.rb', line 105 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.
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# File 'lib/rubydns/handler.rb', line 115 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) = {:connection => 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.
150 151 152 153 154 |
# File 'lib/rubydns/handler.rb', line 150 def unbind if @processed != @buffer.size raise LengthError.new("Unprocessed data remaining (#{@buffer.size - @processed} bytes unprocessed)") end end |