From 0373bb578b7faf44159aaa4e71e4bb974eb113aa Mon Sep 17 00:00:00 2001 From: James Gatz Date: Fri, 9 Sep 2022 16:53:28 +0200 Subject: [PATCH] Initial WebSocket support (#5043) * [INS-1697] Create WebSocket Request (#5041) * add fail safe Co-authored-by: Mark Kim * Websockets IPC API (#5044) * add url to ws-request model * fix webSocketRequest typo and add url * add websocket api and expose it through preload ipc * add typings Co-authored-by: Mark Kim * [INS-1701] Create/Close Websocket Connection (#5046) * add websocket action bar and its components * remove comments * clean up * reflect on the electron api * remove unused files * import name change * add styling * remove commet * add suggested changes * remove default value * Add WebSocketRequest to sidebar and update types (#5048) * [INS-1700] Delete Websocket Request (#5055) * add websocket actions dropdown * add actions to websocket request in sidebar * [INS-1703] Display WebSocket messages - first pass (#5054) * Update event types to improve inference * Update websocket response pane to fetch/subscribe and display the events * [INS-1693] Add WS echo server for smoke tests (#5050) Co-authored-by: Dimitri Mitropoulos * fix sidebar unit tests (#5064) * [INS-1776] adds `ws` dependency explicitly (#5066) * [INS-1702] WebSocket Send Message (#5052) * add initial changes for websocket message * add abstraction for db operation and websocket operation * remove console * add rename * add basic testing * add basic testing * add unit tests * add form event type * add comments * disallow exporting context directly * add suggested changes * refresh the query * using useDeepCompareEffect * rename variable * add mock * clean up * clean up * correct the file name * add some changes * removing nedb-context and its hooks * remove database changes for event sending * [INS-1778] Fix Global Module Typing Issue (#5065) * fix typings * add jest import * [INS-1703] View WebSocket Messages (#5074) * save changes * add styles and move files around * remove unused code * clean up some components * add clean up * add timestamp component * add unit tests * add case * add style changes * [INS-1786] WebSocket headers tab (#5080) * first ui pass * extract and wire up bulk editor * raise ready state, move send * add upgrade header debug logs * can pass header to websocket upgrade * implement readOnly headers * add upgrade event and sent headers * clean up * fill out http upgrade into the event * change upgrade message * read only headers while connected * remove upgrade event * revert bulk editor change * fix header editable toggle * add nunjucks todos * improve readOnly implementation * disable codemirror/nunjucks for websocket headers * take calculated headers out of the data model * move hardcoded default headers down the tree * fix request url rendering issue * removed spammy warning * clarify prop name * refine pair typing * change placeholder * remove readOnly header property * fix readOnly header layout * Update packages/insomnia/src/ui/components/dropdowns/websocket-request-actions-dropdown.tsx * Show HTTP->WS upgrade (handshake) (#5091) * first pass as event * add handshake ui * add timeline tab * simplify ResponseTimelineViewer * transform res debug modal to change timeline props * decouple timeline fetching from timeline component * timeline ui pass * record headers in request and response models * can view timeline history * write timeline to file * some timeline * can persist event logs * put interface beside usage * add note * add event log history * remove table event row * tidying up * make ws colors match * enable multiple open connections * close open connections at app exit * remove old test * Update packages/insomnia/src/models/request-version.ts * fix type * default readystate * fix preview css scroll Co-authored-by: James Gatz * INS-1788: Add control flow to improve responsiveness. (#5094) * INS-1788: Add control flow for responsiveness. This prevents events from flooding the UI thread entirely. * Add additional code comments. * fixup: webSocketEvent -> webSocketEvents * display response headers (#5102) * Show errors in timeline (#5100) * remove unused context provider * show errors in event tab * updates timeline with message and close * clean up * show errors in timeline * fix WebSocket capitalisation * make timeline reader specific to ws * write outbound messages to the timeline * fix type * Make the head row sticky in the events table (#5103) * Add client certificate support to websocket connections (#5112) * [INS-1810] close connection on response change (#5104) * close ws connection when response is changed * add delete logic for the queue mapg * set error response to active response * useRef for CodeEditor * extract closeRequest * use requestId to eliminate inconsistencies * refactor extract clean up methods * timeline feedback * change type annotation * fix type * Revert "use requestId to eliminate inconsistencies" This reverts commit 98335a927e8c0cab21dc5d5b4ecd852e3d9c5190. * [INS-1803] show cookie tab in response pane (#5105) * hard code sending and storing to true * make tab naming consistent * hard code cookie settings to false * fix headers isDisabled bug * [INS-1805] Add Auth Header Tab (#5115) * add minimal change to the auth flow * add disable state * adding dropdown disable * simplify reducer * fix lint * [INS-1839] Rename tab Header everywhere (#5119) * can import/export websocket requests (#5122) * use responseId for timeline name (#5124) * add react-virtual to virtualize the event log view (#5126) * [INS-1833] Include Auth Header in Headers mapping for WebSocket Connection (#5120) * add auth to the header * remove console log * remove unneeded async * add success redirect logic to websocket server * add unexpected-response handler * remove digest auth (#5129) * remove auth header and outbound message timeline (#5130) * [INS-1840] Add Connected Status Label and Extras (#5131) * add status related changes * text label change * WebSocket ipc typing proposal (#5125) * make consistent with main bridge * rename webSocket * remove deviated mock * use consistent arrow function defintions * Update packages/insomnia/src/main/network/websocket.ts * Set the environment for websocket responses (#5132) * first pass (#5123) * [INS-1843] Add more checks to WS smoke test (#5138) * Fix failing websocket smoke test * Add remaining websocket smoke server endopints to fixtures * Add checks for basic-auth, bearer and redirect * Rm assertion * can select payload type (#5133) * Implement nunjucks rendering for websocket urls, authentication, headers and urls (#5134) * fix websocket->webSocket (#5142) * bug fix (#5144) * INS-1844: Implement basic event view functionality. (#5146) * INS-1844: Implement basic event view functionality * CSS fix to align Preview button with tab buttons. * Reverse the order of WebSocket events (#5148) * Reverse the event log order in the view and subscribe to messages after the latest * WebSocket response model (#5147) * init websocket-response model * add websocket response model * remove unused timeline getter * remove unused functionality from the ws-response model * can select and save payload message and preview mode (#5143) * [INS-1838] Add Empty State (#5140) * add empty state * use the empty state pane Co-authored-by: gatzjames * Bug/stabilise-ws-fetch-method (#5152) * just poll * remove cts and eventlog channel * Fix/nitpicks (#5156) * remove unused names * fix copypasta icon * ensure all subcompnent drop state on request change * move empty state to response pane * add websockets to quick switch (#5159) * [INS-1800] Remove value validity check in the WebSocket headers (#5154) * remove valid value check in the headers * add header name filtering Co-authored-by: Dimitri Mitropoulos Co-authored-by: Mark Kim Co-authored-by: Filipe Freire Co-authored-by: Jack Kavanagh Co-authored-by: John Chadwick <86682572+johnwchadwick@users.noreply.github.com> Co-authored-by: David Marby --- .../src/assets/icn-checkmark-circle.svg | 3 + .../src/assets/icn-disconnected.svg | 3 + .../src/assets/icn-receive.svg | 5 + .../src/assets/icn-sent.svg | 5 + .../src/assets/icn-system-event.svg | 3 + packages/insomnia-components/src/svg-icon.tsx | 16 +- .../client.localhost-client-key.pem | 28 ++ .../certificates/client.localhost-client.pem | 25 + .../fixtures/certificates/localhost-key.pem | 28 ++ .../fixtures/certificates/localhost.pem | 25 + .../fixtures/certificates/rootCA-key.pem | 40 ++ .../fixtures/certificates/rootCA.pem | 28 ++ .../fixtures/websockets.yaml | 87 ++++ .../insomnia-smoke-test/package-lock.json | 48 ++ packages/insomnia-smoke-test/package.json | 2 + packages/insomnia-smoke-test/server/index.ts | 23 +- .../insomnia-smoke-test/server/websocket.ts | 83 ++++ .../tests/websocket.test.ts | 52 +++ packages/insomnia/package-lock.json | 53 ++- packages/insomnia/package.json | 5 +- .../src/__jest__/mock-code-editor.tsx | 1 + packages/insomnia/src/common/constants.ts | 17 +- packages/insomnia/src/common/database.ts | 5 +- packages/insomnia/src/common/export.ts | 15 +- packages/insomnia/src/common/render.ts | 10 +- packages/insomnia/src/main.development.ts | 2 + packages/insomnia/src/main/ipc/main.ts | 4 +- .../insomnia/src/main/network/websocket.ts | 429 ++++++++++++++++++ .../src/models/helpers/request-operations.ts | 51 ++- packages/insomnia/src/models/index.ts | 13 + .../insomnia/src/models/request-version.ts | 20 +- packages/insomnia/src/models/response.ts | 16 +- .../insomnia/src/models/websocket-payload.ts | 70 +++ .../insomnia/src/models/websocket-request.ts | 92 ++++ .../insomnia/src/models/websocket-response.ts | 151 ++++++ packages/insomnia/src/network/network.ts | 2 +- packages/insomnia/src/preload.ts | 16 + .../components/codemirror/one-line-editor.tsx | 2 + .../ui/components/dropdowns/auth-dropdown.tsx | 181 ++++++-- .../dropdowns/content-type-dropdown.tsx | 8 +- .../dropdowns/preview-mode-dropdown.tsx | 5 +- .../request-group-actions-dropdown.tsx | 9 +- .../dropdowns/response-history-dropdown.tsx | 49 +- .../dropdowns/websocket-preview-mode.tsx | 29 ++ .../websocket-request-actions-dropdown.tsx | 74 +++ .../ui/components/editors/auth/asap-auth.tsx | 2 + .../components/editors/auth/auth-wrapper.tsx | 11 +- .../ui/components/editors/auth/aws-auth.tsx | 2 + .../ui/components/editors/auth/basic-auth.tsx | 8 +- .../components/editors/auth/bearer-auth.tsx | 8 +- .../auth/components/auth-input-row.tsx | 7 +- .../auth/components/auth-table-body.tsx | 3 - .../auth/components/auth-toggle-row.tsx | 5 +- .../components/editors/auth/digest-auth.tsx | 8 +- .../ui/components/editors/auth/hawk-auth.tsx | 1 + .../ui/components/editors/auth/ntlm-auth.tsx | 2 + .../components/editors/auth/o-auth-1-auth.tsx | 1 + .../components/editors/auth/o-auth-2-auth.tsx | 1 + .../editors/request-headers-editor.tsx | 7 +- .../export-requests/request-row.tsx | 10 +- .../ui/components/export-requests/tree.tsx | 3 +- .../key-value-editor/key-value-editor.tsx | 36 +- .../ui/components/key-value-editor/row.tsx | 20 +- .../modals/export-requests-modal.tsx | 7 +- .../modals/request-render-error-modal.tsx | 3 +- .../modals/request-switcher-modal.tsx | 13 +- .../modals/response-debug-modal.tsx | 131 +++--- .../src/ui/components/panes/request-pane.tsx | 2 +- .../src/ui/components/panes/response-pane.tsx | 11 +- .../src/ui/components/sidebar/dnd.tsx | 3 +- .../components/sidebar/sidebar-children.tsx | 57 ++- .../sidebar/sidebar-create-dropdown.tsx | 4 + .../sidebar/sidebar-request-row.tsx | 58 ++- .../src/ui/components/tags/websocket-tag.tsx | 7 + .../viewers/response-timeline-viewer.tsx | 125 ++--- .../ui/components/websockets/action-bar.tsx | 167 +++++++ .../components/websockets/event-log-view.tsx | 200 ++++++++ .../ui/components/websockets/event-view.tsx | 136 ++++++ .../websockets/websocket-preview-dropdown.tsx | 42 ++ .../websockets/websocket-request-pane.tsx | 254 +++++++++++ .../websockets/websocket-response-pane.tsx | 209 +++++++++ .../src/ui/components/wrapper-debug.tsx | 105 +++-- .../insomnia/src/ui/components/wrapper.tsx | 6 +- packages/insomnia/src/ui/containers/app.tsx | 8 +- .../use-ws-connection-events.ts | 25 + .../websocket-client/use-ws-ready-state.ts | 29 ++ .../insomnia/src/ui/hooks/create-request.ts | 12 +- .../src/ui/hooks/use-active-request.ts | 22 +- .../redux/__tests__/sidebar-selectors.test.ts | 2 +- .../insomnia/src/ui/redux/modules/entities.ts | 15 + .../insomnia/src/ui/redux/modules/global.tsx | 3 +- packages/insomnia/src/ui/redux/selectors.ts | 51 ++- .../src/ui/redux/sidebar-selectors.ts | 5 +- 93 files changed, 3238 insertions(+), 442 deletions(-) create mode 100644 packages/insomnia-components/src/assets/icn-checkmark-circle.svg create mode 100644 packages/insomnia-components/src/assets/icn-disconnected.svg create mode 100644 packages/insomnia-components/src/assets/icn-receive.svg create mode 100644 packages/insomnia-components/src/assets/icn-sent.svg create mode 100644 packages/insomnia-components/src/assets/icn-system-event.svg create mode 100644 packages/insomnia-smoke-test/fixtures/certificates/client.localhost-client-key.pem create mode 100644 packages/insomnia-smoke-test/fixtures/certificates/client.localhost-client.pem create mode 100644 packages/insomnia-smoke-test/fixtures/certificates/localhost-key.pem create mode 100644 packages/insomnia-smoke-test/fixtures/certificates/localhost.pem create mode 100644 packages/insomnia-smoke-test/fixtures/certificates/rootCA-key.pem create mode 100644 packages/insomnia-smoke-test/fixtures/certificates/rootCA.pem create mode 100644 packages/insomnia-smoke-test/fixtures/websockets.yaml create mode 100644 packages/insomnia-smoke-test/server/websocket.ts create mode 100644 packages/insomnia-smoke-test/tests/websocket.test.ts create mode 100644 packages/insomnia/src/main/network/websocket.ts create mode 100644 packages/insomnia/src/models/websocket-payload.ts create mode 100644 packages/insomnia/src/models/websocket-request.ts create mode 100644 packages/insomnia/src/models/websocket-response.ts create mode 100644 packages/insomnia/src/ui/components/dropdowns/websocket-preview-mode.tsx create mode 100644 packages/insomnia/src/ui/components/dropdowns/websocket-request-actions-dropdown.tsx create mode 100644 packages/insomnia/src/ui/components/tags/websocket-tag.tsx create mode 100644 packages/insomnia/src/ui/components/websockets/action-bar.tsx create mode 100644 packages/insomnia/src/ui/components/websockets/event-log-view.tsx create mode 100644 packages/insomnia/src/ui/components/websockets/event-view.tsx create mode 100644 packages/insomnia/src/ui/components/websockets/websocket-preview-dropdown.tsx create mode 100644 packages/insomnia/src/ui/components/websockets/websocket-request-pane.tsx create mode 100644 packages/insomnia/src/ui/components/websockets/websocket-response-pane.tsx create mode 100644 packages/insomnia/src/ui/context/websocket-client/use-ws-connection-events.ts create mode 100644 packages/insomnia/src/ui/context/websocket-client/use-ws-ready-state.ts diff --git a/packages/insomnia-components/src/assets/icn-checkmark-circle.svg b/packages/insomnia-components/src/assets/icn-checkmark-circle.svg new file mode 100644 index 0000000000..1fdfdf74e1 --- /dev/null +++ b/packages/insomnia-components/src/assets/icn-checkmark-circle.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/insomnia-components/src/assets/icn-disconnected.svg b/packages/insomnia-components/src/assets/icn-disconnected.svg new file mode 100644 index 0000000000..0cc8d7d8e1 --- /dev/null +++ b/packages/insomnia-components/src/assets/icn-disconnected.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/insomnia-components/src/assets/icn-receive.svg b/packages/insomnia-components/src/assets/icn-receive.svg new file mode 100644 index 0000000000..8dec06e7cb --- /dev/null +++ b/packages/insomnia-components/src/assets/icn-receive.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/insomnia-components/src/assets/icn-sent.svg b/packages/insomnia-components/src/assets/icn-sent.svg new file mode 100644 index 0000000000..454ca330e1 --- /dev/null +++ b/packages/insomnia-components/src/assets/icn-sent.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/insomnia-components/src/assets/icn-system-event.svg b/packages/insomnia-components/src/assets/icn-system-event.svg new file mode 100644 index 0000000000..025cbfa7d1 --- /dev/null +++ b/packages/insomnia-components/src/assets/icn-system-event.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/insomnia-components/src/svg-icon.tsx b/packages/insomnia-components/src/svg-icon.tsx index 2c0ccbde30..275573329e 100644 --- a/packages/insomnia-components/src/svg-icon.tsx +++ b/packages/insomnia-components/src/svg-icon.tsx @@ -8,10 +8,12 @@ import { SvgIcnBrackets } from './assets/svgr/IcnBrackets'; import { SvgIcnBug } from './assets/svgr/IcnBug'; import { SvgIcnBurgerMenu } from './assets/svgr/IcnBurgerMenu'; import { SvgIcnCheckmark } from './assets/svgr/IcnCheckmark'; +import { SvgIcnCheckmarkCircle } from './assets/svgr/IcnCheckmarkCircle'; import { SvgIcnChevronDown } from './assets/svgr/IcnChevronDown'; import { SvgIcnChevronUp } from './assets/svgr/IcnChevronUp'; import { SvgIcnClock } from './assets/svgr/IcnClock'; import { SvgIcnCookie } from './assets/svgr/IcnCookie'; +import { SvgIcnDisconnected } from './assets/svgr/IcnDisconnected'; import { SvgIcnDraftingCompass } from './assets/svgr/IcnDraftingCompass'; import { SvgIcnDragGrip } from './assets/svgr/IcnDragGrip'; import { SvgIcnElevator } from './assets/svgr/IcnElevator'; @@ -43,10 +45,13 @@ import { SvgIcnPlus } from './assets/svgr/IcnPlus'; import { SvgIcnProhibited } from './assets/svgr/IcnProhibited'; import { SvgIcnQuestion } from './assets/svgr/IcnQuestion'; import { SvgIcnQuestionFill } from './assets/svgr/IcnQuestionFill'; +import { SvgIcnReceive } from './assets/svgr/IcnReceive'; import { SvgIcnSearch } from './assets/svgr/IcnSearch'; import { SvgIcnSecCert } from './assets/svgr/IcnSecCert'; +import { SvgIcnSent } from './assets/svgr/IcnSent'; import { SvgIcnSuccess } from './assets/svgr/IcnSuccess'; import { SvgIcnSync } from './assets/svgr/IcnSync'; +import { SvgIcnSystemEvent } from './assets/svgr/IcnSystemEvent'; import { SvgIcnTrashcan } from './assets/svgr/IcnTrashcan'; import { SvgIcnTriangle } from './assets/svgr/IcnTriangle'; import { SvgIcnUser } from './assets/svgr/IcnUser'; @@ -122,7 +127,11 @@ export const IconEnum = { warning: 'warning', warningCircle: 'warning-circle', x: 'x', - + disconnected: 'disconnected', + checkmarkCircle: 'checkmark-circle', + receive: 'receive', + sent: 'sent', + systemEvent: 'system-event', /** Blank icon */ empty: 'empty', } as const; @@ -224,6 +233,11 @@ export class SvgIcon extends Component { [IconEnum.warningCircle]: [ThemeEnum.default, SvgIcnWarningCircle], [IconEnum.warning]: [ThemeEnum.notice, SvgIcnWarning], [IconEnum.x]: [ThemeEnum.default, SvgIcnX], + [IconEnum.disconnected]: [ThemeEnum.default, SvgIcnDisconnected], + [IconEnum.receive]: [ThemeEnum.default, SvgIcnReceive], + [IconEnum.sent]: [ThemeEnum.default, SvgIcnSent], + [IconEnum.checkmarkCircle]: [ThemeEnum.default, SvgIcnCheckmarkCircle], + [IconEnum.systemEvent]: [ThemeEnum.default, SvgIcnSystemEvent], }; render() { diff --git a/packages/insomnia-smoke-test/fixtures/certificates/client.localhost-client-key.pem b/packages/insomnia-smoke-test/fixtures/certificates/client.localhost-client-key.pem new file mode 100644 index 0000000000..65e60dfa66 --- /dev/null +++ b/packages/insomnia-smoke-test/fixtures/certificates/client.localhost-client-key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDQaumV23vAEqn4 +KAJ+zQ7nKlLWVwhqMjOS7pz3HohLf4HER6SQ6bhXj2dlsW2TEDZQcOxw9jyTs4Wu +ckpqWy//UQ4LawQ3FGpst2kFAtFY6D93odh0mjPCLzQlXpcGKs6LOzlWAXWxrV6k +HRCsPT6ytnSOZNMlDNQKB+dZJ+vFz2c5LYyPXUkVenYsYH38E/ZFIz5GVRJlLhcH +IKRK3cJoGSQfljlFFDDiwvHc5/hszKIA0zHjk4MmnSw4Dm1P7fiFsI8zZEkNACBG +O/Lf6lcWX8r+1LfrGsmRfku4GrP5LXWD/ToLgmo2CAP3TBM9ftCggKhTbJfZxMWb +Q3DAui1RAgMBAAECggEBAKKM4AW7Gzdg1yPuwJN5B0iQH++ADdYVtVfBtraeH5sS +pXkaj2VehCH2fKQ5z8ZFfLcce6xWwERKXdcC2Ls+x56P7y5ElxMGX0LPgZ8g5Xo8 +GVQK7LF0my22dys2LP/oXxMEa+GCXfLnzsqcyKYtVjs4RovQY0WgTbhNFcjZc+/g +PL3DclvJHJ5n9Bb+ufxJO3K7i4sxD8gcGfgXTVSghM+VCkslw0BJcqpNyGgEjI64 +FTf7Qu1E0rKRGT0EKm70RffoZpLNdpMR/9GMHE5CAMSGie27AK2X8OKCgmqCh3Kp +wKqy3hRNnk9LNfhaan2LuprKlv11bJwAFAQIJSKtzOkCgYEA6n3NI5U4h//w0SeG +eaoOqXDyWmjSj4w1MbPV4sPvs1hG0iXn+w7+dfocXGawoPyu5zB9MhGf3mRB/8dp +6gb+xvYYSoVysh4VboBMJbWBlkWH4/q5KBnwuEVZDPy5fDpK449SlVmiqfpOH7hZ +wzGV5Wdwzofxp4nVIhCT/ryFYP8CgYEA44jcXh9rOHeRySo4ZofBP0QqAdT48ffl +D+VZ2q3/DNj67dYPfo8hhnEgsgVPz02ODHh8aMYVQp4OYrXpdh3/qqnWR7BB5ch1 +lVFSOjytp17TSEm//vXz+WzSyrtlInGjqGazUGMpz+9j672be4y+wdxeyNDq04lr +UQXIAsP0Ia8CgYAvhA5th29NH6/MshWt0afm7dwuNc91BxRAXhCZQtrvnJO9QbEg +TomBnozgrG5eMNXAQzMbUjby+Z3mFqJ/qas25edGMoRrU21EVvsXKRB5Qt2mdMfQ +OHFu5Z6F4zAy3B0Qv5ocaW1sxCvQgaquwv183tkdAK8XI/bsUC+tDsZ4QQKBgQDL +kYTnSODa0k9CVV3Ejaydd9TFcs+PXKQ5ho7PkWBhFDfcVeni5xetesUvwITZCaAP +FDTqYF5hDZv9QJexL8Gv5OdrmAw9Ew3wG6Ofqu4KklIhmKoH5/DxtSUacHJZUKaF +Ye0H/NBJ0vnozeivrwpz0z+SFyghPg8fnDaIEtz2zQKBgHfG8/eXi1ZOiv1nLEuZ +SvJY8IU89aTqhgVsVk0g6h1jEBhZI4mTyvJe4OyC2JjxX4YD9gxu2AXSf2w7yU94 +jRZdqJpLoXtcbIy9nAdYa0AyyyPKzwcSUepO2pqE3QCOSwxlplEqrWVzD9FyHFGJ +0RyshruFkeq15L6ud/6fY8Wz +-----END PRIVATE KEY----- diff --git a/packages/insomnia-smoke-test/fixtures/certificates/client.localhost-client.pem b/packages/insomnia-smoke-test/fixtures/certificates/client.localhost-client.pem new file mode 100644 index 0000000000..c594558490 --- /dev/null +++ b/packages/insomnia-smoke-test/fixtures/certificates/client.localhost-client.pem @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIESDCCArCgAwIBAgIRAKkiT43PW7dM415hMVMjLlIwDQYJKoZIhvcNAQELBQAw +ezEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMSgwJgYDVQQLDB9kYXZp +ZEBETWFyYnktV29yayAoRGF2aWQgTWFyYnkpMS8wLQYDVQQDDCZta2NlcnQgZGF2 +aWRARE1hcmJ5LVdvcmsgKERhdmlkIE1hcmJ5KTAeFw0yMjA4MjUxMzQ1NTBaFw0y +NDExMjUxNDQ1NTBaMFMxJzAlBgNVBAoTHm1rY2VydCBkZXZlbG9wbWVudCBjZXJ0 +aWZpY2F0ZTEoMCYGA1UECwwfZGF2aWRARE1hcmJ5LVdvcmsgKERhdmlkIE1hcmJ5 +KTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANBq6ZXbe8ASqfgoAn7N +DucqUtZXCGoyM5LunPceiEt/gcRHpJDpuFePZ2WxbZMQNlBw7HD2PJOzha5ySmpb +L/9RDgtrBDcUamy3aQUC0VjoP3eh2HSaM8IvNCVelwYqzos7OVYBdbGtXqQdEKw9 +PrK2dI5k0yUM1AoH51kn68XPZzktjI9dSRV6dixgffwT9kUjPkZVEmUuFwcgpErd +wmgZJB+WOUUUMOLC8dzn+GzMogDTMeOTgyadLDgObU/t+IWwjzNkSQ0AIEY78t/q +VxZfyv7Ut+sayZF+S7gas/ktdYP9OguCajYIA/dMEz1+0KCAqFNsl9nExZtDcMC6 +LVECAwEAAaNvMG0wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDATAfBgNVHSMEGDAWgBQgZSNC3VSTkAucIY9/41pfQ64sozAbBgNV +HREEFDASghBjbGllbnQubG9jYWxob3N0MA0GCSqGSIb3DQEBCwUAA4IBgQB4JLAo +j24DvacnTOxPu7gtpLFfB7ykgeAhzdWla7Maqp62lnasYUL9+nX8+aNOxYbd3uq/ +55uSBBy2jnxce2B0oqkRhB0uOPZNwJsJXIZEp+anhz9E9jrgZhdMCDuhrwn5amPc +UmisabO5rPrFxmhKVhkoWHFPKVVOqqlnUt9UdFQsdIQoKYuX1BNro0QDOQ/p4Z7y +tCd6DsyhgV3iTDN3GkBv4fbYxxjD5tyxYKjCAwmcebOwEtAbHXFYpyVg0bNqEq0S +YofcZHkxFtBXV1Ayb1yhNYqNTu3VHTQkkE+XO2vJGBhbueKWQADLZ2fQ+8qkTqL8 +AQ3YX4UQKcWcqwRUWpmEmr+XNfqYq8UrbO/liuPh0uQh7WkxHGlLMPe76jeK1FJP +P8T+Ivh7x7MCj2G/KlwIb7OgpjCuKeR28aSz3+WDInF4lydUwHDZveByVidBaD32 +NIZeX3K8nj7tGpchbDHLiCtdSwTEXFKBPm5EcvAO92alis7mozgGrG3dK1M= +-----END CERTIFICATE----- diff --git a/packages/insomnia-smoke-test/fixtures/certificates/localhost-key.pem b/packages/insomnia-smoke-test/fixtures/certificates/localhost-key.pem new file mode 100644 index 0000000000..d5c1caea10 --- /dev/null +++ b/packages/insomnia-smoke-test/fixtures/certificates/localhost-key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDTqFvEgk21fa9Z +e1OhPQ5BcUDIBLSY3F+1nNv5U0HKzUKEcoU+d0TER2/iNYPs2yLU2mK1UMgQsJfB +j/2ER0kVBSwJ4uk02HqtXtv/E9/RkwYycUsHZFX6wk8HVEKqfIxSgApGBoT15//l +DYFkJwtMvwib5szzmyVswHrYC15HY67o6PkNPyMfn/erOnu4akf0CA1lIg/2haeu +EmTx3mPs677f9xUt6MFHRAAZS6HZKu6THcW6VtOUybj9D+slDwQBJ2aS5Lq79VJd +cBXxCbq2UkXK/bIHkylQ2gtK2Gq8CvbnxmrGU9pXrIFRT7xLQTaUFxXeUMbGO98k +5Wu62FP9AgMBAAECggEBAMc+PCyvMPHBP9jvNFmbPRkzwHTJoSwof1xaLeT1kACV +2qENoQqdgbl3OgZqtCa6Xn6amcLvKXY0lpbash7ccBp+hOdFmJxrkIg1vMjQ76e8 +TGAdsDBkLl/gnD5c/mi41+stpv4mUvGdlJENdplN++AiELuZt6M2kDNgugM4KGbv +45cwuu0DDldCSlp9ujFvn4QipEzf4wcNqvMyaNCzGw/7FyRQncZTe9J3E1RV+Tow +UWqXSR3LhRUNpn65khtPBgkE+ffAFf6d2+wwm5Cex+VOTlMQnkgtk6IgAweBkXY4 +KBmzTupm1TqfQX16zUzDaq3zO2YUhwAMwxo2Dm2rIE0CgYEA29vOXaD8PXepMwDw +2tJS/c3WKNgTeZ1B8vQxlduwfuJeMHVXF20y2kO2rhEsrPTIUX7mM8Bj59vP9rcX +2P4GTBjvsvZj/yYrFV2EyXu+LjPbPMJCi8P/J8w8f0Pwy3xME/awdi477rm43cjn +cBlZNAl0KK3npDd5L5Dfs7fAuu8CgYEA9nNvdQ2EqH1wychTeg3Mj2CsnFI/lPAm +CmUL/Dmt47NXMkG+i1DfyaKTqF7M2+cWphzsk3ppwLfU2am2Uk9DgQl7BkFoLCXY +7xD0gfIAQKrbLKo9wHvjdn3j8rbnDb/A4qCA3ea5kItWviQbUdgl3amnp9Ts2tE8 +3H09kLmZz9MCgYBbXonw10p8sRIcJDP0fJwI5lYuOz48uGID+f/xa49569GBCgLb +tYIAu0tcI78RUdk+JSK+NyJN5UgUHBtJDqjHT0Wudj8wdkhJZMgeg9KRmPNv2LuX +IikT/QjXSwDzUAC9+zNyqdw2ZfCyGyAzshUkTxl7Hmq6EGPIpMiTA7aQ+QKBgQDr +2Kp4DRi/mVPfdnsUWbJCH5Tv//Hi2TK+Tdb7aENVnaG7cZkkf5+5uYCu5xIK+4n8 +K7/mnoYnrITgS/4zpLEIAoeeA+fqH8oLdmFXHb1KJXebtctkseqK0YzcEFbrHG89 +MbZBJPS+M+ouCiWu3DfYeev8u9Jy0Tv6EUxifIuKiwKBgQDJPmxCPM3HS3fvO+7w +DlMtR52IKjohaKmMnt5EtNUR1Xs9vZCa51SvNWA6YJ+zqoGQVCXUoy77O43cewK3 +crv3Hz4wWENG/bVfJQlkpFS4t+RJzNqEzeXSYQxFVfQlnhoeEAj/cZWuOJpkhmC2 +2JkrwTxrofjxbbfD/m56XUusQg== +-----END PRIVATE KEY----- diff --git a/packages/insomnia-smoke-test/fixtures/certificates/localhost.pem b/packages/insomnia-smoke-test/fixtures/certificates/localhost.pem new file mode 100644 index 0000000000..bd5854826c --- /dev/null +++ b/packages/insomnia-smoke-test/fixtures/certificates/localhost.pem @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIENzCCAp+gAwIBAgIRAPKpJUU8eOZ/zg0WbmKsy8IwDQYJKoZIhvcNAQELBQAw +ezEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMSgwJgYDVQQLDB9kYXZp +ZEBETWFyYnktV29yayAoRGF2aWQgTWFyYnkpMS8wLQYDVQQDDCZta2NlcnQgZGF2 +aWRARE1hcmJ5LVdvcmsgKERhdmlkIE1hcmJ5KTAeFw0yMjA4MjUxMzQ1MzdaFw0y +NDExMjUxNDQ1MzdaMFMxJzAlBgNVBAoTHm1rY2VydCBkZXZlbG9wbWVudCBjZXJ0 +aWZpY2F0ZTEoMCYGA1UECwwfZGF2aWRARE1hcmJ5LVdvcmsgKERhdmlkIE1hcmJ5 +KTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOoW8SCTbV9r1l7U6E9 +DkFxQMgEtJjcX7Wc2/lTQcrNQoRyhT53RMRHb+I1g+zbItTaYrVQyBCwl8GP/YRH +SRUFLAni6TTYeq1e2/8T39GTBjJxSwdkVfrCTwdUQqp8jFKACkYGhPXn/+UNgWQn +C0y/CJvmzPObJWzAetgLXkdjrujo+Q0/Ix+f96s6e7hqR/QIDWUiD/aFp64SZPHe +Y+zrvt/3FS3owUdEABlLodkq7pMdxbpW05TJuP0P6yUPBAEnZpLkurv1Ul1wFfEJ +urZSRcr9sgeTKVDaC0rYarwK9ufGasZT2lesgVFPvEtBNpQXFd5QxsY73yTla7rY +U/0CAwEAAaNeMFwwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMB +MB8GA1UdIwQYMBaAFCBlI0LdVJOQC5whj3/jWl9DriyjMBQGA1UdEQQNMAuCCWxv +Y2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAYEAORoaX+VVxk2HyJZveHJgQGcKgOwm +0jm3VQ2d4fFlfiAsLbpkZAeTApu1A4ylan8q6clmraP7GyNf7iZ3OMPkS4vVONMs +sJmFkrKsES4mF3CHKK7+8/bRtB0Y0yTGDxWOiQpZ3Ok6S84WTPylFyTZi4GVRN8P ++KhOaGleNLaf4m2ts0RbMh33va3UKn1b5VgxhdQKGUHcQYTwhmXVW3GDNv2W0Adk +hCaHIDIDAKoCZVm6HYcf/GW4EhJaujnxSWPR8os25+DePeHhrgKvlHMyyevSLcqP +U+ZN3Lk8nNIgCOuhPke7J71IJAX4lklljfeL0sQHDd/5mwLlEtWvaRNGfovnfBfL +ut5Pq0QU2WkOMwdYPJ62fuCm9GX58tXb9MfezFst0EEpf2S0Tn/7TvIXq7DOfzZu +htaGf6HrfkV159ULFuAEog+2HwvPGW3wLVQN5n6QgV/uv0W40Wm1SVpEGG4cK1r4 +emap+9mwik3/bLP0xeuTG8S6X7MZde3By1xo +-----END CERTIFICATE----- diff --git a/packages/insomnia-smoke-test/fixtures/certificates/rootCA-key.pem b/packages/insomnia-smoke-test/fixtures/certificates/rootCA-key.pem new file mode 100644 index 0000000000..21eb9ab557 --- /dev/null +++ b/packages/insomnia-smoke-test/fixtures/certificates/rootCA-key.pem @@ -0,0 +1,40 @@ +-----BEGIN PRIVATE KEY----- +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 +TmvRvDdQuagS/w4gM0gSrA== +-----END PRIVATE KEY----- diff --git a/packages/insomnia-smoke-test/fixtures/certificates/rootCA.pem b/packages/insomnia-smoke-test/fixtures/certificates/rootCA.pem new file mode 100644 index 0000000000..43d0f148c1 --- /dev/null +++ b/packages/insomnia-smoke-test/fixtures/certificates/rootCA.pem @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIIExTCCAy2gAwIBAgIQb/tURt+KKadPV6mtgAlcPDANBgkqhkiG9w0BAQsFADB7 +MR4wHAYDVQQKExVta2NlcnQgZGV2ZWxvcG1lbnQgQ0ExKDAmBgNVBAsMH2Rhdmlk +QERNYXJieS1Xb3JrIChEYXZpZCBNYXJieSkxLzAtBgNVBAMMJm1rY2VydCBkYXZp +ZEBETWFyYnktV29yayAoRGF2aWQgTWFyYnkpMB4XDTIyMDgyNTEzNDM1N1oXDTMy +MDgyNTEzNDM1N1owezEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMSgw +JgYDVQQLDB9kYXZpZEBETWFyYnktV29yayAoRGF2aWQgTWFyYnkpMS8wLQYDVQQD +DCZta2NlcnQgZGF2aWRARE1hcmJ5LVdvcmsgKERhdmlkIE1hcmJ5KTCCAaIwDQYJ +KoZIhvcNAQEBBQADggGPADCCAYoCggGBAKLHiTPWPJMi8CG3MuqDjRels3BtmDRU +M9eTA+1vph84D6T+k+49E+uFiRWjJs2pa1AsG2iXvtJS6/LK0lm0pjWBFMzgfPD5 +mhF4Q9XV6QmvkMGoxeRVAciWmiQVCyBf91b+/N9DSONx8y0cT4VgskpZnddvL59W +SNKX1Xvm4wcPd/mSUmZco9MwaUEp/5oLBOUG9d2f2hcCp/6NBCLVvzG98Z1cwFgS +E6hbgdt0+HAwe7MyUXnLyzoJ31YxCgRWsqICpPsLinv0aAvABPqWtsKa/Dzm3s0p +z/b6jwm8XzkBwz1eSi7J2Ew+xaXTS98Cmc3oQQlhfz4/lWZyiYILl9XKDHNk6P8S +Wkh/Hg5fLf2Wcksai/h62li1XlEMqua9KOJ3rBeKZgc5ELuxaQlTs+qcfGijKWDN +s6yqUKnsZVkvMB65IyfAl+yZInsZUw2rlSRC/0rKDHAWYy46BHTztSLfjTL5G6ox +nMl0GjD7ZoJg/D7NmD6ertkAQJlslb86aQIDAQABo0UwQzAOBgNVHQ8BAf8EBAMC +AgQwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUIGUjQt1Uk5ALnCGPf+Na +X0OuLKMwDQYJKoZIhvcNAQELBQADggGBACVC0yCFLKD5BqBbvHOTPh4pDGl+dmxR +Ta/GjZvXisbxKA/YlwZ+deENLW8veYoDgr7QEOb8QvXiqdd/no+rAU18KnTlwOsD +ITITqF8tStTJKPBubws4S9fhQIeDs+7MS7mW7lfbIz4ho77KcweSbndak9NW7cBl +AwoCPcK/uCH0F2EHDNAQnxf1OVdRREPWD4/Di9EhYr6T5BaRVuD/pB4eYUb9shqD +6vLKVYb/vpYIHc5vEDYT4cmaFW8rXJc+gHZzs+SkTpjvUKZrz9JRrdAji+djPQlD +ZRry4t9De7nVdCZDGjbwzwuEtJxoveldDKcZ/BtRb7dVbU7SB6WqKjUzqlnCoLdE +eZBU2d6+r/ojnPCxHgzVRzABYF4vakIYg4VDVFYEVqdnBo8n5PJLX2gAHbaasOQ4 +hPYthHs8RVk2O5+A/mBVeE09yCwhOAxvqi91ttS4uuN2ullmr07232Wzgc64GSJf +g1WKYRpirTEbH49z3lXRIwGaq2J1xArHsA== +-----END CERTIFICATE----- diff --git a/packages/insomnia-smoke-test/fixtures/websockets.yaml b/packages/insomnia-smoke-test/fixtures/websockets.yaml new file mode 100644 index 0000000000..d6f8b8f333 --- /dev/null +++ b/packages/insomnia-smoke-test/fixtures/websockets.yaml @@ -0,0 +1,87 @@ +_type: export +__export_format: 4 +__export_date: 2022-08-31T10:40:21.266Z +__export_source: insomnia.desktop.app:v2022.5.0 +resources: + - _id: ws-req_0ba3ad1a7a81483a8f0c0caab4e8998c + parentId: wrk_db59cf2b74764e6a80c0dcbcf3d67130 + modified: 1661942223227 + created: 1661942202873 + name: localhost:4010 + url: ws://localhost:4010 + metaSortKey: -1661942202873 + headers: [] + authentication: {} + _type: websocket_request + - _id: wrk_db59cf2b74764e6a80c0dcbcf3d67130 + parentId: null + modified: 1661942194367 + created: 1661942194367 + name: WebSockets + description: "" + scope: collection + _type: workspace + - _id: ws-req_c522379d686b44179e9626fc6c8ed88a + parentId: wrk_db59cf2b74764e6a80c0dcbcf3d67130 + modified: 1662451274029 + created: 1662451239058 + name: basic-auth + url: ws://localhost:4010/basic-auth + metaSortKey: -1661942202823 + headers: [] + authentication: + type: basic + useISO88591: false + disabled: false + username: user + password: password + _type: websocket_request + - _id: ws-req_2157c597bcbb4614b64c7c99c6f7a982 + parentId: wrk_db59cf2b74764e6a80c0dcbcf3d67130 + modified: 1662451369688 + created: 1662451318293 + name: bearer + url: ws://localhost:4010/bearer + metaSortKey: -1661942202723 + headers: [] + authentication: + type: bearer + token: insomnia-cool-token-!!!1112113243111 + disabled: false + _type: websocket_request + - _id: ws-req_6b9c944a7f034fcb8b0a92e5442538d7 + parentId: wrk_db59cf2b74764e6a80c0dcbcf3d67130 + modified: 1662451456879 + created: 1662451430343 + name: redirect + url: ws://localhost:4010/redirect + metaSortKey: -1661942202623 + headers: [] + authentication: {} + _type: websocket_request + - _id: env_78d7375877d288dfb527a256e6d7e92dce4ff968 + parentId: wrk_db59cf2b74764e6a80c0dcbcf3d67130 + modified: 1661942194375 + created: 1661942194375 + name: Base Environment + data: {} + dataPropertyOrder: null + color: null + isPrivate: false + metaSortKey: 1661942194375 + _type: environment + - _id: jar_78d7375877d288dfb527a256e6d7e92dce4ff968 + parentId: wrk_db59cf2b74764e6a80c0dcbcf3d67130 + modified: 1661942194378 + created: 1661942194378 + name: Default Jar + cookies: [] + _type: cookie_jar + - _id: spc_2d11197686aa40ec8f5f072727af4a7a + parentId: wrk_db59cf2b74764e6a80c0dcbcf3d67130 + modified: 1661942194369 + created: 1661942194369 + fileName: ws example + contents: "" + contentType: yaml + _type: api_spec diff --git a/packages/insomnia-smoke-test/package-lock.json b/packages/insomnia-smoke-test/package-lock.json index 144b94d8f1..1e0ea56767 100644 --- a/packages/insomnia-smoke-test/package-lock.json +++ b/packages/insomnia-smoke-test/package-lock.json @@ -22,6 +22,7 @@ "@types/oidc-provider": "^7.8.1", "@types/ramda": "^0.27.45", "@types/uuid": "^8.3.4", + "@types/ws": "^8.5.3", "concurrently": "^7.0.0", "cross-env": "^7.0.3", "execa": "^5.0.0", @@ -38,6 +39,7 @@ "ramda-adjunct": "^2.34.0", "ts-node": "^9.1.1", "uuid": "^8.3.2", + "ws": "^8.8.1", "xvfb-maybe": "^0.2.1" } }, @@ -1453,6 +1455,15 @@ "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/yargs": { "version": "17.0.10", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", @@ -5644,6 +5655,27 @@ "node": "^12.13.0 || ^14.15.0 || >=16" } }, + "node_modules/ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xvfb-maybe": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/xvfb-maybe/-/xvfb-maybe-0.2.1.tgz", @@ -6957,6 +6989,15 @@ "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/yargs": { "version": "17.0.10", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", @@ -10192,6 +10233,13 @@ "signal-exit": "^3.0.7" } }, + "ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "dev": true, + "requires": {} + }, "xvfb-maybe": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/xvfb-maybe/-/xvfb-maybe-0.2.1.tgz", diff --git a/packages/insomnia-smoke-test/package.json b/packages/insomnia-smoke-test/package.json index 70b73d13ee..e22ccaee25 100644 --- a/packages/insomnia-smoke-test/package.json +++ b/packages/insomnia-smoke-test/package.json @@ -41,6 +41,7 @@ "@types/oidc-provider": "^7.8.1", "@types/ramda": "^0.27.45", "@types/uuid": "^8.3.4", + "@types/ws": "^8.5.3", "concurrently": "^7.0.0", "cross-env": "^7.0.3", "execa": "^5.0.0", @@ -57,6 +58,7 @@ "ramda-adjunct": "^2.34.0", "ts-node": "^9.1.1", "uuid": "^8.3.2", + "ws": "^8.8.1", "xvfb-maybe": "^0.2.1" } } diff --git a/packages/insomnia-smoke-test/server/index.ts b/packages/insomnia-smoke-test/server/index.ts index 4d6cadd29a..5b8acd0bbe 100644 --- a/packages/insomnia-smoke-test/server/index.ts +++ b/packages/insomnia-smoke-test/server/index.ts @@ -1,5 +1,8 @@ import express from 'express'; import { graphqlHTTP } from 'express-graphql'; +import { readFileSync } from 'fs'; +import { createServer } from 'https'; +import { join } from 'path'; import { basicAuthRouter } from './basic-auth'; import githubApi from './github-api'; @@ -7,9 +10,11 @@ import gitlabApi from './gitlab-api'; import { root, schema } from './graphql'; import { startGRPCServer } from './grpc'; import { oauthRoutes } from './oauth'; +import { startWebSocketServer } from './websocket'; const app = express(); const port = 4010; +const httpsPort = 4011; const grpcPort = 50051; app.get('/pets/:id', (req, res) => { @@ -55,7 +60,23 @@ app.use('/graphql', graphqlHTTP({ })); startGRPCServer(grpcPort).then(() => { - app.listen(port, () => { + const server = app.listen(port, () => { console.log(`Listening at http://localhost:${port}`); + console.log(`Listening at ws://localhost:${port}`); }); + + const httpsServer = createServer({ + cert: readFileSync(join(__dirname, '../fixtures/certificates/localhost.pem')), + ca: readFileSync(join(__dirname, '../fixtures/certificates/rootCA.pem')), + key: readFileSync(join(__dirname, '../fixtures/certificates/localhost-key.pem')), + // Only allow connections using valid client certificates + requestCert: true, + rejectUnauthorized: true, + }, app); + httpsServer.listen(httpsPort, () => { + console.log(`Listening at https://localhost:${httpsPort}`); + console.log(`Listening at wss://localhost:${httpsPort}`); + }); + + startWebSocketServer(server, httpsServer); }); diff --git a/packages/insomnia-smoke-test/server/websocket.ts b/packages/insomnia-smoke-test/server/websocket.ts new file mode 100644 index 0000000000..de19084886 --- /dev/null +++ b/packages/insomnia-smoke-test/server/websocket.ts @@ -0,0 +1,83 @@ +import { IncomingMessage, Server } from 'http'; +import { Socket } from 'net'; +import { WebSocket, WebSocketServer } from 'ws'; + +/** + * Starts an echo WebSocket server that receives messages from a client and echoes them back. + */ +export function startWebSocketServer(server: Server, httpsServer: Server) { + const wsServer = new WebSocketServer({ noServer: true }); + const wssServer = new WebSocketServer({ noServer: true }); + + server.on('upgrade', (request, socket, head) => { + upgrade(wsServer, request, socket, head); + }); + httpsServer.on('upgrade', (request, socket, head) => { + upgrade(wssServer, request, socket, head); + }); + wsServer.on('connection', handleConnection); + wssServer.on('connection', handleConnection); +} + +const handleConnection = (ws: WebSocket, req: IncomingMessage) => { + console.log('WebSocket connection was opened'); + console.log('Upgrade headers:', req.headers); + + ws.on('message', (message, isBinary) => { + if (isBinary) { + ws.send(message); + return; + } + if (message.toString() === 'close') { + ws.close(1003, 'Invalid message type'); + } + ws.send(message.toString()); + }); + + ws.on('close', () => { + console.log('WebSocket connection was closed'); + }); +}; +const redirectOnSuccess = (socket: Socket) => { + socket.end(`HTTP/1.1 302 Found +Location: ws://localhost:4010 + +`); + return; +}; +const return401withBody = (socket: Socket) => { + socket.end(`HTTP/1.1 401 Unauthorized + + + + +
+

401 Unauthorized

+
+ + `); + return; +}; +const upgrade = (wss: WebSocketServer, request: IncomingMessage, socket: Socket, head: Buffer) => { + if (request.url === '/redirect') { + return redirectOnSuccess(socket); + } + if (request.url === '/bearer') { + if (request.headers.authorization !== 'Bearer insomnia-cool-token-!!!1112113243111') { + return401withBody(socket); + return; + } + return redirectOnSuccess(socket); + } + if (request.url === '/basic-auth') { + // login with user:password + if (request.headers.authorization !== 'Basic dXNlcjpwYXNzd29yZA==') { + return401withBody(socket); + return; + } + return redirectOnSuccess(socket); + } + wss.handleUpgrade(request, socket, head, ws => { + wss.emit('connection', ws, request); + }); +}; diff --git a/packages/insomnia-smoke-test/tests/websocket.test.ts b/packages/insomnia-smoke-test/tests/websocket.test.ts new file mode 100644 index 0000000000..590221ba04 --- /dev/null +++ b/packages/insomnia-smoke-test/tests/websocket.test.ts @@ -0,0 +1,52 @@ +import { expect } from '@playwright/test'; + +import { loadFixture } from '../playwright/paths'; +import { test } from '../playwright/test'; + +test('can make websocket connection', async ({ app, page }) => { + test.slow(process.platform === 'darwin' || process.platform === 'win32', 'Slow app start on these platforms'); + const statusTag = page.locator('[data-testid="response-status-tag"]:visible'); + const responseBody = page.locator('[data-testid="response-pane"] >> [data-testid="CodeEditor"]:visible', { + has: page.locator('.CodeMirror-activeline'), + }); + + await page.click('[data-testid="project"]'); + await page.click('text=Create'); + + const text = await loadFixture('websockets.yaml'); + await app.evaluate(async ({ clipboard }, text) => clipboard.writeText(text), text); + + await page.click('button:has-text("Clipboard")'); + await page.click('text=CollectionWebSocketsjust now'); + + await page.click('button:has-text("localhost:4010")'); + await page.click('text=Connect'); + await expect(statusTag).toContainText('101 Switching Protocols'); + await page.click('[data-testid="response-pane"] >> [role="tab"]:has-text("Timeline")'); + await expect(responseBody).toContainText('WebSocket connection established'); + + await page.click('text=Disconnect'); + await expect(responseBody).toContainText('Closing connection with code 1005'); + + // Can connect with Basic Auth + await page.click('button:has-text("basic-auth")'); + await page.click('text=Connect'); + await expect(statusTag).toContainText('101 Switching Protocols'); + await page.click('[data-testid="response-pane"] >> [role="tab"]:has-text("Timeline")'); + await expect(responseBody).toContainText('> authorization: Basic dXNlcjpwYXNzd29yZA=='); + + // Can connect with Bearer Auth + await page.click('button:has-text("bearer")'); + await page.click('text=Connect'); + await expect(statusTag).toContainText('101 Switching Protocols'); + await page.click('[data-testid="response-pane"] >> [role="tab"]:has-text("Timeline")'); + await expect(responseBody).toContainText('> authorization: Bearer insomnia-cool-token-!!!1112113243111'); + + // Can handle redirects + await page.click('button:has-text("redirect")'); + await page.click('text=Connect'); + await expect(statusTag).toContainText('101 Switching Protocols'); + await page.click('[data-testid="response-pane"] >> [role="tab"]:has-text("Timeline")'); + await expect(responseBody).toContainText('WebSocket connection established'); + +}); diff --git a/packages/insomnia/package-lock.json b/packages/insomnia/package-lock.json index 1d9a1aa1d3..538b61d1ab 100644 --- a/packages/insomnia/package-lock.json +++ b/packages/insomnia/package-lock.json @@ -98,6 +98,7 @@ "@types/tough-cookie": "^2.3.7", "@types/uuid": "^8.3.4", "@types/vkbeautify": "^0.99.2", + "@types/ws": "^8.5.3", "@types/yaml": "^1.9.7", "@vitejs/plugin-react": "^1.2.0", "buffer": "^6.0.3", @@ -140,6 +141,7 @@ "react-sortable-hoc": "^2.0.0", "react-tabs": "^3.2.3", "react-use": "^17.2.4", + "react-virtual": "2.10.4", "redux": "^4.1.2", "redux-mock-store": "^1.5.4", "redux-thunk": "^2.4.1", @@ -151,7 +153,8 @@ "typescript": "^4.5.5", "vite": "^2.8.6", "vite-plugin-commonjs-externals": "^0.1.1", - "vkbeautify": "^0.99.1" + "vkbeautify": "^0.99.1", + "ws": "^8.8.1" } }, "node_modules/@ampproject/remapping": { @@ -3162,6 +3165,12 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, + "node_modules/@reach/observe-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@reach/observe-rect/-/observe-rect-1.2.0.tgz", + "integrity": "sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==", + "dev": true + }, "node_modules/@repeaterjs/repeater": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", @@ -17604,6 +17613,21 @@ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", "dev": true }, + "node_modules/react-virtual": { + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/react-virtual/-/react-virtual-2.10.4.tgz", + "integrity": "sha512-Ir6+oPQZTVHfa6+JL9M7cvMILstFZH/H3jqeYeKI4MSUX+rIruVwFC6nGVXw9wqAw8L0Kg2KvfXxI85OvYQdpQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/tannerlinsley" + ], + "dependencies": { + "@reach/observe-rect": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.3 || ^17.0.0" + } + }, "node_modules/read-config-file": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.2.0.tgz", @@ -20379,9 +20403,9 @@ } }, "node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "dev": true, "engines": { "node": ">=10.0.0" @@ -22979,6 +23003,12 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, + "@reach/observe-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@reach/observe-rect/-/observe-rect-1.2.0.tgz", + "integrity": "sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==", + "dev": true + }, "@repeaterjs/repeater": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.0.4.tgz", @@ -34248,6 +34278,15 @@ } } }, + "react-virtual": { + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/react-virtual/-/react-virtual-2.10.4.tgz", + "integrity": "sha512-Ir6+oPQZTVHfa6+JL9M7cvMILstFZH/H3jqeYeKI4MSUX+rIruVwFC6nGVXw9wqAw8L0Kg2KvfXxI85OvYQdpQ==", + "dev": true, + "requires": { + "@reach/observe-rect": "^1.1.0" + } + }, "read-config-file": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.2.0.tgz", @@ -36425,9 +36464,9 @@ } }, "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "dev": true, "requires": {} }, diff --git a/packages/insomnia/package.json b/packages/insomnia/package.json index c8250b2309..14476ed550 100644 --- a/packages/insomnia/package.json +++ b/packages/insomnia/package.json @@ -153,6 +153,7 @@ "@types/tough-cookie": "^2.3.7", "@types/uuid": "^8.3.4", "@types/vkbeautify": "^0.99.2", + "@types/ws": "^8.5.3", "@types/yaml": "^1.9.7", "@vitejs/plugin-react": "^1.2.0", "buffer": "^6.0.3", @@ -196,6 +197,7 @@ "react-sortable-hoc": "^2.0.0", "react-tabs": "^3.2.3", "react-use": "^17.2.4", + "react-virtual": "2.10.4", "redux": "^4.1.2", "redux-mock-store": "^1.5.4", "redux-thunk": "^2.4.1", @@ -207,7 +209,8 @@ "typescript": "^4.5.5", "vite": "^2.8.6", "vite-plugin-commonjs-externals": "^0.1.1", - "vkbeautify": "^0.99.1" + "vkbeautify": "^0.99.1", + "ws": "^8.8.1" }, "dev": { "dev-server-port": 3334 diff --git a/packages/insomnia/src/__jest__/mock-code-editor.tsx b/packages/insomnia/src/__jest__/mock-code-editor.tsx index e71b1efffb..985b63b5a2 100644 --- a/packages/insomnia/src/__jest__/mock-code-editor.tsx +++ b/packages/insomnia/src/__jest__/mock-code-editor.tsx @@ -12,6 +12,7 @@ export class MockCodeEditor extends PureComponent { render() { const { id, onChange, placeholder, defaultValue } = this.props; return