Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

url.py 2.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from __future__ import absolute_import
  2. from functools import partial
  3. try:
  4. from urllib.parse import parse_qsl, quote, unquote, urlparse
  5. except ImportError:
  6. from urllib import quote, unquote # noqa
  7. from urlparse import urlparse, parse_qsl # noqa
  8. from . import kwdict
  9. from kombu.five import string_t
  10. safequote = partial(quote, safe='')
  11. def _parse_url(url):
  12. scheme = urlparse(url).scheme
  13. schemeless = url[len(scheme) + 3:]
  14. # parse with HTTP URL semantics
  15. parts = urlparse('http://' + schemeless)
  16. path = parts.path or ''
  17. path = path[1:] if path and path[0] == '/' else path
  18. return (scheme, unquote(parts.hostname or '') or None, parts.port,
  19. unquote(parts.username or '') or None,
  20. unquote(parts.password or '') or None,
  21. unquote(path or '') or None,
  22. kwdict(dict(parse_qsl(parts.query))))
  23. def parse_url(url):
  24. scheme, host, port, user, password, path, query = _parse_url(url)
  25. return dict(transport=scheme, hostname=host,
  26. port=port, userid=user,
  27. password=password, virtual_host=path, **query)
  28. def as_url(scheme, host=None, port=None, user=None, password=None,
  29. path=None, query=None, sanitize=False, mask='**'):
  30. parts = ['{0}://'.format(scheme)]
  31. if user or password:
  32. if user:
  33. parts.append(safequote(user))
  34. if password:
  35. if sanitize:
  36. parts.extend([':', mask] if mask else [':'])
  37. else:
  38. parts.extend([':', safequote(password)])
  39. parts.append('@')
  40. parts.append(safequote(host) if host else '')
  41. if port:
  42. parts.extend([':', port])
  43. parts.extend(['/', path])
  44. return ''.join(str(part) for part in parts if part)
  45. def sanitize_url(url, mask='**'):
  46. return as_url(*_parse_url(url), sanitize=True, mask=mask)
  47. def maybe_sanitize_url(url, mask='**'):
  48. if isinstance(url, string_t) and '://' in url:
  49. return sanitize_url(url, mask)
  50. return url