# File lib/rack/multipart/parser.rb, line 12
      def parse
        return nil unless setup_parse

        fast_forward_to_first_boundary

        max_key_space = Utils.key_space_limit
        bytes = 0

        loop do
          head, filename, content_type, name, body =
            get_current_head_and_filename_and_content_type_and_name_and_body

          # Save the rest.
          if i = @buf.index(rx)
            body << @buf.slice!(0, i)
            @buf.slice!(0, @boundary_size+2)

            @content_length = -1  if $1 == "--"
          end

          filename, data = get_data(filename, body, content_type, name, head)

          if name
            bytes += name.size
            if bytes > max_key_space
              raise RangeError, "exceeded available parameter key space"
            end
          end

          Utils.normalize_params(@params, name, data) unless data.nil?

          # break if we're at the end of a buffer, but not if it is the end of a field
          break if (@buf.empty? && $1 != EOL) || @content_length == -1
        end

        @io.rewind

        @params
      end