This is an automated email from the ASF dual-hosted git repository.
Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new 91c39aad5c fix(ai): precompile regex patterns in request and response
transformers (#7136)
91c39aad5c is described below
commit 91c39aad5ccff9adbd90f41a7628ac0a7d9edff7
Author: hengyuss <[email protected]>
AuthorDate: Mon Oct 12 22:49:09 2026 +0800
fix(ai): precompile regex patterns in request and response transformers
(#7136)
---
.../ai/transformer/request/AiRequestTransformerPlugin.java | 14 ++++++++------
.../transformer/response/AiResponseTransformerPlugin.java | 5 ++++-
2 files changed, 12 insertions(+), 7 deletions(-)
diff --git
a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/request/AiRequestTransformerPlugin.java
b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/request/AiRequestTransformerPlugin.java
index 1c3dfaa6d8..198c2db3c9 100644
---
a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/request/AiRequestTransformerPlugin.java
+++
b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/request/AiRequestTransformerPlugin.java
@@ -58,6 +58,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -68,16 +69,18 @@ public class AiRequestTransformerPlugin extends
AbstractShenyuPlugin {
private static final Logger LOG =
LoggerFactory.getLogger(AiRequestTransformerPlugin.class);
+ private static final Pattern REQUEST_LINE_PATTERN =
Pattern.compile("^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD)\\s.*\\sHTTP/1.1$");
+
/**
* Valid characters of a generated origin-form path component.
*/
- private static final String PATH_PATTERN = "^/[a-zA-Z0-9/_\\-]*$";
+ private static final Pattern REQUEST_PATH_PATTERN =
Pattern.compile("^/[a-zA-Z0-9/_\\-]*$");
/**
* Valid characters of a generated query component: RFC 3986 query syntax
(percent-encoded
* sequences must be well formed so that the target is always a legal URI
reference).
*/
- private static final String QUERY_PATTERN =
"^(%[0-9a-fA-F]{2}|[a-zA-Z0-9\\-._~!$&'()*+,;=:@/?])*$";
+ private static final Pattern QUERY_PATTERN =
Pattern.compile("^(%[0-9a-fA-F]{2}|[a-zA-Z0-9\\-._~!$&'()*+,;=:@/?])*$");
private final List<HttpMessageReader<?>> messageReaders;
@@ -267,12 +270,12 @@ public class AiRequestTransformerPlugin extends
AbstractShenyuPlugin {
return Mono.just(exchange);
}
- if (!newPath.matches(PATH_PATTERN)) {
+ if (!REQUEST_PATH_PATTERN.matcher(newPath).matches()) {
LOG.warn("Extracted path contains invalid characters: {}, Will
continue to use the original path.", newPath);
return Mono.just(exchange);
}
- if (Objects.nonNull(newQuery) && !newQuery.matches(QUERY_PATTERN)) {
+ if (Objects.nonNull(newQuery) &&
!QUERY_PATTERN.matcher(newQuery).matches()) {
LOG.warn("Extracted query contains invalid characters: {}, Will
continue to use the original path.", newQuery);
return Mono.just(exchange);
}
@@ -320,7 +323,7 @@ public class AiRequestTransformerPlugin extends
AbstractShenyuPlugin {
boolean headerSectionStarted = false;
while (Objects.nonNull(line = reader.readLine())) {
if (!headerSectionStarted) {
- if (line.startsWith("HTTP/1.1") ||
line.matches("^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD)\\s.*\\sHTTP/1.1$")) {
+ if (line.startsWith("HTTP/1.1") ||
REQUEST_LINE_PATTERN.matcher(line).matches()) {
headerSectionStarted = true;
continue;
}
@@ -374,4 +377,3 @@ public class AiRequestTransformerPlugin extends
AbstractShenyuPlugin {
}
}
-
diff --git
a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/response/AiResponseTransformerPlugin.java
b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/response/AiResponseTransformerPlugin.java
index 71ccc28e6a..48d79f853f 100644
---
a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/response/AiResponseTransformerPlugin.java
+++
b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/response/AiResponseTransformerPlugin.java
@@ -58,6 +58,7 @@ import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.GZIPInputStream;
@@ -74,6 +75,8 @@ public class AiResponseTransformerPlugin extends
AbstractShenyuPlugin {
private static final Logger LOG =
LoggerFactory.getLogger(AiResponseTransformerPlugin.class);
+ private static final Pattern REQUEST_LINE_PATTERN =
Pattern.compile("^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD)\\s.*\\sHTTP/1.1$");
+
private static final ObjectMapper MAPPER = new ObjectMapper();
private final List<HttpMessageReader<?>> messageReaders;
@@ -263,7 +266,7 @@ public class AiResponseTransformerPlugin extends
AbstractShenyuPlugin {
boolean headerSectionStarted = false;
while (Objects.nonNull(line = reader.readLine())) {
if (!headerSectionStarted) {
- if (line.startsWith("HTTP/1.1") ||
line.matches("^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD)\\s.*\\sHTTP/1.1$")) {
+ if (line.startsWith("HTTP/1.1") ||
REQUEST_LINE_PATTERN.matcher(line).matches()) {
headerSectionStarted = true;
continue;
}