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