import odoo.http import json import logging from werkzeug.exceptions import BadRequest import functools _logger = logging.getLogger(__name__) class CustomJsonRequest(odoo.http.JsonRequest): def __init__(self, httprequest): super(odoo.http.JsonRequest, self).__init__(httprequest) self.params = {} request_data_raw = self.httprequest.get_data().decode(self.httprequest.charset) self.jsonrequest = {} if request_data_raw.strip(): try: self.jsonrequest = json.loads(request_data_raw) except ValueError: msg = 'Invalid JSON data: %r' % (request_data_raw,) _logger.info('%s: %s (Handled by CustomJsonRequest)', self.httprequest.path, msg) raise BadRequest(msg) else: _logger.info("CustomJsonRequest: Received empty or whitespace-only JSON body. Treating as empty JSON for webhook.") self.params = dict(self.jsonrequest.get("params", {})) self.context = self.params.pop('context', dict(self.session.context)) _original_get_request = odoo.http.Root.get_request @functools.wraps(_original_get_request) def _get_request_override(self, httprequest): _logger.info("--- DEBUG: !!! _get_request_override IS CALLED !!! ---") _logger.info(f"--- DEBUG: Request Mimetype: {httprequest.mimetype}, Path: {httprequest.path} ---") if httprequest.mimetype in ("application/json", "application/json-rpc"): _logger.debug("Odoo HTTP: Using CustomJsonRequest for mimetype: %s", httprequest.mimetype) return CustomJsonRequest(httprequest) else: _logger.debug("Odoo HTTP: Using original get_request for mimetype: %s", httprequest.mimetype) return _original_get_request(self, httprequest) odoo.http.Root.get_request = _get_request_override