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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
# File 'lib/arf/wire/frame_reader.rb', line 37
def feed(b)
case @state
when :magic
@data.write(b)
return nil if @data.length < 3
if @data.string != Frame::MAGIC
@data.reset
raise MagicNumberMismatchError
end
@data.reset
@state = :stream_id
when :stream_id
@data.write(b)
return nil if @data.length < 4
@data.rewind
@fr.stream_id = Wire.decode_uint32(@data)
@data.reset
@state = :kind
when :kind
raw_frame_kind = b
frame_kind = Wire::FRAME_TO_SYMBOL[raw_frame_kind]
raise UnknownFrameKindError, raw_frame_kind unless frame_kind
@fr.frame_kind = frame_kind
@state = :flags
when :flags
@fr.flags = b
@state = :length
when :length
@data.write(b)
return nil if @data.length < 2
@data.rewind
@fr.length = Wire.decode_uint16(@data)
@data.reset
@state = :payload
if @fr.empty?
@state = :magic
frame = @fr
@fr = Frame.new
return frame
end
when :payload
@data.write(b)
return nil if @data.length < @fr.length
@fr.payload = @data.
@fr.payload.rewind
@data = IO::Buffer.new
@state = :magic
@data.reset
frame = @fr
@fr = Frame.new
return frame
end
nil
end
|