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 = "