From 9c5d1a32c55a77a51b6c418edee8b60f617023c9 Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Wed, 16 Mar 2022 16:39:23 -0700 Subject: [PATCH] Recover from malformed JSON Summary: Following up on D34787674 (https://github.com/facebook/flipper/commit/f85def32fb62bec82eb84de6e4786615edaa2c55). Reviewed By: aigoncharov Differential Revision: D34930249 fbshipit-source-id: f209a638c1281957fd2b03b6fc50389bd98bc5f6 --- desktop/flipper-common/src/transport.tsx | 5 +++++ .../flipper-server/src/startSocketServer.tsx | 21 ++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/desktop/flipper-common/src/transport.tsx b/desktop/flipper-common/src/transport.tsx index ee86af0f0..83ae40931 100644 --- a/desktop/flipper-common/src/transport.tsx +++ b/desktop/flipper-common/src/transport.tsx @@ -14,6 +14,11 @@ type GenericWebSocketMessage = { payload: T; }; +export type GenericWebSocketError = GenericWebSocketMessage< + 'error', + {message: string} +>; + export type ExecWebSocketMessage = GenericWebSocketMessage< 'exec', { diff --git a/desktop/flipper-server/src/startSocketServer.tsx b/desktop/flipper-server/src/startSocketServer.tsx index 5f2ad7734..4ce0be163 100644 --- a/desktop/flipper-server/src/startSocketServer.tsx +++ b/desktop/flipper-server/src/startSocketServer.tsx @@ -13,6 +13,7 @@ import { ExecResponseWebSocketMessage, ExecResponseErrorWebSocketMessage, ServerEventWebSocketMessage, + GenericWebSocketError, } from 'flipper-common'; import {FlipperServerImpl} from 'flipper-server-core'; import {WebSocketServer} from 'ws'; @@ -42,9 +43,23 @@ export function startSocketServer( flipperServer.onAny(onServerEvent); client.on('message', (data) => { - const {event, payload} = JSON.parse( - data.toString(), - ) as ClientWebSocketMessage; + let [event, payload]: [event: string | null, payload: any | null] = [ + null, + null, + ]; + try { + ({event, payload} = JSON.parse( + data.toString(), + ) as ClientWebSocketMessage); + } catch (err) { + console.warn('flipperServer -> onMessage: failed to parse JSON', err); + const response: GenericWebSocketError = { + event: 'error', + payload: {message: `Failed to parse JSON request: ${err}`}, + }; + client.send(JSON.stringify(response)); + return; + } switch (event) { case 'exec': {