You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by ju...@apache.org on 2020/06/04 04:25:56 UTC

[incubator-apisix-dashboard] 01/01: feat: update upstream

This is an automated email from the ASF dual-hosted git repository.

juzhiyuan pushed a commit to branch fix-upstream
in repository https://gitbox.apache.org/repos/asf/incubator-apisix-dashboard.git

commit cc452260e9d7e4a1bb4f063999ad03da47f6587a
Author: juzhiyuan <jj...@gmail.com>
AuthorDate: Thu Jun 4 12:25:31 2020 +0800

    feat: update upstream
---
 src/pages/Routes/Create.tsx                        |  2 +-
 .../Routes/components/Step2/RequestRewriteView.tsx | 28 ++++++++++++++++------
 src/pages/Routes/constants.ts                      | 11 +++++----
 src/pages/Routes/transform.ts                      | 26 +++++++++++++-------
 src/pages/Routes/typing.d.ts                       | 21 +++++++---------
 5 files changed, 53 insertions(+), 35 deletions(-)

diff --git a/src/pages/Routes/Create.tsx b/src/pages/Routes/Create.tsx
index 3196fc3..035f09b 100644
--- a/src/pages/Routes/Create.tsx
+++ b/src/pages/Routes/Create.tsx
@@ -33,7 +33,7 @@ const Create: React.FC = (props) => {
   const initRoute = (rid: number) => {
     fetchRoute(rid).then((data) => {
       form1.setFieldsValue(data.step1Data);
-      setStep1Data(data.step1Data);
+      setStep1Data(data.step1Data as RouteModule.Step1Data);
 
       form2.setFieldsValue(data.step2Data);
       setStep2Data(data.step2Data);
diff --git a/src/pages/Routes/components/Step2/RequestRewriteView.tsx b/src/pages/Routes/components/Step2/RequestRewriteView.tsx
index dc31a1c..3c622e2 100644
--- a/src/pages/Routes/components/Step2/RequestRewriteView.tsx
+++ b/src/pages/Routes/components/Step2/RequestRewriteView.tsx
@@ -105,19 +105,33 @@ const RequestRewriteView: React.FC<Props> = ({ data, form, disabled, onChange })
           rules={[{ required: true, message: '请勾选协议' }]}
         >
           <Radio.Group onChange={onProtocolChange} name="upstreamProtocol" disabled={disabled}>
-            <Radio value="original">原始请求</Radio>
+            <Radio value="keep">保持原样</Radio>
             <Radio value="http">HTTP</Radio>
             <Radio value="https">HTTPS</Radio>
           </Radio.Group>
         </Form.Item>
         {renderUpstreamMeta()}
-        <Form.Item
-          label="请求路径"
-          name="upstreamPath"
-          rules={[{ required: true, message: '请输入请求路径' }]}
-        >
-          <Input disabled={disabled} />
+        <Form.Item label="请求路径">
+          <Radio.Group
+            defaultValue={step2Data.upstreamPath === undefined ? 'keep' : 'modify'}
+            onChange={(e) => {
+              onChange({ upstreamPath: e.target.value === 'keep' ? undefined : '' });
+            }}
+            disabled={disabled}
+          >
+            <Radio value="keep">保持原样</Radio>
+            <Radio value="modify">修改</Radio>
+          </Radio.Group>
         </Form.Item>
+        {step2Data.upstreamPath !== undefined && (
+          <Form.Item
+            label="新路径"
+            name="upstreamPath"
+            rules={[{ required: true, message: '请输入请求路径' }]}
+          >
+            <Input disabled={disabled} />
+          </Form.Item>
+        )}
         <Form.Item label="连接超时" required>
           <Form.Item
             name={['timeout', 'connect']}
diff --git a/src/pages/Routes/constants.ts b/src/pages/Routes/constants.ts
index fade6a1..b943542 100644
--- a/src/pages/Routes/constants.ts
+++ b/src/pages/Routes/constants.ts
@@ -38,14 +38,15 @@ export const DEFAULT_STEP_1_DATA: RouteModule.Step1Data = {
 };
 
 export const DEFAULT_STEP_2_DATA: RouteModule.Step2Data = {
-  upstreamProtocol: 'original',
+  upstreamProtocol: 'keep',
+  // TODO: 展示 placeholder
   upstreamHostList: [{ host: '', port: 80, weight: 0 }],
   upstreamHeaderList: [],
-  upstreamPath: '',
+  upstreamPath: undefined,
   timeout: {
-    connect: 30000,
-    send: 30000,
-    read: 30000,
+    connect: 10000,
+    send: 10000,
+    read: 10000,
   },
 };
 
diff --git a/src/pages/Routes/transform.ts b/src/pages/Routes/transform.ts
index 0842978..4000ffd 100644
--- a/src/pages/Routes/transform.ts
+++ b/src/pages/Routes/transform.ts
@@ -30,7 +30,7 @@ export const transformStepData = ({
     protocols = protocols.concat('websocket');
   }
 
-  const data: RouteModule.Body = {
+  const data: Partial<RouteModule.Body> = {
     ...step1Data,
     ...step2Data,
     ...step3Data,
@@ -59,11 +59,14 @@ export const transformStepData = ({
       timeout: step2Data.timeout,
     },
     upstream_header,
-    upstream_path: {
-      to: step2Data.upstreamPath,
-    },
   };
 
+  if (step2Data.upstreamPath) {
+    data.upstream_path = {
+      to: step2Data.upstreamPath,
+    };
+  }
+
   return omit(data, [
     'advancedMatchingRules',
     'upstreamProtocol',
@@ -102,10 +105,9 @@ const transformUpstreamNodes = (nodes: { [key: string]: number }): RouteModule.U
 };
 
 export const transformRouteData = (data: RouteModule.Body) => {
-  const { name, desc, methods, uris, protocols, hosts, vars } = data;
-  // TODO: redirect
+  const { name, desc, methods, uris, protocols, hosts, vars, redirect } = data;
 
-  const step1Data: RouteModule.Step1Data = {
+  const step1Data: Partial<RouteModule.Step1Data> = {
     name,
     desc,
     protocols: protocols.filter((item) => item !== 'websocket'),
@@ -114,8 +116,15 @@ export const transformRouteData = (data: RouteModule.Body) => {
     paths: uris,
     methods,
     advancedMatchingRules: transformVarsToRules(vars),
+    redirect: Boolean(redirect),
+    forceHttps: Boolean(redirect.redirect_to_https),
   };
 
+  if (redirect.code) {
+    step1Data.redirectCode = redirect.code;
+    step1Data.redirectURI = redirect.uri;
+  }
+
   const { upstream, upstream_path, upstream_header } = data;
 
   const upstreamHeaderList = Object.entries(upstream_header).map(([k, v]) => {
@@ -123,8 +132,7 @@ export const transformRouteData = (data: RouteModule.Body) => {
   });
 
   const step2Data: RouteModule.Step2Data = {
-    // TODO: API
-    upstreamProtocol: 'original',
+    upstreamProtocol: 'keep',
     upstreamHeaderList,
     upstreamHostList: transformUpstreamNodes(upstream.nodes),
     upstreamPath: upstream_path.to,
diff --git a/src/pages/Routes/typing.d.ts b/src/pages/Routes/typing.d.ts
index 5024e20..5f513ba 100644
--- a/src/pages/Routes/typing.d.ts
+++ b/src/pages/Routes/typing.d.ts
@@ -25,7 +25,7 @@ declare namespace RouteModule {
     redirect: boolean;
     forceHttps: boolean;
     redirectURI?: string;
-    redirectCode?: boolean;
+    redirectCode?: number;
     advancedMatchingRules: MatchingRule[];
   };
 
@@ -61,9 +61,9 @@ declare namespace RouteModule {
   }
 
   type Step2Data = {
-    upstreamProtocol: 'http' | 'https' | 'original';
+    upstreamProtocol: 'http' | 'https' | 'keep';
     upstreamHostList: UpstreamHost[];
-    upstreamPath: string;
+    upstreamPath: string | undefined;
     upstreamHeaderList: UpstreamHeader[];
     timeout: {
       connect: number;
@@ -74,16 +74,11 @@ declare namespace RouteModule {
 
   type ModalType = 'CREATE' | 'EDIT';
 
-  type Redirect =
-    | {
-        redirect_to_https: boolean;
-        code: 301 | 302;
-        uri: string;
-      }
-    | {
-        redirect_to_https: boolean;
-      }
-    | {};
+  type Redirect = {
+    code?: number;
+    uri?: string;
+    redirect_to_https?: boolean;
+  };
 
   // Request Body or Response Data for API
   type Body = {