def get_rsync_path(self): url = self.parsed_url.url_string m = re.search("(:\d+|)?::([^:]*)$", url) if m: return m.group(2), m.group(1).lstrip(':') raise InvalidBackendURL("Could not determine rsync path: %s" "" % self.munge_password(url))
def __init__(self, url_string): self.url_string = url_string # Python < 2.6.5 still examine urlparse.uses_netlock when parsing urls, # so stuff our custom list in there before we parse. urlparse.uses_netloc = uses_netloc # While useful in some cases, the fact is that the urlparser makes # all the properties in the URL deferred or lazy. This means that # problems don't get detected till called. We'll try to trap those # problems here, so they will be caught early. try: pu = urlparse.urlparse(url_string) except Exception: raise InvalidBackendURL("Syntax error in: %s" % url_string) try: self.scheme = pu.scheme except Exception: raise InvalidBackendURL("Syntax error (scheme) in: %s" % url_string) try: self.netloc = pu.netloc except Exception: raise InvalidBackendURL("Syntax error (netloc) in: %s" % url_string) try: self.path = pu.path if self.path: self.path = urllib.unquote(self.path) except Exception: raise InvalidBackendURL("Syntax error (path) in: %s" % url_string) try: self.username = pu.username except Exception: raise InvalidBackendURL("Syntax error (username) in: %s" % url_string) if self.username: self.username = urllib.unquote(pu.username) else: self.username = None try: self.password = pu.password except Exception: raise InvalidBackendURL("Syntax error (password) in: %s" % url_string) if self.password: self.password = urllib.unquote(self.password) else: self.password = None try: self.hostname = pu.hostname except Exception: raise InvalidBackendURL("Syntax error (hostname) in: %s" % url_string) # init to None, overwrite with actual value on success self.port = None try: self.port = pu.port except Exception: # not raised in python2.7+, just returns None # old style rsync://host::[/]dest, are still valid, though they contain no port if not (self.scheme in ['rsync'] and re.search('::[^:]*$', self.url_string)): raise InvalidBackendURL("Syntax error (port) in: %s A%s B%s C%s" % (url_string, (self.scheme in ['rsync']), re.search('::[^:]+$', self.netloc), self.netloc)) # Our URL system uses two slashes more than urlparse's does when using # non-netloc URLs. And we want to make sure that if urlparse assuming # a netloc where we don't want one, that we correct it. if self.scheme not in uses_netloc: if self.netloc: self.path = '//' + self.netloc + self.path self.netloc = '' self.hostname = None elif not self.path.startswith('//') and self.path.startswith('/'): self.path = '//' + self.path # This happens for implicit local paths. if not self.scheme: return # Our backends do not handle implicit hosts. if self.scheme in uses_netloc and not self.hostname: raise InvalidBackendURL("Missing hostname in a backend URL which " "requires an explicit hostname: %s" "" % (url_string)) # Our backends do not handle implicit relative paths. if self.scheme not in uses_netloc and not self.path.startswith('//'): raise InvalidBackendURL("missing // - relative paths not supported " "for scheme %s: %s" "" % (self.scheme, url_string))
def __init__(self, url_string): self.url_string = url_string _ensure_urlparser_initialized() # While useful in some cases, the fact is that the urlparser makes # all the properties in the URL deferred or lazy. This means that # problems don't get detected till called. We'll try to trap those # problems here, so they will be caught early. try: pu = urlparser.urlparse(url_string) except Exception: raise InvalidBackendURL("Syntax error in: %s" % url_string) try: self.scheme = pu.scheme except Exception: raise InvalidBackendURL("Syntax error (scheme) in: %s" % url_string) try: self.netloc = pu.netloc except Exception: raise InvalidBackendURL("Syntax error (netloc) in: %s" % url_string) try: self.path = pu.path except Exception: raise InvalidBackendURL("Syntax error (path) in: %s" % url_string) try: self.username = pu.username except Exception: raise InvalidBackendURL("Syntax error (username) in: %s" % url_string) if self.username: self.username = urllib.unquote(pu.username) else: self.username = None try: self.password = pu.password except Exception: raise InvalidBackendURL("Syntax error (password) in: %s" % url_string) if self.password: self.password = urllib.unquote(self.password) else: self.password = None try: self.hostname = pu.hostname except Exception: raise InvalidBackendURL("Syntax error (hostname) in: %s" % url_string) # init to None, overwrite with actual value on success self.port = None try: self.port = pu.port except Exception: # old style rsync://host::[/]dest, are still valid, though they contain no port if not (self.scheme in ['rsync'] and re.search('::[^:]*$', self.url_string)): raise InvalidBackendURL( "Syntax error (port) in: %s A%s B%s C%s" % (url_string, (self.scheme in ['rsync']), re.search('::[^:]+$', self.netloc), self.netloc)) # This happens for implicit local paths. if not pu.scheme: return # Our backends do not handle implicit hosts. if pu.scheme in urlparser.uses_netloc and not pu.hostname: raise InvalidBackendURL("Missing hostname in a backend URL which " "requires an explicit hostname: %s" "" % (url_string)) # Our backends do not handle implicit relative paths. if pu.scheme not in urlparser.uses_netloc and not pu.path.startswith( '//'): raise InvalidBackendURL( "missing // - relative paths not supported " "for scheme %s: %s" "" % (pu.scheme, url_string))