def read(how_much, dst_buf = nil)
if @part_no >= @parts.size
dst_buf.replace("") if dst_buf
return dst_buf
end
how_much_current_part = @parts[@part_no].size - @part_offset
how_much_current_part = if how_much_current_part > how_much
how_much
else
how_much_current_part
end
how_much_next_part = how_much - how_much_current_part
current_part = @parts[@part_no].read(@part_offset, how_much_current_part)
if how_much_next_part > 0
@part_no += 1
@part_offset = 0
next_part = read(how_much_next_part)
result = current_part + (next_part || "")
else
@part_offset += how_much_current_part
result = current_part
end
dst_buf ? dst_buf.replace(result || "") : result
end