docs: def getAssociationFilename(self, server_url, handle):
          """Create a unique filename for a given server url and
          handle. This implementation does not assume anything about the
          format of the handle. The filename that is returned will
          contain the domain name from the server URL for ease of human
          inspection of the data directory.
  
          (str, str) -> str
          """
          if server_url.find('://') == -1:
              raise ValueError('Bad server URL: %r' % server_url)
  
          proto, rest = server_url.split('://', 1)
          domain = _filenameEscape(rest.split('/', 1)[0])
          url_hash = _safe64(server_url)
          if handle:
              handle_hash = _safe64(handle)
          else:
              handle_hash = ''
  
          filename = '%s-%s-%s-%s' % (proto, domain, url_hash, handle_hash)
  
          return os.path.join(self.association_dir, filename)