# File lib/net/amazon/s3/bucket.rb, line 82
    def get_objects(prefix = '')
      prefix = prefix.toutf8
    
      if @s3.options[:enable_cache] && !@cache[:objects].nil? &&
          !@cache[:objects][prefix].nil?
        return @cache[:objects][prefix]
      end
      
      if @cache[:objects].nil?
        @cache[:objects] = {}
      end
      
      objects      = {}
      request_uri  = "/#{@name}?prefix=#{URI.escape(prefix)}"
      is_truncated = true
      
      # The request is made in a loop because the S3 API limits results to pages
      # of 1,000 objects by default, so if there are more than 1,000 objects,
      # we'll have to send more requests to get them all.
      while is_truncated do
        response = @s3.request_get(request_uri)
        @s3.error?(response)
        
        xml = REXML::Document.new(response.body)
        
        if xml.root.elements['IsTruncated'].text == 'false'
          is_truncated = false
        else
          request_uri = "/#{@name}?prefix=#{URI.escape(prefix)}&marker=" +
              xml.root.elements.to_a('Contents').last.elements['Key'].text
        end
        
        next if xml.root.elements['Contents'].nil?
  
        xml.root.elements.each('Contents') do |element|
          object_key           = element.elements['Key'].text
          object_size          = element.elements['Size'].text
          object_etag          = element.elements['ETag'].text
          object_last_modified = Time.parse(
              element.elements['LastModified'].text)
          
          objects[object_key] = S3::Object.new(@s3, self, object_key,
              object_size, object_etag, object_last_modified)
        end
      end

      return @cache[:objects][prefix] = objects
    end