You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by li...@apache.org on 2021/05/27 06:32:17 UTC

[apisix-dashboard] branch master updated: fix: regex & omit vars when no value (#1921)

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

liuxiran pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-dashboard.git


The following commit(s) were added to refs/heads/master by this push:
     new d11ff4f  fix: regex & omit vars when no value (#1921)
d11ff4f is described below

commit d11ff4f587438d2854007424ecd436b3b907ad62
Author: Ayush das <ay...@gmail.com>
AuthorDate: Thu May 27 12:02:09 2021 +0530

    fix: regex & omit vars when no value (#1921)
---
 .../route/create-edit-duplicate-delete-route.spec.js   | 18 +++++++++++++++++-
 web/src/components/Plugin/UI/referer-restriction.tsx   |  4 +++-
 web/src/components/Upstream/components/Nodes.tsx       |  4 ++--
 .../Upstream/components/active-check/Host.tsx          |  2 +-
 .../pages/Route/components/Step1/RequestConfigView.tsx |  8 +-------
 web/src/pages/Route/locales/en-US.ts                   |  5 +----
 web/src/pages/Route/locales/zh-CN.ts                   |  4 +---
 web/src/pages/Route/transform.ts                       |  7 ++++---
 8 files changed, 30 insertions(+), 22 deletions(-)

diff --git a/web/cypress/integration/route/create-edit-duplicate-delete-route.spec.js b/web/cypress/integration/route/create-edit-duplicate-delete-route.spec.js
index c4fde0c..a579471 100644
--- a/web/cypress/integration/route/create-edit-duplicate-delete-route.spec.js
+++ b/web/cypress/integration/route/create-edit-duplicate-delete-route.spec.js
@@ -52,6 +52,9 @@ context('Create and Delete Route', () => {
     notificationCloseIcon: '.ant-notification-close-icon',
     notification: '.ant-notification-notice-message',
     addHost: '[data-cy=addHost]',
+    schemaErrorMessage: ".ant-form-item-explain.ant-form-item-explain-error",
+    advancedMatchingTable: ".ant-table-row.ant-table-row-level-0",
+    advancedMatchingTableOperation: ".ant-space"
   };
 
   const data = {
@@ -59,6 +62,8 @@ context('Create and Delete Route', () => {
     host1: '11.11.11.11',
     host2: '12.12.12.12',
     host3: '10.10.10.10',
+    host4: '@',
+    host5: '*1',
     port: '80',
     weight: 1,
     basicAuthPlugin: 'basic-auth',
@@ -101,7 +106,11 @@ context('Create and Delete Route', () => {
     cy.contains('Confirm').click();
 
     cy.contains('Next').click();
-    cy.get(selector.nodes_0_host).type(data.host2);
+    cy.get(selector.nodes_0_host).type(data.host4);
+    cy.get(selector.schemaErrorMessage).should('exist');
+    cy.get(selector.nodes_0_host).clear().type(data.host5);
+    cy.get(selector.schemaErrorMessage).should('not.exist');
+    cy.get(selector.nodes_0_host).clear().type(data.host2);
     cy.get(selector.nodes_0_port).type(data.port);
     cy.get(selector.nodes_0_weight).type(data.weight);
     cy.contains('Next').click();
@@ -174,6 +183,7 @@ context('Create and Delete Route', () => {
 
     cy.get(selector.codemirrorScroll).within(() => {
       cy.contains('upstream').should('exist');
+      cy.contains('vars').should('exist')
       cy.contains(name).should('exist');
     });
   });
@@ -190,6 +200,11 @@ context('Create and Delete Route', () => {
     cy.get('#status').should('have.class', 'ant-switch-checked');
     cy.get(selector.name).clear().type(newName);
     cy.get(selector.description).clear().type(data.description2);
+    cy.get(selector.advancedMatchingTable).should('exist');
+    cy.get(selector.advancedMatchingTableOperation).within(() => {
+      cy.contains('Delete').click().should('not.exist');
+    });
+
     cy.contains('Next').click();
     cy.contains('Next').click();
     cy.contains('Next').click();
@@ -207,6 +222,7 @@ context('Create and Delete Route', () => {
     cy.get(selector.codemirrorScroll).within(() => {
       cy.contains('upstream').should('exist');
       cy.contains(newName).should('exist');
+      cy.contains('vars').should('not.exist');
     });
   });
 
diff --git a/web/src/components/Plugin/UI/referer-restriction.tsx b/web/src/components/Plugin/UI/referer-restriction.tsx
index 971302b..0e527a1 100644
--- a/web/src/components/Plugin/UI/referer-restriction.tsx
+++ b/web/src/components/Plugin/UI/referer-restriction.tsx
@@ -73,7 +73,9 @@ const RefererRestriction: React.FC<Props> = ({ form }) => {
                         noStyle
                         required
                         rules={[{
-                          message: "",
+                          message: formatMessage({
+                            id: 'page.route.form.itemRulesPatternMessage.domain',
+                          }),
                           pattern: new RegExp(/^\*?[0-9a-zA-Z-._]+$/, 'g')
                         }, {
                           required: true,
diff --git a/web/src/components/Upstream/components/Nodes.tsx b/web/src/components/Upstream/components/Nodes.tsx
index d6eb809..50fabd3 100644
--- a/web/src/components/Upstream/components/Nodes.tsx
+++ b/web/src/components/Upstream/components/Nodes.tsx
@@ -49,11 +49,11 @@ const Component: React.FC<Props> = ({ readonly }) => {
                       },
                       {
                         pattern: new RegExp(
-                          /(^([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])(\.(25[0-5]|1\d{2}|2[0-4]\d|[1-9]?\d)){3}$|^(?![0-9.]+$)([a-zA-Z0-9_-]+)(\.[a-zA-Z0-9_-]+){0,}$)/,
+                          /^\*?[0-9a-zA-Z-._]+$/,
                           'g',
                         ),
                         message: formatMessage({
-                          id: 'page.upstream.step.valid.domain.name.or.ip',
+                          id: 'page.route.form.itemRulesPatternMessage.domain',
                         })
                       },
                     ]}
diff --git a/web/src/components/Upstream/components/active-check/Host.tsx b/web/src/components/Upstream/components/active-check/Host.tsx
index 148d60a..87e68a3 100644
--- a/web/src/components/Upstream/components/active-check/Host.tsx
+++ b/web/src/components/Upstream/components/active-check/Host.tsx
@@ -35,7 +35,7 @@ const Component: React.FC<Props> = ({ readonly }) => {
         rules={[
           {
             pattern: new RegExp(
-              /^\\*?[0-9a-zA-Z-._]+$/,
+              /^\*?[0-9a-zA-Z-._]+$/,
               'g',
             ),
             message: formatMessage({ id: 'component.upstream.fields.checks.active.host.scope' }),
diff --git a/web/src/pages/Route/components/Step1/RequestConfigView.tsx b/web/src/pages/Route/components/Step1/RequestConfigView.tsx
index 05ce260..2c7bf89 100644
--- a/web/src/pages/Route/components/Step1/RequestConfigView.tsx
+++ b/web/src/pages/Route/components/Step1/RequestConfigView.tsx
@@ -58,7 +58,7 @@ const RequestConfigView: React.FC<RouteModule.Step1PassProps> = ({
                       rules={[
                         {
                           // NOTE: https://github.com/apache/apisix/blob/master/apisix/schema_def.lua#L40
-                          pattern: new RegExp(/^\\*?[0-9a-zA-Z-._]+$/, 'g'),
+                          pattern: new RegExp(/^\*?[0-9a-zA-Z-._]+$/, 'g'),
                           message: formatMessage({
                             id: 'page.route.form.itemRulesPatternMessage.domain',
                           }),
@@ -129,12 +129,6 @@ const RequestConfigView: React.FC<RouteModule.Step1PassProps> = ({
                           whitespace: true,
                           message: formatMessage({ id: "page.route.configuration.path.rules.required.description" }),
                         },
-                        {
-                          pattern: new RegExp(/^\/[a-zA-Z0-9\-._~%!$&'()+,;=:@/]*\*?$/, 'g'),
-                          message: formatMessage({
-                            id: 'page.route.form.itemRulesPatternMessage.path',
-                          }),
-                        },
                       ]}
                       noStyle
                     >
diff --git a/web/src/pages/Route/locales/en-US.ts b/web/src/pages/Route/locales/en-US.ts
index 60bc6b9..47aa7fa 100644
--- a/web/src/pages/Route/locales/en-US.ts
+++ b/web/src/pages/Route/locales/en-US.ts
@@ -75,10 +75,9 @@ export default {
   'page.route.form.itemExtraMessage.domain':
     'Domain Name or IP, support for generic Domain Name, for example: *.test.com',
   'page.route.form.itemRulesPatternMessage.domain':
-    'Only letters, numbers and * are supported. * can only be at the beginning, and only single * is supported',
+    'Only letters, numbers, -,_ and * are supported, but * needs to be at the beginning.',
   'page.route.form.itemExtraMessage1.path':
     'HTTP Request path, for example: /foo/index.html, supports request path prefix /foo/* ; /* represents all paths',
-  'page.route.form.itemRulesPatternMessage.path': 'Begin with / , and * can only at the end',
   'page.route.form.itemRulesPatternMessage.remoteAddrs':
     'Please enter a valid IP address, for example: 192.168.1.101, 192.168.1.0/24, ::1, fe80::1, fe80::1/64',
   'page.route.form.itemExtraMessage1.remoteAddrs':
@@ -98,8 +97,6 @@ export default {
   'page.route.form.itemLabel.domainNameOrIp': 'Domain Name/IP',
   'page.route.form.itemExtraMessage.domainNameOrIp':
     'When using Domain Name, it will analysis the local: /etc/resolv.conf by default',
-  'page.route.form.itemRulesPatternMessage.domainNameOrIp':
-    'Only letters, numbers and . are supported',
   'page.route.portNumber': 'Port Number',
   'page.route.weight': 'Weight',
   'page.route.radio.staySame': 'Stay The Same',
diff --git a/web/src/pages/Route/locales/zh-CN.ts b/web/src/pages/Route/locales/zh-CN.ts
index 80a82bf..edb767f 100644
--- a/web/src/pages/Route/locales/zh-CN.ts
+++ b/web/src/pages/Route/locales/zh-CN.ts
@@ -74,10 +74,9 @@ export default {
   'page.route.form.itemLabel.redirectURI': '重定向路径',
   'page.route.form.itemExtraMessage.domain': '路由匹配的域名列表。支持泛域名,如:*.test.com',
   'page.route.form.itemRulesPatternMessage.domain':
-    '仅支持字母、数字和 * ,且 * 只能是在开头,支持单个 * ',
+    '仅支持字母、数字、-、_和 *,但 * 需要在开头位置。',
   'page.route.form.itemExtraMessage1.path':
     'HTTP 请求路径,如 /foo/index.html,支持请求路径前缀 /foo/*。/* 代表所有路径',
-  'page.route.form.itemRulesPatternMessage.path': '以 / 开头,且 * 只能在最后',
   'page.route.form.itemExtraMessage1.remoteAddrs':
     '客户端与服务器握手时 IP,即客户端 IP,例如:192.168.1.101,192.168.1.0/24,::1,fe80::1,fe80::1/64',
   'page.route.form.itemRulesPatternMessage.remoteAddrs':
@@ -113,7 +112,6 @@ export default {
 
   'page.route.form.itemLabel.domainNameOrIp': '域名/IP',
   'page.route.form.itemExtraMessage.domainNameOrIp': '使用域名时,默认解析本地:/etc/resolv.conf',
-  'page.route.form.itemRulesPatternMessage.domainNameOrIp': '仅支持字母、数字和 . ',
   'page.route.portNumber': '端口',
   'page.route.weight': '权重',
 
diff --git a/web/src/pages/Route/transform.ts b/web/src/pages/Route/transform.ts
index 4b03caa..6146b10 100644
--- a/web/src/pages/Route/transform.ts
+++ b/web/src/pages/Route/transform.ts
@@ -218,7 +218,8 @@ export const transformStepData = ({
       form1Data.hosts.filter(Boolean).length === 0 ? 'hosts' : '',
       form1Data.redirectOption === 'disabled' ? 'redirect' : '',
       data.remote_addrs?.filter(Boolean).length === 0 ? 'remote_addrs' : '',
-      step3DataCloned.plugin_config_id === '' ? 'plugin_config_id' : ''
+      step3DataCloned.plugin_config_id === '' ? 'plugin_config_id' : '',
+      data.vars?.length ? '' : 'vars',
     ]);
   }
 
@@ -235,9 +236,9 @@ export const transformStepData = ({
     'uris',
     'methods',
     'redirect',
-    'vars',
     'plugins',
     'labels',
+    data.vars?.length ? 'vars' : '',
     service_id.length !== 0 ? 'service_id' : '',
     form1Data.hosts.filter(Boolean).length !== 0 ? 'hosts' : '',
     data.remote_addrs?.filter(Boolean).length !== 0 ? 'remote_addrs' : '',
@@ -284,7 +285,7 @@ export const transformRouteData = (data: RouteModule.Body) => {
     hosts,
     host,
     remote_addrs,
-    vars,
+    vars = [],
     status,
     upstream,
     upstream_id,