docs: def _make_request(self, url, params=None, opener=None):
          """
          Configure a HTTP request, fire it off and return the response.
          """
          # Create the request object
          args = [i for i in [url, params] if i]
          request = urllib.request.Request(*args)
          # If the client has credentials, include them as a header
          if self.username and self.password:
              credentials = '%s:%s' % (self.username, self.password)
              encoded_credentials = base64.encodestring(
                  credentials.encode("utf-8")
              ).decode("utf-8").replace("\n", "")
              header = 'Basic %s' % encoded_credentials
              request.add_header('Authorization', header)
          # If the request provides a custom opener, like the upload request,
          # which relies on a multipart request, it is applied here.
          if opener:
              opener = urllib.request.build_opener(opener)
              request_method = opener.open
          else:
              request_method = urllib.request.urlopen
          # Make the request
          try:
              response = request_method(request)
          except Exception:
              e = sys.exc_info()[1]
              if getattr(e, 'code', None) == 404:
                  raise DoesNotExistError("The resource you've requested does \
  not exist or is unavailable without the proper credentials.")
              elif getattr(e, 'code', None) == 401:
                  raise CredentialsFailedError("The resource you've requested \
  requires proper credentials.")
              else:
                  raise e
          # Read the response and return it
          return response.read()