From cd197aeaaf5acbee2eba71a35831fb23a0a00c80 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Wed, 2 Sep 2020 05:11:14 -0700 Subject: [PATCH] Make sure network plugin doesn't crash on invalid URLs Summary: In the attached task an IPv6 address ended up in the URL send from IG. Since that URL couldn't be parsed, it crashed the network plugin. This change makes sure the plugin doesn't crash on invalid urls. Reviewed By: cekkaewnumchai Differential Revision: D23344503 fbshipit-source-id: c7ac2068e407a764d59e632bef1be7c4239c8c8a --- desktop/flipper-plugin/src/index.ts | 1 + desktop/flipper-plugin/src/plugin/MenuEntry.tsx | 2 +- desktop/plugins/network/index.tsx | 11 ++++++++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/desktop/flipper-plugin/src/index.ts b/desktop/flipper-plugin/src/index.ts index 8449bbc97..8cef79061 100644 --- a/desktop/flipper-plugin/src/index.ts +++ b/desktop/flipper-plugin/src/index.ts @@ -29,6 +29,7 @@ export { MenuEntry, NormalizedMenuEntry, buildInMenuEntries, + DefaultKeyboardAction, } from './plugin/MenuEntry'; // It's not ideal that this exists in flipper-plugin sources directly, diff --git a/desktop/flipper-plugin/src/plugin/MenuEntry.tsx b/desktop/flipper-plugin/src/plugin/MenuEntry.tsx index 85b22e915..eeaa7b199 100644 --- a/desktop/flipper-plugin/src/plugin/MenuEntry.tsx +++ b/desktop/flipper-plugin/src/plugin/MenuEntry.tsx @@ -7,10 +7,10 @@ * @format */ -export type DefaultKeyboardAction = 'clear' | 'goToBottom' | 'createPaste'; export type TopLevelMenu = 'Edit' | 'View' | 'Window' | 'Help'; export type MenuEntry = BuiltInMenuEntry | CustomMenuEntry; +export type DefaultKeyboardAction = keyof typeof buildInMenuEntries; export type NormalizedMenuEntry = { label: string; diff --git a/desktop/plugins/network/index.tsx b/desktop/plugins/network/index.tsx index c2a382317..a39785d62 100644 --- a/desktop/plugins/network/index.tsx +++ b/desktop/plugins/network/index.tsx @@ -42,9 +42,9 @@ import {convertRequestToCurlCommand, getHeaderValue, decodeBody} from './utils'; import RequestDetails from './RequestDetails'; import {clipboard} from 'electron'; import {URL} from 'url'; -import {DefaultKeyboardAction} from 'app/src/MenuBar'; import {MockResponseDialog} from './MockResponseDialog'; import {combineBase64Chunks} from './chunks'; +import {DefaultKeyboardAction} from 'flipper-plugin'; const LOCALSTORAGE_MOCK_ROUTE_LIST_KEY = '__NETWORK_CACHED_MOCK_ROUTE_LIST'; @@ -599,8 +599,13 @@ function buildRow( if (request.url == null) { return null; } - const url = new URL(request.url); - const domain = url.host + url.pathname; + let url: URL | undefined = undefined; + try { + url = new URL(request.url); + } catch (e) { + console.warn(`Failed to parse url: '${request.url}'`, e); + } + const domain = url ? url.host + url.pathname : ''; const friendlyName = getHeaderValue(request.headers, 'X-FB-Friendly-Name'); const style = response && response.isMock ? mockingStyle : undefined;