31
32
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
# File 'lib/zabbix_protocol.rb', line 31
def self.load(data)
unless data.is_a?(String)
raise TypeError, "wrong argument type #{data.class} (expected String)"
end
original_encoding = data.encoding
data = data.dup
data.force_encoding('ASCII-8BIT')
if data.bytesize < MIN_DATA_LEN
raise Error, "data length is too short (data: #{data.inspect})"
end
sliced = data.dup
= sliced.slice!(0, ZABBIX_HEADER.bytesize)
if != ZABBIX_HEADER
raise Error, "invalid header: #{.inspect} (data: #{data.inspect})"
end
version = sliced.slice!(0, ZABBIX_VERSION.bytesize)
if version != ZABBIX_VERSION
raise Error, "unsupported version: #{version.inspect} (data: #{data.inspect})"
end
payload_len = sliced.slice!(0, PAYLOAD_LEN_BYTES)
payload_len = payload_len.unpack('Q<').first
if payload_len != sliced.bytesize
raise Error, "invalid payload length: expected=#{payload_len}, actual=#{sliced.bytesize} (data: #{data.inspect})"
end
duplicated = sliced.dup
begin
duplicated.force_encoding(original_encoding)
sliced = duplicated
rescue
end
begin
MultiJson.load(sliced)
rescue MultiJson::ParseError
sliced
end
end
|