def decode(a): return decodestr(a.decode('ascii'))
def parse(s): s=str(s) self=URL() schB=0 schE=s.find(':', schB) if schE == -1: raise InvalidURL(s) self.protocol=s[schB:schE] if s[schE+1:schE+3] == '//': authB=schE+3 authE=s.find('/', authB) if authE == -1: authE=len(s) auth=s[authB:authE] usrB=0 usrE=auth.find('@', usrB) if usrE != -1: pwdB=usrB pwdE=auth.find(':', pwdB) if pwdE != -1: self.passwotd=decodestr(auth[pwdB:pwdE]) usrB=pwdE+1 self.userinfo=decodestr(auth[usrB:usrE]) domB=usrE+1 domE=auth.rfind(':', domB) if domE != -1: portB=domE+1 portE=len(auth) port=auth[portB:portE] if ']' in port: domE=len(auth) else: self.port=int(port) else: domE=len(auth) self.host=auth[domB:domE] if self.host[:4] == 'xn--': self.host=self.host[4:].encode('ascii').decode('punycode') else: authE=schE if authE == len(s): self.path='/' else: pathB=authE qpE=s.find('#', pathB) if qpE != -1: fB=qpE+1 fE=len(s) self.fragment=decodestr(s[fB:fE]) else: qpE=len(s) pathE=s.find('?', pathB, qpE) if pathE != -1: qB=pathE+1 qE=qpE self.query=decodestr(s[qB:qE]) else: pathE=qpE self.path=decodestr(s[pathB:pathE]) return self