docs: def request(self, url='', method = 'GET', data = None, parse=True, encoding=None):
          """Issue a HTTP request and parse CLAM XML response, this is a low-level function called by all of the higher-level communication methods in this class, use those instead"""
  
          requestparams = self.initrequest(data)
  
  
          if method == 'POST':
              request = requests.post
          elif method == 'DELETE':
              request = requests.delete
          elif method == 'PUT':
              request = requests.put
          else:
              request = requests.get
  
          r = request(self.url + url,**requestparams)
          if encoding is not None:
              r.encoding = encoding
  
          if r.status_code == 400:
              raise clam.common.data.BadRequest()
          elif r.status_code == 401:
              raise clam.common.data.AuthRequired()
          elif r.status_code == 403: #pylint: disable=too-many-nested-blocks
              content = r.text
              if parse:
                  data = self._parse(content)
                  if data:
                      if data.errors:
                          error = data.parametererror()
                          #print("DEBUG: parametererror=" + str(error),file=sys.stderr)
                          #for parametergroup, parameters in data.parameters: #pylint: disable=unused-variable
                          #    for parameter in parameters:
                          #        print("DEBUG: ", parameter.id, parameter.error,file=sys.stderr)
                          if error:
                              raise clam.common.data.ParameterError(error)
                      #print(content,file=sys.stderr)
                      raise clam.common.data.PermissionDenied(data)
                  else:
                      raise clam.common.data.PermissionDenied(content)
              else:
                  raise clam.common.data.PermissionDenied(content)
          elif r.status_code == 404 and data:
              raise clam.common.data.NotFound(r.text)
          elif r.status_code == 500:
              raise clam.common.data.ServerError(r.text)
          elif r.status_code == 405:
              raise clam.common.data.ServerError("Server returned 405: Method not allowed for " + method + " on " + self.url + url)
          elif r.status_code == 408:
              raise clam.common.data.TimeOut()
          elif not (r.status_code >= 200 and r.status_code <= 299):
              raise Exception("An error occured, return code " + str(r.status_code))
  
          if parse:
              return self._parse(r.text)
          else:
              return r.text