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 communicaton 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: content = r.text if parse: data = self._parse(content) if data: if data.errors: print("DEBUG: errors found",file=sys.stderr) error = data.parametererror() print("DEBUG: parametererror=" + str(error),file=sys.stderr) for parametergroup, parameters in data.parameters: 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
def _parse(self, content): """Parses CLAM XML data and returns a ``CLAMData`` object. For internal use. Raises `ParameterError` exception on parameter errors.""" if content.find('<clam') != -1: data = clam.common.data.CLAMData(content,self, loadmetadata=self.loadmetadata) if data.errors: error = data.parametererror() if error: raise clam.common.data.ParameterError(error) return data else: return True
def _parse(self, content): """Parses CLAM XML data and returns a ``CLAMData`` object. For internal use. Raises `ParameterError` exception on parameter errors.""" if content.find('<clam') != -1: data = clam.common.data.CLAMData(content, self) if data.errors: error = data.parametererror() if error: raise clam.common.data.ParameterError(error) return data else: return True
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 is True: #response is not XML raise clam.common.data.PermissionDenied(content) elif 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