From 5c4a54022b320b41aa0e65bbc9ca1459e809fa35 Mon Sep 17 00:00:00 2001 From: Mathieu Duckerts-Antoine Date: Fri, 2 Sep 2022 12:48:55 +0000 Subject: [PATCH] [FIX] web: rpc: not parsable request response Connect in your browser to a db on runbot with mail installed and wait until the runbot put to sleep the db. After a while, a new request to get im_status will be sent and nginx responds to it with an error 404 and an invalid JSON response. A traceback with a particularly bad message is then shown. Here we improve the traceback message. closes odoo/odoo#99430 Signed-off-by: Aaron Bohy (aab) --- .../static/src/core/network/rpc_service.js | 15 ++++++++++++- .../tests/core/network/rpc_service_tests.js | 21 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/core/network/rpc_service.js b/addons/web/static/src/core/network/rpc_service.js index 7b7e35cf3fc..9112c002147 100644 --- a/addons/web/static/src/core/network/rpc_service.js +++ b/addons/web/static/src/core/network/rpc_service.js @@ -22,6 +22,8 @@ export class ConnectionLostError extends Error {} export class ConnectionAbortedError extends Error {} +export class HTTPError extends Error {} + // ----------------------------------------------------------------------------- // Main RPC method // ----------------------------------------------------------------------------- @@ -64,7 +66,18 @@ export function jsonrpc(env, rpcId, url, params, settings = {}) { reject(new ConnectionLostError()); return; } - const { error: responseError, result: responseResult } = JSON.parse(request.response); + let params; + try { + params = JSON.parse(request.response); + } catch (_) { + reject( + new HTTPError( + `server responded with invalid JSON response (HTTP${request.status}): ${request.response}` + ) + ); + return; + } + const { error: responseError, result: responseResult } = params; if (!settings.silent) { bus.trigger("RPC:RESPONSE", data.id); } diff --git a/addons/web/static/tests/core/network/rpc_service_tests.js b/addons/web/static/tests/core/network/rpc_service_tests.js index ee09a3235f9..5245d7ad3ea 100644 --- a/addons/web/static/tests/core/network/rpc_service_tests.js +++ b/addons/web/static/tests/core/network/rpc_service_tests.js @@ -252,3 +252,24 @@ QUnit.test("check connection aborted", async (assert) => { connection.abort(); assert.rejects(connection, ConnectionAbortedError); }); + +QUnit.test( + "Response with status 404 and invalid JSON response result in a rerror with a readable message", + async (assert) => { + const env = await makeTestEnv({ serviceRegistry }); + + const MockXHR = makeMockXHR({}, () => {}); + const request = new MockXHR(); + request.response = "