From 0dde1473478ec7698f4114a7335aaa1b5bb8648e Mon Sep 17 00:00:00 2001 From: Inchan Hwang Date: Sun, 26 Jul 2020 21:06:28 -0400 Subject: [PATCH] allow setting different expected msg for failing (300 <=) requests [#22] --- src/core/http_client/client.ts | 9 ++++- src/core/http_client/request.ts | 1 + .../ExpectedBodyInput/ExpectedBodyInput.tsx | 38 +++++++++++++++++-- .../ExpectedBodyInputActions.ts | 17 ++++++++- .../ExpectedBodyInputReducer.ts | 11 ++++++ .../RequestBuilderView/RequestBuilderView.tsx | 8 +++- src/renderer/models/request_builder.ts | 6 ++- 7 files changed, 79 insertions(+), 11 deletions(-) diff --git a/src/core/http_client/client.ts b/src/core/http_client/client.ts index b245842..a154c66 100644 --- a/src/core/http_client/client.ts +++ b/src/core/http_client/client.ts @@ -32,7 +32,7 @@ async function translateResponse( const responseHeaders = unconvertHeaders(response.headers); const saidContentType = responseHeaders.find(([name]) => name === 'content-type')?.[1]; - const { expectedProtobufMsg } = request; + const { expectedProtobufMsg, expectedProtobufMsgOnError } = request; let responseBodyType: ResponseBodyType = 'unknown'; let responseBodyValue: ResponseBodyValue = undefined; @@ -50,7 +50,12 @@ async function translateResponse( responseBodyType = 'html'; responseBodyValue = toStr(buf); } else if (expectedProtobufMsg) { - const res = await deserializeProtobuf(buf, expectedProtobufMsg, protoCtx); + let msgToUse = expectedProtobufMsg; + if (!response.ok && expectedProtobufMsgOnError) { + msgToUse = expectedProtobufMsgOnError; + } + + const res = await deserializeProtobuf(buf, msgToUse, protoCtx); switch (res.tag) { case 'invalid': if (res.value) { diff --git a/src/core/http_client/request.ts b/src/core/http_client/request.ts index 41a02ba..c05ee11 100644 --- a/src/core/http_client/request.ts +++ b/src/core/http_client/request.ts @@ -8,4 +8,5 @@ export interface RequestDescriptor { readonly headers: ReadonlyArray<[string, string]>; readonly body: Uint8Array | undefined; readonly expectedProtobufMsg: string | undefined; + readonly expectedProtobufMsgOnError: string | undefined; } diff --git a/src/renderer/components/Flow/request/ExpectedBodyInput/ExpectedBodyInput.tsx b/src/renderer/components/Flow/request/ExpectedBodyInput/ExpectedBodyInput.tsx index db72e71..03cf50f 100644 --- a/src/renderer/components/Flow/request/ExpectedBodyInput/ExpectedBodyInput.tsx +++ b/src/renderer/components/Flow/request/ExpectedBodyInput/ExpectedBodyInput.tsx @@ -1,24 +1,35 @@ import React from 'react'; import { Select } from 'antd'; import { useDispatch } from 'react-redux'; -import { selectResponseMessageName } from './ExpectedBodyInputActions'; +import { selectResponseMessageName, selectResponseMessageOnErrorName } from './ExpectedBodyInputActions'; import { MESSAGE_NAME_WIDTH } from '../BodyInput/BodyInput'; type Props = { messageNames: ReadonlyArray; expectedProtobufMsg: string | undefined; + expectedProtobufMsgOnError: string | undefined; }; -const ExpectedBodyInput: React.FunctionComponent = ({ messageNames, expectedProtobufMsg }) => { +const LABEL_STYLE = { display: 'inline-block', width: 100 }; + +const ExpectedBodyInput: React.FunctionComponent = ({ + messageNames, + expectedProtobufMsg, + expectedProtobufMsgOnError, +}) => { const dispatch = useDispatch(); function onSelectResponseMsg(msgName: string): void { dispatch(selectResponseMessageName(msgName)); } + function onSelectResponseMsgOnError(msgName: string): void { + dispatch(selectResponseMessageOnErrorName(msgName)); + } + return (
- Expected protobuf message: + On [200, 300): + +
+ + On [300, ∞): +
); }; diff --git a/src/renderer/components/Flow/request/ExpectedBodyInput/ExpectedBodyInputActions.ts b/src/renderer/components/Flow/request/ExpectedBodyInput/ExpectedBodyInputActions.ts index 9a67ea4..abf145e 100644 --- a/src/renderer/components/Flow/request/ExpectedBodyInput/ExpectedBodyInputActions.ts +++ b/src/renderer/components/Flow/request/ExpectedBodyInput/ExpectedBodyInputActions.ts @@ -3,10 +3,16 @@ type SelectResponseMessageName = { name: string; }; +type SelectResponseMessageOnErrorName = { + type: 'SELECT_RESPONSE_MESSAGE_ON_ERROR_NAME'; + name: string; +}; + const SELECT_RESPONSE_MESSAGE_NAME = 'SELECT_RESPONSE_MESSAGE_NAME'; +const SELECT_RESPONSE_MESSAGE_ON_ERROR_NAME = 'SELECT_RESPONSE_MESSAGE_ON_ERROR_NAME'; -export const ExpectedBodyInputActionTypes = [SELECT_RESPONSE_MESSAGE_NAME]; -export type ExpectedBodyInputActions = SelectResponseMessageName; +export const ExpectedBodyInputActionTypes = [SELECT_RESPONSE_MESSAGE_NAME, SELECT_RESPONSE_MESSAGE_ON_ERROR_NAME]; +export type ExpectedBodyInputActions = SelectResponseMessageName | SelectResponseMessageOnErrorName; export function selectResponseMessageName(name: string): SelectResponseMessageName { return { @@ -14,3 +20,10 @@ export function selectResponseMessageName(name: string): SelectResponseMessageNa name, }; } + +export function selectResponseMessageOnErrorName(name: string): SelectResponseMessageOnErrorName { + return { + type: SELECT_RESPONSE_MESSAGE_ON_ERROR_NAME, + name, + }; +} diff --git a/src/renderer/components/Flow/request/ExpectedBodyInput/ExpectedBodyInputReducer.ts b/src/renderer/components/Flow/request/ExpectedBodyInput/ExpectedBodyInputReducer.ts index 4be311b..55ca248 100644 --- a/src/renderer/components/Flow/request/ExpectedBodyInput/ExpectedBodyInputReducer.ts +++ b/src/renderer/components/Flow/request/ExpectedBodyInput/ExpectedBodyInputReducer.ts @@ -16,6 +16,17 @@ export default function ExpectedBodyInputReducer(s: AppState, action: AnyAction) const flow = getByKey(collection.flows, draft.currentFlow); if (!flow) return s; flow.requestBuilder.expectedProtobufMsg = a.name; + if (!flow.requestBuilder.expectedProtobufMsgOnError) { + flow.requestBuilder.expectedProtobufMsgOnError = a.name; + } + }); + case 'SELECT_RESPONSE_MESSAGE_ON_ERROR_NAME': + return produce(s, draft => { + const collection = getByKey(draft.collections, draft.currentCollection); + if (!collection) return s; + const flow = getByKey(collection.flows, draft.currentFlow); + if (!flow) return s; + flow.requestBuilder.expectedProtobufMsgOnError = a.name; }); default: return s; diff --git a/src/renderer/components/Flow/request/RequestBuilderView/RequestBuilderView.tsx b/src/renderer/components/Flow/request/RequestBuilderView/RequestBuilderView.tsx index 90cb458..9c90b6d 100644 --- a/src/renderer/components/Flow/request/RequestBuilderView/RequestBuilderView.tsx +++ b/src/renderer/components/Flow/request/RequestBuilderView/RequestBuilderView.tsx @@ -37,7 +37,7 @@ type Props = { }; const RequestBuilderView: React.FunctionComponent = ({ requestBuilder, protoCtx, messageNames, onSend }) => { - const { method, url, headers, bodyType, bodies, expectedProtobufMsg } = requestBuilder; + const { method, url, headers, bodyType, bodies, expectedProtobufMsg, expectedProtobufMsgOnError } = requestBuilder; return ( @@ -53,7 +53,11 @@ const RequestBuilderView: React.FunctionComponent = ({ requestBuilder, pr - + diff --git a/src/renderer/models/request_builder.ts b/src/renderer/models/request_builder.ts index 4ec997c..c5ca9ce 100644 --- a/src/renderer/models/request_builder.ts +++ b/src/renderer/models/request_builder.ts @@ -14,7 +14,8 @@ export interface RequestBuilder { readonly headers: ReadonlyArray<[string, string]>; readonly bodyType: BodyType; readonly bodies: RequestBody; - readonly expectedProtobufMsg: string | undefined; + readonly expectedProtobufMsg?: string; + readonly expectedProtobufMsgOnError?: string; } export interface RequestBody { @@ -27,7 +28,7 @@ export async function toRequestDescriptor( env: Env, ctx: ProtoCtx, ): Promise { - const { url, method, headers, bodyType, bodies, expectedProtobufMsg } = builder; + const { url, method, headers, bodyType, bodies, expectedProtobufMsg, expectedProtobufMsgOnError } = builder; const varMap = toVarMap(env); let body; @@ -44,5 +45,6 @@ export async function toRequestDescriptor( headers: headers.map(([k, v]) => [k, applyEnvs(v, varMap)]), body, expectedProtobufMsg, + expectedProtobufMsgOnError, }; }