docs: def parse_url(url):
      """
      Parse a URL into the parts I need for processing:
          * protocol
          * domain
          * port
          * path
  
      :param url: A string
      :return: A tuple containing the above
      """
      split_url = url.split('/', 3)
      if len(split_url) == 3:
          # http://foo.com
          path = '/'
      elif len(split_url) == 4:
          path = '/' + split_url[3]
      else:
          raise ValueError('Invalid URL: %s' % url)
  
      try:
          parse_result = urlparse(url)
      except Exception:
          raise ValueError('Invalid URL: %s' % url)
  
      protocol = parse_result.scheme
      protocol = protocol.lower()
      if protocol not in ('http', 'https'):
          raise ValueError('Invalid URL protocol "%s"' % protocol)
  
      split_netloc = parse_result.netloc.split(':')
      domain = split_netloc[0]
      domain = domain.lower()
  
      if len(split_netloc) == 2:
          try:
              port = int(split_netloc[1])
          except:
              raise ValueError('Invalid port: "%s"' % split_netloc[1])
      elif protocol == 'https':
          port = 443
      elif protocol == 'http':
          port = 80
      else:
          raise ValueError('Invalid scheme: "%s"' % protocol)
  
      return protocol, domain, port, path