# File lib/uber-s3/object.rb, line 52
    def save
      headers = {}
      
      # Encode data if necessary
      gzip_content!
      
      # Standard pass through values
      headers['Content-Disposition']  = content_disposition
      headers['Content-Encoding']     = content_encoding
      headers['Content-Length']       = size.to_s
      headers['Content-Type']         = content_type
      headers['Cache-Control']        = cache_control
      headers['Expires']              = expires
      headers['Pragma']               = pragma

      headers.each {|k,v| headers.delete(k) if v.nil? || v.empty? }

      # Content MD5 integrity check
      if !content_md5.nil?
        self.content_md5 = Digest::MD5.hexdigest(value) if content_md5 == true

        # We expect a md5 hex digest here
        md5_digest = content_md5.unpack('a2'*16).collect {|i| i.hex.chr }.join
        headers['Content-MD5'] = Base64.encode64(md5_digest).strip
      end

      # ACL
      if !access.nil?
        headers['x-amz-acl'] = access.to_s.gsub('_', '-')
      end
      
      # Storage class
      if !storage_class.nil?
        headers['x-amz-storage-class'] = storage_class.to_s.upcase
      end

      # Meta
      if !meta.nil? && !meta.empty?
        meta.each {|k,v| headers["x-amz-meta-#{k}"] = v.to_s }
      end
      
      # Let's do it
      response = bucket.connection.put(key, headers, value)
      
      # Update error state
      self.error = response.error
      
      # Test for success....
      response.status == 200      
    end