docs: def fetch_document(url=None, host=None, path="/", timeout=10, raise_ssl_errors=True, extra_headers=None):
      """Helper method to fetch remote document.
  
      Must be given either the ``url`` or ``host``.
      If ``url`` is given, only that will be tried without falling back to http from https.
      If ``host`` given, `path` will be added to it. Will fall back to http on non-success status code.
  
      :arg url: Full url to fetch, including protocol
      :arg host: Domain part only without path or protocol
      :arg path: Path without domain (defaults to "/")
      :arg timeout: Seconds to wait for response (defaults to 10)
      :arg raise_ssl_errors: Pass False if you want to try HTTP even for sites with SSL errors (default True)
      :returns: Tuple of document (str or None), status code (int or None) and error (an exception class instance or None)
      :raises ValueError: If neither url nor host are given as parameters
      """
      if not url and not host:
          raise ValueError("Need url or host.")
  
      logger.debug("fetch_document: url=%s, host=%s, path=%s, timeout=%s, raise_ssl_errors=%s",
                   url, host, path, timeout, raise_ssl_errors)
      headers = {'user-agent': USER_AGENT}
      if extra_headers:
          headers.update(extra_headers)
      if url:
          # Use url since it was given
          logger.debug("fetch_document: trying %s", url)
          try:
              response = requests.get(url, timeout=timeout, headers=headers)
              logger.debug("fetch_document: found document, code %s", response.status_code)
              return response.text, response.status_code, None
          except RequestException as ex:
              logger.debug("fetch_document: exception %s", ex)
              return None, None, ex
      # Build url with some little sanitizing
      host_string = host.replace("http://", "").replace("https://", "").strip("/")
      path_string = path if path.startswith("/") else "/%s" % path
      url = "https://%s%s" % (host_string, path_string)
      logger.debug("fetch_document: trying %s", url)
      try:
          response = requests.get(url, timeout=timeout, headers=headers)
          logger.debug("fetch_document: found document, code %s", response.status_code)
          response.raise_for_status()
          return response.text, response.status_code, None
      except (HTTPError, SSLError, ConnectionError) as ex:
          if isinstance(ex, SSLError) and raise_ssl_errors:
              logger.debug("fetch_document: exception %s", ex)
              return None, None, ex
          # Try http then
          url = url.replace("https://", "http://")
          logger.debug("fetch_document: trying %s", url)
          try:
              response = requests.get(url, timeout=timeout, headers=headers)
              logger.debug("fetch_document: found document, code %s", response.status_code)
              response.raise_for_status()
              return response.text, response.status_code, None
          except RequestException as ex:
              logger.debug("fetch_document: exception %s", ex)
              return None, None, ex
      except RequestException as ex:
          logger.debug("fetch_document: exception %s", ex)
          return None, None, ex