Skip to content

Commit

Permalink
refactored frame protocol receive_data
Browse files Browse the repository at this point in the history
  • Loading branch information
steve committed Jan 25, 2009
1 parent 2d6d226 commit 2faf2e1
Showing 1 changed file with 16 additions and 24 deletions.
40 changes: 16 additions & 24 deletions lib/rtunnel/frame_protocol.rb
Original file line number Diff line number Diff line change
@@ -1,39 +1,31 @@
# eventmachine protocol
module RTunnel::FrameProtocol
def receive_data(data)
@frame_incomplete ||= ''
@incomplete_frame ||= ''

i = 0
loop do
# read the frame size
while i < data.length and @frame_buffer.nil?
@frame_incomplete << data[i]
# completed frame
while @frame_buffer.nil? and i < data.size
@incomplete_frame << data[i]
if (data[i] & 0x80) == 0
@frame_incomplete = StringIO.new(@frame_incomplete).read_varsize
@remaining_frame_size = StringIO.new(@incomplete_frame).read_varsize
@frame_buffer = ''
end
i += 1
end

break unless @frame_buffer

if @frame_incomplete <= data.length - i
# break off frame
if @frame_buffer.empty?
receive_frame data[i, @frame_incomplete]
else
receive_frame @frame_buffer + data[i, @frame_incomplete]
end
i += @frame_incomplete
@frame_incomplete, @frame_buffer = '', nil
else
# buffer frame fragment
@frame_buffer << data[i..-1]
@frame_incomplete -= data.length - i
break
end

return if @frame_buffer.nil?

remaining_bytes = data.size - i
break if @remaining_frame_size > remaining_bytes

receive_frame(@frame_buffer + data[i, @remaining_frame_size])
@incomplete_frame, @frame_buffer = '', nil
i += @remaining_frame_size
end

@frame_buffer << data[i..-1]
@remaining_frame_size -= data.size-i
end

def send_frame(frame_data)
Expand Down

0 comments on commit 2faf2e1

Please sign in to comment.