This is an automated email from the ASF dual-hosted git repository.
bzp2010 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 82535863 feat: basic support Apache APISIX 2.14.1 (#2464)
82535863 is described below
commit 825358630933e751c323ebb216cc0c8f078e0173
Author: Qi Guo <[email protected]>
AuthorDate: Mon Jun 13 09:36:17 2022 +0800
feat: basic support Apache APISIX 2.14.1 (#2464)
---
api/conf/schema.json | 387 +++++++++++++++++++--
web/cypress/fixtures/plugin-dataset.json | 5 +
...e-consumer-with-api-breaker-plugin-form.spec.js | 13 +-
web/src/components/Plugin/UI/api-breaker.tsx | 124 +++++--
web/src/components/Plugin/locales/en-US.ts | 4 +
web/src/components/Plugin/locales/tr-TR.ts | 104 +++---
web/src/components/Plugin/locales/zh-CN.ts | 2 +
7 files changed, 533 insertions(+), 106 deletions(-)
diff --git a/api/conf/schema.json b/api/conf/schema.json
index fd88252b..08a3b2ee 100644
--- a/api/conf/schema.json
+++ b/api/conf/schema.json
@@ -348,12 +348,12 @@
"type": "string"
},
"host": {
- "pattern": "^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"hosts": {
"items": {
- "pattern":
"^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"minItems": 1,
@@ -398,6 +398,7 @@
"OPTIONS",
"PATCH",
"POST",
+ "PURGE",
"PUT",
"TRACE"
],
@@ -631,7 +632,7 @@
"type": "object"
},
"host": {
-
"pattern": "^\\*?[0-9a-zA-Z-._]+$",
+
"pattern": "^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"http_path": {
@@ -960,7 +961,7 @@
"items": {
"properties": {
"host": {
-
"pattern": "^\\*?[0-9a-zA-Z-._]+$",
+
"pattern": "^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"metadata": {
@@ -1014,12 +1015,13 @@
},
"scheme": {
"default": "http",
- "description": "The
scheme of the upstream. For L7 proxy, it can be one of grpc/grpcs/http/https.
For L4 proxy, it can be one of tcp/tls/udp.",
+ "description": "The
scheme of the upstream. For L7 proxy, it can be one of grpc/grpcs/http/https.
For L4 proxy, it can be one of tcp/tls/udp. For specific protocols, it can be
kafka.",
"enum": [
"grpc",
"grpcs",
"http",
"https",
+ "kafka",
"tcp",
"tls",
"udp"
@@ -1079,7 +1081,7 @@
"type": "integer"
},
"upstream_host": {
- "pattern":
"^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
}
},
@@ -1134,7 +1136,7 @@
},
"hosts": {
"items": {
- "pattern":
"^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"minItems": 1,
@@ -1253,7 +1255,7 @@
"type": "object"
},
"host": {
-
"pattern": "^\\*?[0-9a-zA-Z-._]+$",
+
"pattern": "^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"http_path": {
@@ -1582,7 +1584,7 @@
"items": {
"properties": {
"host": {
-
"pattern": "^\\*?[0-9a-zA-Z-._]+$",
+
"pattern": "^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"metadata": {
@@ -1636,12 +1638,13 @@
},
"scheme": {
"default": "http",
- "description": "The
scheme of the upstream. For L7 proxy, it can be one of grpc/grpcs/http/https.
For L4 proxy, it can be one of tcp/tls/udp.",
+ "description": "The
scheme of the upstream. For L7 proxy, it can be one of grpc/grpcs/http/https.
For L4 proxy, it can be one of tcp/tls/udp. For specific protocols, it can be
kafka.",
"enum": [
"grpc",
"grpcs",
"http",
"https",
+ "kafka",
"tcp",
"tls",
"udp"
@@ -1701,7 +1704,7 @@
"type": "integer"
},
"upstream_host": {
- "pattern":
"^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
}
},
@@ -1821,12 +1824,12 @@
"type": "object"
},
"sni": {
- "pattern": "^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"snis": {
"items": {
- "pattern":
"^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"minItems": 1,
@@ -1879,6 +1882,58 @@
"plugins": {
"type": "object"
},
+ "protocol": {
+ "properties": {
+ "conf": {
+ "description":
"protocol-specific configuration",
+ "type": "object"
+ },
+ "logger": {
+ "items": {
+ "dependencies":
{
+ "name":
[
+
"conf"
+ ]
+ },
+ "properties": {
+ "conf":
{
+
"description": "logger plugin configuration",
+
"type": "object"
+ },
+
"filter": {
+
"description": "logger filter rules",
+
"type": "array"
+ },
+ "name":
{
+
"type": "string"
+ }
+ }
+ },
+ "type": "array"
+ },
+ "name": {
+ "type": "string"
+ },
+ "superior_id": {
+ "anyOf": [
+ {
+
"maxLength": 64,
+
"minLength": 1,
+
"pattern": "^[a-zA-Z0-9-_.]+$",
+ "type":
"string"
+ },
+ {
+
"minimum": 1,
+ "type":
"integer"
+ }
+ ]
+ }
+ },
+ "required": [
+ "name"
+ ],
+ "type": "object"
+ },
"remote_addr": {
"anyOf": [
{
@@ -1937,7 +1992,7 @@
},
"sni": {
"description": "server name indication",
- "pattern": "^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"update_time": {
@@ -2012,7 +2067,7 @@
"type": "object"
},
"host": {
-
"pattern": "^\\*?[0-9a-zA-Z-._]+$",
+
"pattern": "^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"http_path": {
@@ -2341,7 +2396,7 @@
"items": {
"properties": {
"host": {
-
"pattern": "^\\*?[0-9a-zA-Z-._]+$",
+
"pattern": "^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"metadata": {
@@ -2395,12 +2450,13 @@
},
"scheme": {
"default": "http",
- "description": "The
scheme of the upstream. For L7 proxy, it can be one of grpc/grpcs/http/https.
For L4 proxy, it can be one of tcp/tls/udp.",
+ "description": "The
scheme of the upstream. For L7 proxy, it can be one of grpc/grpcs/http/https.
For L4 proxy, it can be one of tcp/tls/udp. For specific protocols, it can be
kafka.",
"enum": [
"grpc",
"grpcs",
"http",
"https",
+ "kafka",
"tcp",
"tls",
"udp"
@@ -2460,7 +2516,7 @@
"type": "integer"
},
"upstream_host": {
- "pattern":
"^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
}
},
@@ -2552,7 +2608,7 @@
"type":
"object"
},
"host": {
-
"pattern": "^\\*?[0-9a-zA-Z-._]+$",
+
"pattern": "^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type":
"string"
},
"http_path": {
@@ -2881,7 +2937,7 @@
"items": {
"properties": {
"host":
{
-
"pattern": "^\\*?[0-9a-zA-Z-._]+$",
+
"pattern": "^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"metadata": {
@@ -2935,12 +2991,13 @@
},
"scheme": {
"default": "http",
- "description": "The scheme of the
upstream. For L7 proxy, it can be one of grpc/grpcs/http/https. For L4 proxy,
it can be one of tcp/tls/udp.",
+ "description": "The scheme of the
upstream. For L7 proxy, it can be one of grpc/grpcs/http/https. For L4 proxy,
it can be one of tcp/tls/udp. For specific protocols, it can be kafka.",
"enum": [
"grpc",
"grpcs",
"http",
"https",
+ "kafka",
"tcp",
"tls",
"udp"
@@ -3000,7 +3057,7 @@
"type": "integer"
},
"upstream_host": {
- "pattern": "^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
}
},
@@ -3021,11 +3078,30 @@
"schema": {
"$comment": "this is a mark for our injected
plugin schema",
"properties": {
+ "break_response_body": {
+ "type": "string"
+ },
"break_response_code": {
"maximum": 599,
"minimum": 200,
"type": "integer"
},
+ "break_response_headers": {
+ "items": {
+ "properties": {
+ "key": {
+
"minLength": 1,
+ "type":
"string"
+ },
+ "value": {
+
"minLength": 1,
+ "type":
"string"
+ }
+ },
+ "type": "object"
+ },
+ "type": "array"
+ },
"disable": {
"type": "boolean"
},
@@ -3159,6 +3235,39 @@
},
"version": 0.1
},
+ "authz-casdoor": {
+ "priority": 2559,
+ "schema": {
+ "$comment": "this is a mark for our injected
plugin schema",
+ "properties": {
+ "callback_url": {
+ "pattern": "^[^%?]+[^/]$",
+ "type": "string"
+ },
+ "client_id": {
+ "type": "string"
+ },
+ "client_secret": {
+ "type": "string"
+ },
+ "disable": {
+ "type": "boolean"
+ },
+ "endpoint_addr": {
+ "pattern": "^[^%?]+[^/]$",
+ "type": "string"
+ }
+ },
+ "required": [
+ "callback_url",
+ "client_id",
+ "client_secret",
+ "endpoint_addr"
+ ],
+ "type": "object"
+ },
+ "version": 0.1
+ },
"authz-keycloak": {
"priority": 2000,
"schema": {
@@ -3303,6 +3412,11 @@
"default": false,
"type": "boolean"
},
+
"password_grant_token_generation_incoming_uri": {
+ "maxLength": 4096,
+ "minLength": 1,
+ "type": "string"
+ },
"permissions": {
"default": {},
"items": {
@@ -3702,6 +3816,7 @@
"OPTIONS",
"PATCH",
"POST",
+
"PURGE",
"PUT",
"TRACE"
],
@@ -4088,7 +4203,7 @@
},
"host": {
"1": {
- "pattern":
"^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"description": "Deprecated, use
`tcp.host` instead."
@@ -4157,7 +4272,7 @@
"tcp": {
"properties": {
"host": {
- "pattern":
"^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"port": {
@@ -4295,6 +4410,44 @@
},
"version": 0.1
},
+ "ext-plugin-post-resp": {
+ "priority": -4000,
+ "schema": {
+ "$comment": "this is a mark for our injected
plugin schema",
+ "properties": {
+ "allow_degradation": {
+ "default": false,
+ "type": "boolean"
+ },
+ "conf": {
+ "items": {
+ "properties": {
+ "name": {
+
"maxLength": 128,
+
"minLength": 1,
+ "type":
"string"
+ },
+ "value": {
+ "type":
"string"
+ }
+ },
+ "required": [
+ "name",
+ "value"
+ ],
+ "type": "object"
+ },
+ "minItems": 1,
+ "type": "array"
+ },
+ "disable": {
+ "type": "boolean"
+ }
+ },
+ "type": "object"
+ },
+ "version": 0.1
+ },
"ext-plugin-pre-req": {
"priority": 12000,
"schema": {
@@ -4469,6 +4622,15 @@
},
"type": "array"
},
+ "request_method": {
+ "default": "GET",
+ "description": "the method for
client to request the authorization service",
+ "enum": [
+ "GET",
+ "POST"
+ ],
+ "type": "string"
+ },
"ssl_verify": {
"default": true,
"type": "boolean"
@@ -5328,6 +5490,10 @@
"default": "apikey",
"type": "string"
},
+ "hide_credentials": {
+ "default": false,
+ "type": "boolean"
+ },
"query": {
"default": "apikey",
"type": "string"
@@ -6458,6 +6624,10 @@
"disable": {
"type": "boolean"
},
+ "recursive": {
+ "default": false,
+ "type": "boolean"
+ },
"source": {
"minLength": 1,
"type": "string"
@@ -6578,7 +6748,7 @@
"properties": {
"blacklist": {
"items": {
- "pattern":
"^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"minItems": 1,
@@ -6599,7 +6769,7 @@
},
"whitelist": {
"items": {
- "pattern":
"^\\*?[0-9a-zA-Z-._]+$",
+ "pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"minItems": 1,
@@ -6618,6 +6788,7 @@
"algorithm": {
"default": "uuid",
"enum": [
+ "nanoid",
"snowflake",
"uuid"
],
@@ -6686,7 +6857,22 @@
"priority": 899,
"schema": {
"$comment": "this is a mark for our injected
plugin schema",
- "minProperties": 1,
+ "dependencies": {
+ "filters": {
+ "not": {
+ "required": [
+ "body"
+ ]
+ }
+ },
+ "body": {
+ "not": {
+ "required": [
+ "filters"
+ ]
+ }
+ }
+ },
"properties": {
"body": {
"description": "new body for
response",
@@ -6700,6 +6886,44 @@
"disable": {
"type": "boolean"
},
+ "filters": {
+ "description": "a group of
filters that modify response bodyby replacing one specified string by another",
+ "items": {
+ "description": "filter
that modifies response body",
+ "properties": {
+ "options": {
+
"default": "jo",
+
"description": "regex options",
+ "type":
"string"
+ },
+ "regex": {
+
"description": "match pattern on response body",
+
"minLength": 1,
+ "type":
"string"
+ },
+ "replace": {
+
"description": "regex substitution content",
+ "type":
"string"
+ },
+ "scope": {
+
"default": "once",
+
"description": "regex substitution range",
+ "enum":
[
+
"global",
+
"once"
+ ],
+ "type":
"string"
+ }
+ },
+ "required": [
+ "regex",
+ "replace"
+ ],
+ "type": "object"
+ },
+ "minItems": 1,
+ "type": "array"
+ },
"headers": {
"description": "new headers for
response",
"minProperties": 1,
@@ -7222,7 +7446,7 @@
"type": "integer"
},
"name": {
- "default": "sys logger",
+ "default": "http sys logger",
"type": "string"
},
"pool_size": {
@@ -7251,7 +7475,7 @@
"type": "string"
},
"timeout": {
- "default": 3,
+ "default": 3000,
"minimum": 1,
"type": "integer"
},
@@ -7436,7 +7660,7 @@
"type": "object"
},
"host": {
-
"pattern":
"^\\*?[0-9a-zA-Z-._]+$",
+
"pattern":
"^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
},
"http_path": {
@@ -7765,7 +7989,7 @@
"items": {
"properties": {
"host": {
-
"pattern": "^\\*?[0-9a-zA-Z-._]+$",
+
"pattern": "^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type":
"string"
},
"metadata": {
@@ -7819,12 +8043,13 @@
},
"scheme": {
"default": "http",
-
"description": "The scheme of the upstream. For
L7 proxy, it can be one of grpc/grpcs/http/https. For L4 proxy, it can be one
of tcp/tls/udp.",
+
"description": "The scheme of the upstream. For
L7 proxy, it can be one of grpc/grpcs/http/https. For L4 proxy, it can be one
of tcp/tls/udp. For specific protocols, it can be kafka.",
"enum": [
"grpc",
"grpcs",
"http",
"https",
+
"kafka",
"tcp",
"tls",
"udp"
@@ -7884,7 +8109,7 @@
"type": "integer"
},
"upstream_host": {
-
"pattern": "^\\*?[0-9a-zA-Z-._]+$",
+
"pattern": "^\\*?[0-9a-zA-Z-._\\[\\]:]+$",
"type": "string"
}
},
@@ -8320,6 +8545,102 @@
"type": "object"
},
"version": 0.1
+ },
+ "syslog": {
+ "metadata_schema": {
+ "properties": {
+ "log_format": {
+ "default": {
+ "@timestamp":
"$time_iso8601",
+ "client_ip":
"$remote_addr",
+ "host": "$host"
+ },
+ "type": "object"
+ }
+ },
+ "type": "object"
+ },
+ "priority": 401,
+ "schema": {
+ "$comment": "this is a mark for our injected
plugin schema",
+ "properties": {
+ "batch_max_size": {
+ "default": 1000,
+ "minimum": 1,
+ "type": "integer"
+ },
+ "buffer_duration": {
+ "default": 60,
+ "minimum": 1,
+ "type": "integer"
+ },
+ "disable": {
+ "type": "boolean"
+ },
+ "drop_limit": {
+ "default": 1048576,
+ "type": "integer"
+ },
+ "flush_limit": {
+ "default": 4096,
+ "minimum": 1,
+ "type": "integer"
+ },
+ "host": {
+ "type": "string"
+ },
+ "inactive_timeout": {
+ "default": 5,
+ "minimum": 1,
+ "type": "integer"
+ },
+ "max_retry_count": {
+ "default": 0,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "name": {
+ "default": "stream sys logger",
+ "type": "string"
+ },
+ "pool_size": {
+ "default": 5,
+ "minimum": 5,
+ "type": "integer"
+ },
+ "port": {
+ "type": "integer"
+ },
+ "retry_delay": {
+ "default": 1,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "sock_type": {
+ "default": "tcp",
+ "enum": [
+ "tcp",
+ "udp"
+ ],
+ "type": "string"
+ },
+ "timeout": {
+ "default": 3000,
+ "minimum": 1,
+ "type": "integer"
+ },
+ "tls": {
+ "default": false,
+ "type": "boolean"
+ }
+ },
+ "required": [
+ "host",
+ "port"
+ ],
+ "type": "object"
+ },
+ "version": 0.1
}
}
}
diff --git a/web/cypress/fixtures/plugin-dataset.json
b/web/cypress/fixtures/plugin-dataset.json
index f56bb37e..12a27622 100644
--- a/web/cypress/fixtures/plugin-dataset.json
+++ b/web/cypress/fixtures/plugin-dataset.json
@@ -67,6 +67,11 @@
"shouldValid": true,
"data": {
"break_response_code": 502,
+ "break_response_body": "{\"message\":\"breaker opened.\"}",
+ "break_response_headers": [
+ { "key": "Content-Type", "value": "application/json" },
+ { "key": "Content-Type", "value": "application/json+v1" }
+ ],
"unhealthy": {
"http_statuses": [500],
"failures": 1
diff --git
a/web/cypress/integration/consumer/create-consumer-with-api-breaker-plugin-form.spec.js
b/web/cypress/integration/consumer/create-consumer-with-api-breaker-plugin-form.spec.js
index a5f2c095..9cbba4fb 100644
---
a/web/cypress/integration/consumer/create-consumer-with-api-breaker-plugin-form.spec.js
+++
b/web/cypress/integration/consumer/create-consumer-with-api-breaker-plugin-form.spec.js
@@ -19,6 +19,9 @@
context('Create and delete consumer with api-breaker plugin form', () => {
const selector = {
break_response_code: '#break_response_code',
+ break_response_body: '#break_response_body',
+ break_response_headers_0_key: '#break_response_headers_0_key',
+ break_response_headers_0_value: '#break_response_headers_0_value',
empty: '.ant-empty-normal',
username: '#username',
description: '#desc',
@@ -31,6 +34,9 @@ context('Create and delete consumer with api-breaker plugin
form', () => {
const data = {
break_response_code: 200,
+ break_response_body: 'breaker opened',
+ break_response_headers_0_key: 'Content-Type',
+ break_response_headers_0_value: 'application/json',
consumerName: 'test_consumer',
description: 'desc_by_autotest',
createConsumerSuccess: 'Create Consumer Successfully',
@@ -82,8 +88,13 @@ context('Create and delete consumer with api-breaker plugin
form', () => {
});
});
cy.get(selector.notification).should('contain', 'Invalid plugin data');
-
+ cy.contains('.ant-form-item', 'break_response_headers').within(() => {
+ cy.contains('button', 'Create').click();
+ });
cy.get(selector.break_response_code).type(data.break_response_code);
+ cy.get(selector.break_response_body).type(data.break_response_body);
+
cy.get(selector.break_response_headers_0_key).type(data.break_response_headers_0_key);
+
cy.get(selector.break_response_headers_0_value).type(data.break_response_headers_0_value);
cy.get(selector.disabledSwitcher).click();
cy.get(selector.drawer).within(() => {
cy.contains('Submit').click({
diff --git a/web/src/components/Plugin/UI/api-breaker.tsx
b/web/src/components/Plugin/UI/api-breaker.tsx
index e2f97aae..a319e096 100644
--- a/web/src/components/Plugin/UI/api-breaker.tsx
+++ b/web/src/components/Plugin/UI/api-breaker.tsx
@@ -16,7 +16,7 @@
*/
import React from 'react';
import type { FormInstance } from 'antd/es/form';
-import { Button, Form, InputNumber } from 'antd';
+import { Button, Col, Form, Input, InputNumber, Row } from 'antd';
import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons';
import { useIntl } from 'umi';
@@ -30,7 +30,7 @@ const FORM_ITEM_LAYOUT = {
span: 7,
},
wrapperCol: {
- span: 7,
+ span: 12,
},
};
@@ -41,17 +41,20 @@ const FORM_ITEM_WITHOUT_LABEL = {
};
const ApiBreaker: React.FC<Props> = ({ form, schema }) => {
- const { formatMessage } = useIntl()
- const propertires = schema?.properties
- const un_http_statuses = propertires.unhealthy.properties.http_statuses
- const un_http_default = un_http_statuses.default
- const { http_statuses } = propertires.healthy.properties
- const http_default = http_statuses.default
+ const { formatMessage } = useIntl();
+ const propertires = schema?.properties;
+ const un_http_statuses = propertires.unhealthy.properties.http_statuses;
+ const un_http_default = un_http_statuses.default;
+ const { http_statuses } = propertires.healthy.properties;
+ const http_default = http_statuses.default;
return (
<Form
form={form}
{...FORM_ITEM_LAYOUT}
- initialValues={{ unhealthy: { http_statuses: un_http_default }, healthy:
{ http_statuses: http_default } }}
+ initialValues={{
+ unhealthy: { http_statuses: un_http_default },
+ healthy: { http_statuses: http_default },
+ }}
>
<Form.Item
label="break_response_code"
@@ -67,9 +70,80 @@ const ApiBreaker: React.FC<Props> = ({ form, schema }) => {
})}
validateTrigger={['onChange', 'onBlur', 'onClick']}
>
- <InputNumber min={propertires.break_response_code.minimum}
max={propertires.break_response_code.maximum} required />
+ <InputNumber
+ min={propertires.break_response_code.minimum}
+ max={propertires.break_response_code.maximum}
+ required
+ />
</Form.Item>
+ <Form.Item
+ label="break_response_body"
+ name="break_response_body"
+ rules={[
+ {
+ message: `${formatMessage({ id: 'component.global.pleaseEnter' })}
break_response_code`,
+ },
+ ]}
+ tooltip={formatMessage({
+ id: 'component.pluginForm.api-breaker.break_response_body.tooltip',
+ })}
+ validateTrigger={['onChange', 'onBlur', 'onClick']}
+ >
+ <Input />
+ </Form.Item>
+
+ <Form.List name="break_response_headers">
+ {(fields, { add, remove }) => {
+ return (
+ <div>
+ <Form.Item label="break_response_headers">
+ {fields.map((field, index) => (
+ <Row gutter={12} key={index} style={{ marginBottom: 10 }}>
+ <Col span={10}>
+ <Form.Item
+ {...field}
+ name={[field.name, 'key']}
+ fieldKey={[field.fieldKey, 'key']}
+ noStyle
+ >
+ <Input />
+ </Form.Item>
+ </Col>
+ <Col span={10}>
+ <Form.Item
+ {...field}
+ name={[field.name, 'value']}
+ fieldKey={[field.fieldKey, 'value']}
+ noStyle
+ >
+ <Input />
+ </Form.Item>
+ </Col>
+ <Col>
+ <MinusCircleOutlined
+ className="dynamic-delete-button"
+ onClick={() => {
+ remove(field.name);
+ }}
+ />
+ </Col>
+ </Row>
+ ))}
+ <Button
+ type="dashed"
+ onClick={() => {
+ add();
+ }}
+ >
+ <PlusOutlined /> {formatMessage({ id:
'component.global.create' })}
+ </Button>
+ </Form.Item>
+ </div>
+ );
+ }}
+ </Form.List>
+
<Form.Item
label="max_breaker_sec"
name="max_breaker_sec"
@@ -92,12 +166,11 @@ const ApiBreaker: React.FC<Props> = ({ form, schema }) => {
})}
key={field.key}
>
- <Form.Item
- {...field}
- validateTrigger={['onChange', 'onBlur']}
- noStyle
- >
- <InputNumber min={un_http_statuses.items.minimum}
max={un_http_statuses.items.maximum} />
+ <Form.Item {...field} validateTrigger={['onChange',
'onBlur']} noStyle>
+ <InputNumber
+ min={un_http_statuses.items.minimum}
+ max={un_http_statuses.items.maximum}
+ />
</Form.Item>
{fields.length > 1 ? (
<MinusCircleOutlined
@@ -131,7 +204,9 @@ const ApiBreaker: React.FC<Props> = ({ form, schema }) => {
label="unhealthy.failures"
name={['unhealthy', 'failures']}
initialValue={propertires.unhealthy.properties.failures.default}
- tooltip={formatMessage({ id:
'component.pluginForm.api-breaker.unhealthy.failures.tooltip' })}
+ tooltip={formatMessage({
+ id: 'component.pluginForm.api-breaker.unhealthy.failures.tooltip',
+ })}
>
<InputNumber min={propertires.unhealthy.properties.failures.minimum} />
</Form.Item>
@@ -149,12 +224,11 @@ const ApiBreaker: React.FC<Props> = ({ form, schema }) =>
{
id:
'component.pluginForm.api-breaker.healthy.http_statuses.tooltip',
})}
>
- <Form.Item
- {...field}
- validateTrigger={['onChange', 'onBlur']}
- noStyle
- >
- <InputNumber min={http_statuses.items.minimum}
max={http_statuses.items.maximum} />
+ <Form.Item {...field} validateTrigger={['onChange',
'onBlur']} noStyle>
+ <InputNumber
+ min={http_statuses.items.minimum}
+ max={http_statuses.items.maximum}
+ />
</Form.Item>
{fields.length > 1 ? (
<MinusCircleOutlined
@@ -188,7 +262,9 @@ const ApiBreaker: React.FC<Props> = ({ form, schema }) => {
label="healthy.successes"
name={['healthy', 'successes']}
initialValue={propertires.healthy.properties.successes.default}
- tooltip={formatMessage({ id:
'component.pluginForm.api-breaker.healthy.successes.tooltip' })}
+ tooltip={formatMessage({
+ id: 'component.pluginForm.api-breaker.healthy.successes.tooltip',
+ })}
>
<InputNumber min={propertires.healthy.properties.successes.minimum} />
</Form.Item>
diff --git a/web/src/components/Plugin/locales/en-US.ts
b/web/src/components/Plugin/locales/en-US.ts
index b7d6a705..14470918 100644
--- a/web/src/components/Plugin/locales/en-US.ts
+++ b/web/src/components/Plugin/locales/en-US.ts
@@ -65,6 +65,10 @@ export default {
// api-breaker
'component.pluginForm.api-breaker.break_response_code.tooltip':
'Return error code when unhealthy.',
+ 'component.pluginForm.api-breaker.break_response_body.tooltip':
+ 'Return body of the response message when upstream is unhealthy.',
+ 'component.pluginForm.api-breaker.break_response_headers.tooltip':
+ 'Return headers when unhealthy.',
'component.pluginForm.api-breaker.max_breaker_sec.tooltip': 'Maximum breaker
time(seconds).',
'component.pluginForm.api-breaker.unhealthy.http_statuses.tooltip':
'Status codes when unhealthy.',
diff --git a/web/src/components/Plugin/locales/tr-TR.ts
b/web/src/components/Plugin/locales/tr-TR.ts
index 86953a2a..64a925dd 100644
--- a/web/src/components/Plugin/locales/tr-TR.ts
+++ b/web/src/components/Plugin/locales/tr-TR.ts
@@ -15,7 +15,8 @@
* limitations under the License.
*/
export default {
- 'component.plugin.tip1': 'NOT:Eklentilerinizi değiştirdikten sonra
değişiklileri schema.json dosyasına uygulamalısınız.',
+ 'component.plugin.tip1':
+ 'NOT:Eklentilerinizi değiştirdikten sonra değişiklileri schema.json
dosyasına uygulamalısınız.',
'component.plugin.tip2': 'Nasıl güncellenir?',
'component.select.pluginTemplate': 'Eklenti şablonlarını seçin',
'component.step.select.pluginTemplate.select.option': 'Özel',
@@ -39,117 +40,124 @@ export default {
'component.pluginForm.cors.allow_headers.tooltip':
'Kaynaklar arası kaynağa erişirken istekte hangi başlıkların ayarlanmasına
izin verilir. Bölmek için çoklu değer kullanımı. allow_credential false
olduğunda, tüm istek üstbilgilerine izin ver belirtmek için *
kullanabilirsiniz. Ayrıca, ** kullanarak herhangi bir üstbilgiye zorla izin
verebilirsiniz, hatta allow_credentialı hali hazırda etkinleştirdiyseniz bu
bazı güvenlik riskleri getirecektir,',
'component.pluginForm.cors.expose_headers.tooltip':
- 'Başlangıçlar arası kaynağa erişildiğinde yanıt olarak hangi başlıkların
ayarlanmasına izin verilir. Bölmek için çoklu değer kullanımı. allow_credential
false olduğunda, herhangi bir başlığa izin ver belirtmek için *
kullanabilirsiniz. Ayrıca, ** kullanarak herhangi bir üstbilgiye zorla izin
verebilirsiniz, hatta allow_credentialı zaten etkinleştirin, ancak bu bazı
güvenlik riskleri getirecektir.',
+ 'Başlangıçlar arası kaynağa erişildiğinde yanıt olarak hangi başlıkların
ayarlanmasına izin verilir. Bölmek için çoklu değer kullanımı. allow_credential
false olduğunda, herhangi bir başlığa izin ver belirtmek için *
kullanabilirsiniz. Ayrıca, ** kullanarak herhangi bir üstbilgiye zorla izin
verebilirsiniz, hatta allow_credentialı zaten etkinleştirin, ancak bu bazı
güvenlik riskleri getirecektir.',
'component.pluginForm.cors.max_age.tooltip':
- 'Sonuçların önbelleğe alınabileceği maksimum saniye sayısı. Bu zaman
aralığında tarayıcı son kontrol sonucunu yeniden kullanır. -1 önbellek yok
demektir. Lütfen maksimum değerin tarayıcıya bağlı olduğunu unutmayın,
ayrıntılar için lütfen MDNye bakınız.',
+ 'Sonuçların önbelleğe alınabileceği maksimum saniye sayısı. Bu zaman
aralığında tarayıcı son kontrol sonucunu yeniden kullanır. -1 önbellek yok
demektir. Lütfen maksimum değerin tarayıcıya bağlı olduğunu unutmayın,
ayrıntılar için lütfen MDNye bakınız.',
'component.pluginForm.cors.allow_credential.tooltip':
- "Bu seçeneği true olarak ayarlarsanız, diğer seçenekler için '*' ı
kullanamazsınız.",
+ "Bu seçeneği true olarak ayarlarsanız, diğer seçenekler için '*' ı
kullanamazsınız.",
'component.pluginForm.cors.allow_origins_by_metadata.tooltip':
- 'Eklenti meta verilerindeki allow_origins kümesine başvurarak CORSu
etkinleştirmek için hangi Origine izin verildiğini eşleştirin.',
+ 'Eklenti meta verilerindeki allow_origins kümesine başvurarak CORSu
etkinleştirmek için hangi Origine izin verildiğini eşleştirin.',
'component.pluginForm.cors.allow_origins_by_regex.tooltip':
- 'CORSu etkinleştirmek için hangi Origine izin verildiğini eşleştirmek için
normal ifade ifadeleri kullanın, örneğin, [".*.test.com"], test.comun tüm alt
alan adlarını eşleştirmek için kullanabilir.',
+ 'CORSu etkinleştirmek için hangi Origine izin verildiğini eşleştirmek için
normal ifade ifadeleri kullanın, örneğin, [".*.test.com"], test.comun tüm alt
alan adlarını eşleştirmek için kullanabilir.',
// referer-restriction
'component.pluginForm.referer-restriction.whitelist.tooltip':
- 'Whiteliste alınacak ana bilgisayar adı listesi. Ana bilgisayar adı, joker
karakter olarak * ile başlatılabilir.',
+ 'Whiteliste alınacak ana bilgisayar adı listesi. Ana bilgisayar adı, joker
karakter olarak * ile başlatılabilir.',
'component.pluginForm.referer-restriction.blacklist.tooltip':
-'Kara listeye alınacak ana bilgisayar adı listesi. Ana bilgisayar adı, joker
karakter olarak * ile başlatılabilir.',
+ 'Kara listeye alınacak ana bilgisayar adı listesi. Ana bilgisayar adı,
joker karakter olarak * ile başlatılabilir.',
'component.pluginForm.referer-restriction.listEmpty.tooltip': 'Boş Liste',
'component.pluginForm.referer-restriction.bypass_missing.tooltip':
- 'Yönlendiren başlığı eksik veya hatalı biçimlendirilmiş olduğunda kontrolün
atlanıp atlanmayacağı.',
+ 'Yönlendiren başlığı eksik veya hatalı biçimlendirilmiş olduğunda
kontrolün atlanıp atlanmayacağı.',
'component.pluginForm.referer-restriction.message.tooltip':
- 'Erişime izin verilmemesi durumunda mesaj döndürülür',
+ 'Erişime izin verilmemesi durumunda mesaj döndürülür',
// api-breaker
'component.pluginForm.api-breaker.break_response_code.tooltip':
- 'Unhealthy durum oluştuğunda hata kodunu döndür.',
+ 'Unhealthy durum oluştuğunda hata kodunu döndür.',
+ 'component.pluginForm.api-breaker.break_response_body.tooltip':
+ 'Sağlıksız bir durum oluştuğunda telegramları döndürür.',
+ 'component.pluginForm.api-breaker.break_response_headers.tooltip':
+ 'Sağlıksız olduğunda başlıkları döndürün.',
'component.pluginForm.api-breaker.max_breaker_sec.tooltip': 'Kesme
Zamanı(Saniye)',
'component.pluginForm.api-breaker.unhealthy.http_statuses.tooltip':
'Durum Kodları (Unhealthy durumda).',
'component.pluginForm.api-breaker.unhealthy.failures.tooltip':
- 'Unhealthy bir durumu tetikleyen ardışık hata isteklerinin sayısı.',
- 'component.pluginForm.api-breaker.healthy.http_statuses.tooltip': 'Durum
Kodları (Unhealthy durumda)',
+ 'Unhealthy bir durumu tetikleyen ardışık hata isteklerinin sayısı.',
+ 'component.pluginForm.api-breaker.healthy.http_statuses.tooltip':
+ 'Durum Kodları (Unhealthy durumda)',
'component.pluginForm.api-breaker.healthy.successes.tooltip':
- 'Healthy durumu tetikleyen ardışık normal isteklerin sayısı.',
+ 'Healthy durumu tetikleyen ardışık normal isteklerin sayısı.',
// proxy-mirror
'component.pluginForm.proxy-mirror.host.tooltip':
- 'Bir mirror servis adresi belirtin, ör. http://127.0.0.1:9797 (adresin şema
içermesi gerekir: URI kısmı değil, http veya https)',
+ 'Bir mirror servis adresi belirtin, ör. http://127.0.0.1:9797 (adresin
şema içermesi gerekir: URI kısmı değil, http veya https)',
'component.pluginForm.proxy-mirror.host.extra': 'örn. http://127.0.0.1:9797',
'component.pluginForm.proxy-mirror.host.ruletip':
'Adres şema içermelidir http veya https, URI parçası olmamalı',
'component.pluginForm.proxy-mirror.path.tooltip':
- "Yansıtma isteğinin yol bölümünü belirtin. O olmazsa mevcut yol
kullanılacaktır.",
+ 'Yansıtma isteğinin yol bölümünü belirtin. O olmazsa mevcut yol
kullanılacaktır.',
'component.pluginForm.proxy-mirror.path.ruletip': 'Lütfen doğru yolu girin,
ör. /path',
'component.pluginForm.proxy-mirror.sample_ratio.tooltip':
- 'isteklerin mirror edileceği örnek oranı.',
+ 'isteklerin mirror edileceği örnek oranı.',
// limit-conn
'component.pluginForm.limit-conn.conn.tooltip':
- 'izin verilen maksimum eşzamanlı istek sayısı. Bu oranı aşan (ve bağlantı +
çoğuşmanın altındaki) istekler bu eşiğe uyacak şekilde ertelenir (gecikme
saniyeleri default_conn_delay tarafından yapılandırılır).',
+ 'izin verilen maksimum eşzamanlı istek sayısı. Bu oranı aşan (ve bağlantı
+ çoğuşmanın altındaki) istekler bu eşiğe uyacak şekilde ertelenir (gecikme
saniyeleri default_conn_delay tarafından yapılandırılır).',
'component.pluginForm.limit-conn.burst.tooltip':
- 'Gecikmesine izin verilen aşırı eşzamanlı isteklerin (veya bağlantıların)
sayısı.',
+ 'Gecikmesine izin verilen aşırı eşzamanlı isteklerin (veya bağlantıların)
sayısı.',
'component.pluginForm.limit-conn.default_conn_delay.tooltip':
- 'eşzamanlı istekler bağlantıyı aştığında ancak altında (conn + burst)
olduğunda isteğin gecikme saniyeleri.',
+ 'eşzamanlı istekler bağlantıyı aştığında ancak altında (conn + burst)
olduğunda isteğin gecikme saniyeleri.',
'component.pluginForm.limit-conn.key_type.tooltip':
'Anahtar tipinin destekledikleri; "var" (single var) ve "var_combination"
(combine var)',
'component.pluginForm.limit-conn.key.tooltip':
'Eşzamanlılık seviyesini sınırlamak için kullanılır. Örneğin ana
bilgisayar adı başına eşzamanlılığı sınırlamamız için ana bilgisayar adı (veya
sunucu bölgesi) anahtar olarak kullanılabilir Aksi takdirde tek bir istemcinin
hizmetimizi çok fazla bağlantı veya istekle doldurmasını önlemek için istemci
adresini anahtar olarak da kullanabiliriz.',
'component.pluginForm.limit-conn.rejected_code.tooltip':
- 'istek (conn + burst) aştığında döndürülen reddedilecektir.',
+ 'istek (conn + burst) aştığında döndürülen reddedilecektir.',
'component.pluginForm.limit-conn.rejected_msg.tooltip':
- 'istek (conn + burst) aştığında döndürülen yanıt gövdesi reddedilecektir.',
+ 'istek (conn + burst) aştığında döndürülen yanıt gövdesi reddedilecektir.',
'component.pluginForm.limit-conn.only_use_default_delay.tooltip':
- 'gecikme saniyelerinin katı modunu etkinleştirin. Bu seçeneği true olarak
ayarlarsanız, ek hesaplama mantığı olmadan kesinlikle belirlediğiniz gecikme
saniyelerine göre çalışır.',
+ 'gecikme saniyelerinin katı modunu etkinleştirin. Bu seçeneği true olarak
ayarlarsanız, ek hesaplama mantığı olmadan kesinlikle belirlediğiniz gecikme
saniyelerine göre çalışır.',
'component.pluginForm.limit-conn.allow_degradation.tooltip':
- 'Limit-bağlantı işlevi geçici olarak kullanılamadığında eklenti bozulmasını
etkinleştirip etkinleştirmeme. Değer true, varsayılan false olarak
ayarlandığında isteklerin devam etmesine izin verir.',
+ 'Limit-bağlantı işlevi geçici olarak kullanılamadığında eklenti
bozulmasını etkinleştirip etkinleştirmeme. Değer true, varsayılan false olarak
ayarlandığında isteklerin devam etmesine izin verir.',
// limit-req
'component.pluginForm.limit-req.rate.tooltip':
- 'Belirtilen istek oranı (saniyedeki sayı) eşiği. Bu oranı aşan (ve
patlamanın altındaki) istekler, orana uymak için gecikecektir.',
+ 'Belirtilen istek oranı (saniyedeki sayı) eşiği. Bu oranı aşan (ve
patlamanın altındaki) istekler, orana uymak için gecikecektir.',
'component.pluginForm.limit-req.burst.tooltip':
- 'Saniyedeki aşırı istek sayısının ertelenmesine izin verildi. Bu katı sınırı
aşan istekler hemen reddedilecektir.',
+ 'Saniyedeki aşırı istek sayısının ertelenmesine izin verildi. Bu katı
sınırı aşan istekler hemen reddedilecektir.',
'component.pluginForm.limit-req.key_type.tooltip':
- 'Anahtar tipinin destekledikleri; "var" (single var) ve "var_combination"
(combine var)',
- 'component.pluginForm.limit-req.key.tooltip': 'Hızı sınırlamak için
kullanıcı tarafından belirlenen anahtar.',
+ 'Anahtar tipinin destekledikleri; "var" (single var) ve "var_combination"
(combine var)',
+ 'component.pluginForm.limit-req.key.tooltip':
+ 'Hızı sınırlamak için kullanıcı tarafından belirlenen anahtar.',
'component.pluginForm.limit-req.rejected_code.tooltip':
- 'Talep eşiği aştığında döndürülen HTTP durum kodu reddedilir.',
+ 'Talep eşiği aştığında döndürülen HTTP durum kodu reddedilir.',
'component.pluginForm.limit-req.rejected_msg.tooltip':
- 'Talep eşiği aştığında döndürülen yanıt body reddedilir.',
+ 'Talep eşiği aştığında döndürülen yanıt body reddedilir.',
'component.pluginForm.limit-req.nodelay.tooltip':
- 'Gecikme bayrağı doğru değilse, engellenen istekler ertelenmez',
+ 'Gecikme bayrağı doğru değilse, engellenen istekler ertelenmez',
'component.plugin.form': 'Eklenti Formu',
'component.plugin.format-codes.disable': 'JSON veya YAML formatı',
'component.plugin.editor': 'Eklenti Düzenleyici',
- 'component.plugin.noConfigurationRequired': "Eklenti için yapılandırma
gerekli değil",
+ 'component.plugin.noConfigurationRequired': 'Eklenti için yapılandırma
gerekli değil',
// limit-count
'component.pluginForm.limit-count.count.tooltip': 'Belirtilen sayıda istek
eşiği.',
'component.pluginForm.limit-count.time_window.tooltip':
- 'İstek sayısı sıfırlanmadan önceki saniye cinsinden zaman penceresi.',
+ 'İstek sayısı sıfırlanmadan önceki saniye cinsinden zaman penceresi.',
'component.pluginForm.limit-count.key_type.tooltip':
- 'Anahtar tipinin destekledikleri; "var" (single var) ve "var_combination"
(combine var)',
- 'component.pluginForm.limit-count.key.tooltip': 'Sayıyı sınırlamak için
kullanıcı tarafından belirlenen anahtar.',
+ 'Anahtar tipinin destekledikleri; "var" (single var) ve "var_combination"
(combine var)',
+ 'component.pluginForm.limit-count.key.tooltip':
+ 'Sayıyı sınırlamak için kullanıcı tarafından belirlenen anahtar.',
'component.pluginForm.limit-count.rejected_code.tooltip':
- 'Talep eşiği aştığında döndürülen HTTP durum kodu reddedilir, varsayılan kod
503dür.',
+ 'Talep eşiği aştığında döndürülen HTTP durum kodu reddedilir, varsayılan
kod 503dür.',
'component.pluginForm.limit-count.rejected_msg.tooltip':
- 'Talep eşiği aştığında döndürülen yanıt gövdesi reddedilir.',
+ 'Talep eşiği aştığında döndürülen yanıt gövdesi reddedilir.',
'component.pluginForm.limit-count.policy.tooltip':
- 'Sınırları almak ve artırmak için kullanılacak hız sınırlayıcı politikalar.
Kullanılabilir değerler yereldir (sayaçlar düğümdeki bellekte yerel olarak
depolanır) ve redis (sayaçlar bir Redis sunucusunda depolanır ve düğümler
arasında paylaşılır, genellikle bunu küresel hız sınırını yapmak için kullanır)
ve yeniden kümeleme (redis ile aynı işlev, yalnızca Redis küme desenini
kullanın).',
+ 'Sınırları almak ve artırmak için kullanılacak hız sınırlayıcı
politikalar. Kullanılabilir değerler yereldir (sayaçlar düğümdeki bellekte
yerel olarak depolanır) ve redis (sayaçlar bir Redis sunucusunda depolanır ve
düğümler arasında paylaşılır, genellikle bunu küresel hız sınırını yapmak için
kullanır) ve yeniden kümeleme (redis ile aynı işlev, yalnızca Redis küme
desenini kullanın).',
'component.pluginForm.limit-count.allow_degradation.tooltip':
- 'Limit-count işlevi geçici olarak kullanılamadığında eklenti bozulmasının
etkinleştirilip etkinleştirilmediği (ör. redis zaman aşımı). Değer true olarak
ayarlandığında isteklerin devam etmesine izin verir',
+ 'Limit-count işlevi geçici olarak kullanılamadığında eklenti bozulmasının
etkinleştirilip etkinleştirilmediği (ör. redis zaman aşımı). Değer true olarak
ayarlandığında isteklerin devam etmesine izin verir',
'component.pluginForm.limit-count.show_limit_quota_header.tooltip':
- 'Yanıt başlığında X-RateLimit-Limit ve X-RateLimit-Remaining (yani toplam
istek sayısı ve gönderilebilecek kalan istek sayısı anlamına gelir)',
+ 'Yanıt başlığında X-RateLimit-Limit ve X-RateLimit-Remaining (yani toplam
istek sayısı ve gönderilebilecek kalan istek sayısı anlamına gelir)',
'component.pluginForm.limit-count.group.tooltip':
- 'Aynı grupla yapılandırılan rota aynı sayacı paylaşacaktır',
+ 'Aynı grupla yapılandırılan rota aynı sayacı paylaşacaktır',
'component.pluginForm.limit-count.redis_host.tooltip':
- 'Redis ilkesini kullanırken, bu özellik Redis sunucusunun adresini
belirtir.',
+ 'Redis ilkesini kullanırken, bu özellik Redis sunucusunun adresini
belirtir.',
'component.pluginForm.limit-count.redis_port.tooltip':
- 'Redis ilkesini kullanırken, bu özellik Redis sunucusunun bağlantı noktasını
belirtir.',
+ 'Redis ilkesini kullanırken, bu özellik Redis sunucusunun bağlantı
noktasını belirtir.',
'component.pluginForm.limit-count.redis_password.tooltip':
- 'Redis ilkesini kullanırken, bu özellik Redis sunucusunun parolasını
belirtir.',
+ 'Redis ilkesini kullanırken, bu özellik Redis sunucusunun parolasını
belirtir.',
'component.pluginForm.limit-count.redis_database.tooltip':
- 'Redis ilkesini kullanırken, bu özellik, Redis sunucusundan seçtiğiniz
veritabanını ve yalnızca Redis olmayan küme modu (tek örnek modu veya tek giriş
sağlayan Redis genel bulut hizmeti) için belirtir.',
+ 'Redis ilkesini kullanırken, bu özellik, Redis sunucusundan seçtiğiniz
veritabanını ve yalnızca Redis olmayan küme modu (tek örnek modu veya tek giriş
sağlayan Redis genel bulut hizmeti) için belirtir.',
'component.pluginForm.limit-count.redis_timeout.tooltip':
- 'Redis ilkesini kullanırken, bu özellik Redis sunucusuna gönderilen herhangi
bir komutun zaman aşımını milisaniye cinsinden belirtir.',
+ 'Redis ilkesini kullanırken, bu özellik Redis sunucusuna gönderilen
herhangi bir komutun zaman aşımını milisaniye cinsinden belirtir.',
'component.pluginForm.limit-count.redis_cluster_nodes.tooltip':
- 'Redis-cluster ilkesi kullanılırken bu özellik, Redis küme hizmeti
düğümlerinin (en az iki düğüm) adreslerinin bir listesidir.',
+ 'Redis-cluster ilkesi kullanılırken bu özellik, Redis küme hizmeti
düğümlerinin (en az iki düğüm) adreslerinin bir listesidir.',
'component.pluginForm.limit-count.redis_cluster_name.tooltip':
- 'Redis-cluster ilkesi kullanılırken, bu özellik Redis küme hizmeti
düğümlerinin adıdır.',
+ 'Redis-cluster ilkesi kullanılırken, bu özellik Redis küme hizmeti
düğümlerinin adıdır.',
'component.pluginForm.limit-count.atLeast2Characters.rule': 'Please enter at
least 2 characters',
};
diff --git a/web/src/components/Plugin/locales/zh-CN.ts
b/web/src/components/Plugin/locales/zh-CN.ts
index 6368d166..07b677dd 100644
--- a/web/src/components/Plugin/locales/zh-CN.ts
+++ b/web/src/components/Plugin/locales/zh-CN.ts
@@ -62,6 +62,8 @@ export default {
// api-breaker
'component.pluginForm.api-breaker.break_response_code.tooltip': '不健康返回错误码。',
+ 'component.pluginForm.api-breaker.break_response_body.tooltip': '不健康返回报文',
+ 'component.pluginForm.api-breaker.break_response_headers.tooltip':
'不健康返回报文头',
'component.pluginForm.api-breaker.max_breaker_sec.tooltip': '最大熔断持续时间。',
'component.pluginForm.api-breaker.unhealthy.http_statuses.tooltip':
'不健康时候的状态码。',
'component.pluginForm.api-breaker.unhealthy.failures.tooltip':