class HTTP::Message::Body::Parts

def add(part)

def add(part)
  if Message.file?(part)
    @as_stream = true
    @body << part
    if part.respond_to?(:stat)
      sz = part.stat.size
      add_size(part, sz)
    elsif part.respond_to?(:size)
      if sz = part.size
        add_size(part, sz)
      else
        @sizes.clear
        @size = nil
      end
    else
      # use chunked upload
      @sizes.clear
      @size = nil
    end
  elsif @body[-1].is_a?(String)
    @body[-1] += part.to_s
    @size += part.to_s.bytesize if @size
  else
    @body << part.to_s
    @size += part.to_s.bytesize if @size
  end
end

def add_size(part, sz)

def add_size(part, sz)
  if @size
    @sizes[part] = sz
    @size += sz
  end
end

def initialize

def initialize
  @body = []
  @sizes = {}
  @size = 0 # total
  @as_stream = false
end

def parts

def parts
  if @as_stream
    @body
  else
    [@body.join]
  end
end