def METHOD_NAME(self, pfn):
    """
        Splits the given PFN into the parts known by the protocol. During parsing the PFN is also checked for
        validity on the given RSE with the given protocol.
        :param pfn: a fully qualified PFN
        :returns: a dict containing all known parts of the PFN for the protocol e.g. scheme, hostname, port, prefix, path, filename
        :raises RSEFileNameNotSupported: if the provided PFN doesn't match with the protocol settings
    """
    parsed = urlparse(pfn)
    ret = dict()
    ret['scheme'] = parsed.scheme
    ret['hostname'] = parsed.netloc.partition(':')[0]
    ret['port'] = int(parsed.netloc.partition(':')[2]) if parsed.netloc.partition(':')[2] != '' else 0
    ret['path'] = parsed.path
    # Protect against 'lazy' defined prefixes for RSEs in the repository
    self.rse['prefix'] = '' if self.rse['prefix'] is None else self.rse['prefix']
    if not self.rse['prefix'].startswith('/'):
        self.rse['prefix'] = '/' + self.rse['prefix']
    if not self.rse['prefix'].endswith('/'):
        self.rse['prefix'] += '/'
    if self.rse['hostname'] != ret['hostname']:
        raise exception.RSEFileNameNotSupported('Invalid hostname: provided \'%s\', expected \'%s\'' % (ret['hostname'], self.rse['hostname']))
    if not ret['path'].startswith(self.rse['prefix']):
        raise exception.RSEFileNameNotSupported('Invalid prefix: provided \'%s\', expected \'%s\'' % ('/'.join(ret['path'].split('/')[0:len(self.rse['prefix'].split('/')) - 1]),
                                                                                                      self.rse['prefix']))  # len(...)-1 due to the leading '/
    # Spliting parsed.path into prefix, path, filename
    ret['prefix'] = self.rse['prefix']
    ret['path'] = ret['path'].partition(self.rse['prefix'])[2]
    ret['name'] = ret['path'].split('/')[-1]
    ret['path'] = ret['path'].partition(ret['name'])[0]
    return ret