247: def receive_data data
248: @logchunk << data
249: decompose = true
250: while decompose
251: unless @length
252: if @logchunk.length > 7
253: l = @logchunk[0..3].unpack(Ci).first
254: ck = @logchunk[4..7].unpack(Ci).first
255: if l == ck and l < MaxMessageLength
256: @length = l + 7
257: else
258: decompose = false
259: peer = get_peername
260: peer = peer ? ::Socket.unpack_sockaddr_in(peer)[1] : 'UNK'
261: if l == ck
262: LoggerClass.add_log([:default,:error,"Max Length Exceeded from #{peer} -- #{l}/#{MaxMessageLength}"])
263: close_connection
264: else
265: LoggerClass.add_log([:default,:error,"checksum failed from #{peer} -- #{l}/#{ck}"])
266: close_connection
267: end
268: end
269: end
270: end
271:
272: if @length and @logchunk.length > @length
273: msg = @logchunk.slice!(0..@length).split(Rcolon,4)
274: unless @authenticated
275: if msg.last == LoggerClass.key
276: @authenticated = true
277: else
278: close_connection
279: end
280: else
281: msg[0] = nil
282: msg.shift
283: LoggerClass.add_log(msg)
284: end
285: @length = nil
286: else
287: decompose = false
288: end
289: end
290: end