read_body

in lib/puma/server.rb [903:949]


    def read_body(env, client, body, cl)
      content_length = cl.to_i

      remain = content_length - body.bytesize

      return StringIO.new(body) if remain <= 0

      
      if remain > MAX_BODY
        stream = Tempfile.new(Const::PUMA_TMP_BASE)
        stream.binmode
      else
        
        
        stream = StringIO.new body[0,0]
      end

      stream.write body

      
      
      chunk = client.readpartial(remain % CHUNK_SIZE)

      
      unless chunk
        stream.close
        return nil
      end

      remain -= stream.write(chunk)

      
      while remain > 0
        chunk = client.readpartial(CHUNK_SIZE)
        unless chunk
          stream.close
          return nil
        end

        remain -= stream.write(chunk)
      end

      stream.rewind

      return stream
    end