mirror of
https://github.com/elastic/logstash.git
synced 2025-04-24 22:57:16 -04:00
62 lines
1.4 KiB
Ruby
62 lines
1.4 KiB
Ruby
require 'rubygems'
|
|
require 'lib/net/common'
|
|
require 'json'
|
|
|
|
module LogStash; module Net
|
|
class MessagePacket
|
|
# 4 byte length
|
|
# 4 byte checksum
|
|
HEADERSIZE = 8
|
|
|
|
def self.each(data)
|
|
done = false
|
|
while !done
|
|
have = data.length
|
|
need = HEADERSIZE
|
|
if have >= need
|
|
need = data.unpack("N")[0] + HEADERSIZE
|
|
if have >= need
|
|
yield MessagePacket.new_from_encoded(data[0 .. need - 1])
|
|
else
|
|
done = true
|
|
end
|
|
else
|
|
done = true
|
|
end
|
|
data[0 .. need - 1] = ""
|
|
end
|
|
end
|
|
|
|
def self.new_from_encoded(string)
|
|
len = string.unpack("N")[0]
|
|
len, checksum, data = string.unpack("NNA#{len}")
|
|
|
|
return MessagePacket.new(data, len=len, checksum=checksum)
|
|
end
|
|
|
|
def initialize(data, len=nil, checksum=nil)
|
|
@content = data
|
|
@length = (len or data.length)
|
|
@checksum = (checksum or data.checksum)
|
|
|
|
verify if length and checksum
|
|
end
|
|
|
|
def verify
|
|
if (@content.checksum != @checksum or @content.length != @length)
|
|
$stderr.puts "FAIL"
|
|
raise MessageCorrupt.new(@checksum, @content)
|
|
end
|
|
end
|
|
|
|
def encode
|
|
return [@length, @checksum, @content].pack("NNA*")
|
|
end
|
|
|
|
public
|
|
attr_reader :length
|
|
attr_reader :content
|
|
attr_reader :checksum
|
|
|
|
end # class MessagePacket
|
|
end; end # module LogStash::Net
|