lib/falcon/adapters/input.rb in falcon-0.15.1 vs lib/falcon/adapters/input.rb in falcon-0.15.2
- old
+ new
@@ -46,18 +46,35 @@
@index = 0
@finished = false
@buffer.clear
end
+ # Read some data from the underlying body. Similar to `IO#read`.
+ # @param length [Integer] the amount of data to read
+ # @param buffer [String] the buffer which will receive the data
+ # @return a buffer containing the data
def read(length = nil, buffer = nil)
if length
fill_buffer(length) if @buffer.bytesize <= length
- return @buffer.slice!(0, length)
+ chunk = @buffer.slice!(0, length)
+
+ if buffer
+ # TODO https://bugs.ruby-lang.org/issues/14745
+ buffer.replace(chunk)
+ else
+ buffer = chunk
+ end
+
+ if buffer.empty? and length > 0
+ return nil
+ else
+ return buffer
+ end
else
buffer ||= Async::IO::BinaryString.new
- buffer << @buffer
+ buffer.replace(@buffer)
@buffer.clear
while chunk = read_next
buffer << chunk
end