X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;ds=sidebyside;f=openerp%2Fhttp.py;h=343520433eae3d4c46ab0d929ee414a4173c7815;hb=4854d5562fd7a895c636304a5eef43575d9f5f8f;hp=a70a9f1e852d65c81860a82868d7de3791cb61f6;hpb=e6dd2a63c1f1c2f1ed56e98c6df0aadb6e7afc9f;p=odoo%2Fodoo.git diff --git a/openerp/http.py b/openerp/http.py index a70a9f1..3435204 100644 --- a/openerp/http.py +++ b/openerp/http.py @@ -67,6 +67,14 @@ def replace_request_password(args): args[2] = '*' return tuple(args) +# don't trigger debugger for those exceptions, they carry user-facing warnings +# and indications, they're not necessarily indicative of anything being +# *broken* +NO_POSTMORTEM = (openerp.osv.orm.except_orm, + openerp.exceptions.AccessError, + openerp.exceptions.AccessDenied, + openerp.exceptions.Warning, + openerp.exceptions.RedirectWarning) def dispatch_rpc(service_name, method, params): """ Handle a RPC call. @@ -110,9 +118,7 @@ def dispatch_rpc(service_name, method, params): openerp.netsvc.log(rpc_request, logging.DEBUG, logline, replace_request_password(params), depth=1) return result - except (openerp.osv.orm.except_orm, openerp.exceptions.AccessError, \ - openerp.exceptions.AccessDenied, openerp.exceptions.Warning, \ - openerp.exceptions.RedirectWarning): + except NO_POSTMORTEM: raise except openerp.exceptions.DeferredException, e: _logger.exception(openerp.tools.exception_to_unicode(e)) @@ -256,13 +262,18 @@ class WebRequest(object): to abitrary responses. Anything returned (except None) will be used as response.""" self._failed = exception # prevent tx commit + if not isinstance(exception, NO_POSTMORTEM): + openerp.tools.debugger.post_mortem( + openerp.tools.config, sys.exc_info()) raise def _call_function(self, *args, **kwargs): request = self if self.endpoint.routing['type'] != self._request_type: - raise Exception("%s, %s: Function declared as capable of handling request of type '%s' but called with a request of type '%s'" \ - % (self.endpoint.original, self.httprequest.path, self.endpoint.routing['type'], self._request_type)) + msg = "%s, %s: Function declared as capable of handling request of type '%s' but called with a request of type '%s'" + params = (self.endpoint.original, self.httprequest.path, self.endpoint.routing['type'], self._request_type) + _logger.error(msg, *params) + raise werkzeug.exceptions.BadRequest(msg % params) kwargs.update(self.endpoint.arguments) @@ -463,7 +474,13 @@ class JsonRequest(WebRequest): request = self.httprequest.stream.read() # Read POST content or POST Form Data named "request" - self.jsonrequest = simplejson.loads(request) + try: + self.jsonrequest = simplejson.loads(request) + except simplejson.JSONDecodeError: + msg = 'Invalid JSON data: %r' % (request,) + _logger.error('%s: %s', self.httprequest.path, msg) + raise werkzeug.exceptions.BadRequest(msg) + self.params = dict(self.jsonrequest.get("params", {})) self.context = self.params.pop('context', dict(self.session.context)) @@ -494,12 +511,13 @@ class JsonRequest(WebRequest): def _handle_exception(self, exception): """Called within an except block to allow converting exceptions - to abitrary responses. Anything returned (except None) will + to arbitrary responses. Anything returned (except None) will be used as response.""" try: return super(JsonRequest, self)._handle_exception(exception) except Exception: - _logger.exception("Exception during JSON request handling.") + if not isinstance(exception, openerp.exceptions.Warning): + _logger.exception("Exception during JSON request handling.") error = { 'code': 200, 'message': "OpenERP Server Error", @@ -827,9 +845,9 @@ class Model(object): or self.session.uid != request.uid: raise Exception("Trying to use Model with badly configured database or user.") - mod = request.registry.get(self.model) if method.startswith('_'): raise Exception("Access denied") + mod = request.registry[self.model] meth = getattr(mod, method) cr = request.cr result = meth(cr, request.uid, *args, **kw)